Один сервер Redis на приложение Rails?

#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…