REDIS: Как использовать лексикографический указатель для сохранения диапазонов данных

Исходная информация

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

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

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

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

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

  • выполнить запрос с помощью ключа 12345 и получить в db значение 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) и получить "ddd" обратно. но это не работает

РЕДАКТИРОВАТЬ 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]>

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

0 ответов

Другие вопросы по тегам