REDIS: Как использовать лексикографический указатель для сохранения диапазонов данных - PullRequest
0 голосов
/ 03 октября 2018

Справочная информация

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

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

Чтобы лучше объяснить проблему, я нарисую хеш-код, подобный следующему:

'northam' hash
key       value
=====================
12345     abc
default   ddd
2000[0-10]  bbb

Используя вышеупомянутую конструкцию хранилища, Мне нужно иметь возможность:

  • для запроса с использованием ключа 12345 и иметь db return abc, потому что он нашел точное совпадение.
  • Если я запрашиваю с использованием ключа '33333', тогда япросто хочу вернуть значение DDD, связанное с ключом «по умолчанию», так как у меня нет ключа / значения для 33333.
  • Если я запрашиваю, используя ключ '2000' или '2004', я хочу найти егозначение bbb.

Вопрос

В REDIS можно ликак-нибудь создать ключ типа '2000 [0-10]'?
Есть ли лучший способ сделать это?Я знаю, что могу программно расширить 2000 [0-10] и сохранить каждое значение в виде отдельной записи в таблице.Но если пользователь обновит этот диапазон и изменит его на 2000 [15-21], тогда очистка будет немного грязной.

Что я уже пробовал

Я играл с отсортированными сетами?Я не совсем понимаю, как они работают.Но до сих пор я пробовал что-то вроде этого:

127.0.0.1:6379[1]> zadd northam 2000 ddd 2002 ddd
(integer) 1
127.0.0.1:6379[1]>

И теперь я пытаюсь выяснить, могу ли я запросить 2000 (или любое другое значение в диапазоне 2000-2010) и получить"ДДД" назад.но это не работает

РЕДАКТИРОВАТЬ 1

Итак, после прочтения немного об индексировании / вторичных индексах, это структура данных прототипа, с которой я играл:

127.0.0.1:6379[3]> zadd northamerica 0 2000:2010:1234512345
(integer) 1
127.0.0.1:6379[3]> zadd northamerica 0 2011:2014:00000000000
(integer) 1

Первая запись, я пытаюсь сказать, что начальный номер в моем диапазоне - 2000, а конечный номер - 2010. Для любых чисел, попадающих в этот диапазон, используйте значение 1234512345 Но теперь мне нужно знать, каквыполнить запрос.Так, например, если пользователь запрашивает, какое значение использовать для ключа «2009», я не знаю, как выполнить запрос к этой структуре, чтобы найти, что он должен использовать 1234512345

РЕДАКТИРОВАТЬ 2

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

127.0.0.1:6379[3]> zrange northamerica 0 -1
1) "2000:2010:12312312345"
2) "2011:2014:00000000000"
3) "2015:2015:11111111111"
127.0.0.1:6379[3]>

Приложение может запрашивать все записи для Северной Америки, а затем, когда оно возвращает указанный выше список, оно может разделить (на массивы) каждую запись с помощью ":", чтобы определить, какие диапазоны существуют,

...