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