в чем средняя разница между драгоценными камнями пространства имен Nest и redis, когда мы используем redis с rails/ruby

Существует две популярные жемчужины для добавления пространства имен в Redis: redis-namespace и Nest, если я действительно понимаю, что нам нужно пространство имен, когда мы используем один и тот же экземпляр сервера Redis с разными проектами. , если я прав, это означает: если у меня есть проект-1 и проект-2, и каждый из этих проектов использует мое локальное хранилище Redis, то, возможно, у двух проектов есть ключ users, который представляет пользователей мое приложение, поэтому для предотвращения конфликта мне нужно пространство имен users key с чем-то вроде имени проекта:

для проекта-1:

project-1:users

для проекта-1

project-2:users

если мое понимание выше верно, мы можем использовать redis-namespace gem, чтобы решить это следующим образом:

r = Redis::Namespace.new(:project-1, :redis => @r)
r['users']['joe']['email'] = '[email protected]'

а для второго проекта (проект-2) просто нужно изменить проект-1 на проект-2 при создании экземпляра нового Redis::Namespace :

 r = Redis::Namespace.new(:project-2, :redis => @r)
 r['users']['joe']['email'] = '[email protected]'

пожалуйста, скажите мне, не ошибаюсь ли я во всем вышеприведенном объяснении!

теперь мы можем продолжить работу с Nest:

из документации у нас есть этот пример:

Nest помогает вам генерировать ключи, предоставляя цепные пространства имен, которые уже подключены к Redis:

>> event = Nest.new("event")
>> event[3][:attendees].sadd("Albert")
>> event[3][:attendees].smembers
=> ["Albert"]

но здесь я не уверен, поможет ли Nest сделать то же самое, что и redis-namespace, или поможет нам просто сгенерировать ключи с возможностью цепочки ???

в чем именно разница между redis-namespace и Nest?


person medBouzid    schedule 01.09.2013    source источник


Ответы (2)


Отказ от ответственности: я автор Nest.

Вы можете сделать то же самое с обеими библиотеками, и я думаю, что основным отличием этих инструментов является их внутренняя сложность. В то время как Nest помогает вам представлять структуру только с помощью плоских ключей, Redis::Namespace имеет таблицу перевода для каждой команды, и поэтому она более хрупкая и интенсивно использует ЦП.

Взгляните на исходный код обоих инструментов, чтобы понять, что я имею в виду:

https://github.com/soveran/nest/blob/master/lib/nest.rb

https://github.com/resque/redis-namespace/blob/master/lib/redis/namespace.rb

Тем не менее, правильным решением проблемы, которую вы описали, является наличие отдельных экземпляров Redis для разных проектов. Учтите, что пространство ключей — это только один аспект, который необходимо учитывать (который также можно легко решить с помощью различных БД, предоставляемых Redis). Другие аспекты (стратегия персистентности, ограничения на подключение и память, вытеснение ключей и т. д.) обычно точно настраиваются в зависимости от характера проекта.

Еще одним важным фактом является то, что Redis является однопоточным, и многие приложения используют его, и вы должны использовать одно и то же ядро ​​​​для всех запросов. Имея это в виду, наличие разных экземпляров Redis помогает вам распараллелить работу.

person soveran    schedule 02.09.2013
comment
Привет, соверан, спасибо за объяснение, я очень быстро просмотрел исходный код, если я понимаю, что redis-namespace делает много тестовых (случайных) переключений таблицы COMMANDS, я также вижу, что его исходный код больше, что означает много обработки, чтобы я мог понять, что Nest более эффективен, у меня есть примечание: я считаю, что пояснений о том, как использовать Nest, недостаточно, нам также нужно знать более подробную информацию о его преимуществах и почему его следует использовать, я долго гуглил но я не нашел простого учебника, объясняющего эти моменты - person medBouzid; 02.09.2013
comment
у меня есть вопрос: я смотрел это видео youtube.com/watch?v=dH6VYRMRQFw его автор объясняет Redis с помощью rails, и он использует Nest lib, в 10:27 он показывает нам, что он расширяет Nest для использования key.to_param вместо key.to_s в методе инициализации, в чем здесь разница? - person medBouzid; 02.09.2013

Вы знаете http://redis.io/commands/select для параллельного запуска нескольких баз данных на одном сервере. ? Здесь у вас нет конфликта ключей, и базы данных разделены. Только при доступе к ключам сразу из всех баз это невозможно.

person themue    schedule 01.09.2013