Redis эффективно создает ключи

Я пытаюсь сохранить некоторые данные в Redis.

Рассмотрим следующий пример.

У человека разные автомобили в разные годы.

В настоящее время я храню такие ключи -

cars:johndoe:1991:mercedes model s1 engine v1
cars:johndoe:1992:mercedes model s1 engine v1
cars:jane:1992:BMW model s2 engine v2
cars:foobar:1991:honda model s3 engine v3

Преимущество этого в том, что я могу использовать подстановочный знак с ключом для получения разных данных. например

1. all cars bought in 1991
keys cars:*:1991:*

2. all cars owned by johndoe
keys cars:johndoe:*

и т.п.

Но согласно документации Redis, команда keys с подстановочным знаком неэффективна, так как она ищет все ключи.
Поэтому я решил использовать наборы для этих данных. Но для достижения тех же результатов, что и выше, мне нужно много разных наборов типов, например

1. sadd cars cars:johndoe:1991:mercedes cars:johndoe:1992:mercedes cars:jane:1992:BMW cars:foobar:1991:honda
2. sadd cars:johndoe cars:johndoe:1991:mercedes cars:johndoe:1992:mercedes
3. sadd cars:jane cars:jane:1992:BMW 
4. sadd cars:foobar cars:foobar:1991:honda
5. sadd cars:1991 cars cars:johndoe:1991:mercedes  cars:foobar:1991:honda

Таким образом, мне нужно добавить и удалить много ключей для одной операции.

Это единственный способ? Пожалуйста, дайте мне знать, есть ли более эффективное решение для этой проблемы.

Заранее спасибо.


person irc    schedule 19.07.2016    source источник
comment
Для таких операций я бы использовал MongoDB.   -  person Bhushan    schedule 19.07.2016
comment
@BhushanPatil спасибо за комментарий. Но я также ищу хороший кэш с менее мощной машиной.   -  person irc    schedule 19.07.2016


Ответы (2)


В первом способе вместо ключей можно использовать SCAN.

Вы можете написать простой сценарий lua или даже в логике своего приложения вы можете выполнить итерацию команды сканирования с точкой курсора и получить все ключи, соответствующие заданному шаблону.

IMO, если у вас есть много критериев, которые нужно решить, тогда 1-й вариант будет лучшим вариантом.

  1. Вы можете избежать попадания в несколько саддов
  2. Получить на основе любых условий

Если у вас меньше критериев, лучше всего подойдет 2-й вариант.

  1. Нет необходимости повторять команду сканирования, у вас будут готовые ключи для поиска.

Надеюсь это поможет.

person Karthikeyan Gopall    schedule 19.07.2016
comment
Использую скрученный, не уверен, как пойдет, обязательно попробую. Проголосовал за ваш ответ, но он может не отображаться из-за моей низкой репутации. Спасибо за информацию. - person irc; 19.07.2016

Это действительно единственные два подхода — не только для Redis, но и для любой базы данных. Это классический компромисс между пространством и временем: либо платить оперативной памятью (т. е. хранить несколько индексов [наборов]), чтобы ускорить поиск, либо использовать ЦП (т. е. выполнять специальное сканирование).

Философия Redis заключается в использовании пространства, поскольку наша цель — максимизировать производительность. Это означает, что вы хотите хранить свои данные так, как они вам понадобятся. Поскольку в вашем случае вы заинтересованы в чтении данных с использованием разных измерений, вам необходимо соответствующим образом индексировать каждое из этих измерений. Наборы Redis — хороший выбор для этого типа индекса, за исключением данных «сделать год», которые могли бы выиграть от индексации в отсортированном наборе для облегчения поиска по диапазонам (в течение многих лет, но только при необходимости).

person Itamar Haber    schedule 19.07.2016
comment
Спасибо за ответ. - person irc; 19.07.2016