#ruby-on-rails #redis
#ruby-on-rails #redis
Вопрос:
На моем сервере есть куча приложений rails, которые должны иметь возможность использовать Redis в качестве механизма кэширования.
Должен ли я запускать один экземпляр Redis для каждого моего приложения или Redis поддерживает определение области видимости?
Я беспокоюсь, что если я удалю одно значение в одном приложении, значение с тем же ключом будет удалено для всех моих приложений.
Я, например, не хочу, чтобы это произошло.
Приложение 1
Rails.cache.write("key", "value")
Приложение 2
Rails.cache.read("key") => "value"
Приложение 3
Rails.cache.delete("key")
Приложение 1
Rails.cache.read("key") => nil
Комментарии:
1. Как насчет префикса ваших поисковых запросов с именем вашего приложения или что-то в этом роде?
Ответ №1:
Я предлагаю запустить сервер для каждого приложения. Каждый дополнительный экземпляр Redis использует только на 1 мегабайт больше памяти, когда он пуст, поэтому накладные расходы невелики, и можно запускать десятки серверов в одном экземпляре. Также бездействующий сервер Redis будет использовать минимальный объем памяти.
Таким образом, в основном, запуская несколько серверов, вы не тратите ресурсы впустую, а вместо этого набираете скорость, поскольку вы будете использовать все свои процессоры или ядра процессора, учитывая, что Redis является однопоточным.
Ответ №2:
Общий метод для этого — одна из двух вещей:
- Префикс ваших ключей с каким-то идентификатором типа, например
app1:key
,app2:key
. - Используйте отдельные базы данных для каждого использования
SELECT
. По умолчанию соединения начинаются с DB 0. Если вы делаетеSELECT 1
это для app1,SELECT 2
для app2 и т. Д., Вам гарантируется, что никакое другое приложение не будет удалять эти данные.
Комментарии:
1. На самом деле, (один из) разработчиков Redis недавно посоветовал мне не использовать отдельные базы данных, поскольку это больше для обратной совместимости, и нет причин, по которым вы не должны запускать несколько экземпляров.
Ответ №3:
Решением было использовать redis-store с параметром пространства имен.
Вот мой config/production.rb
файл.
# App 1
config.cache_store = :redis_store, {path: "/tmp/redis.sock", db:1, namespace: "app1"}
# App 2
config.cache_store = :redis_store, {path: "/tmp/redis.sock", db:2, namespace: "app2"}
Комментарии:
1. Но почему бы не запустить несколько экземпляров? Теперь приложение 1 заблокируется, если приложение 2 обращается к Redis…