Несовместимые результаты поиска в лексикографическом диапазоне Redis

Я пытаюсь выполнить поиск по лексикографическому диапазону в отсортированном наборе Redis, но получаю противоречивые результаты на основе моих понимание того, как работает эта функция. Результаты аналогичны при использовании ZRANGECOUNT, ZRANGEBYLEX и ZREMRANGEBYLEX.

Рабочие запросы

Это пример моего набора из 3 элементов, использующих только ZRANGE.

redis> ZRANGE myset 0 -1 
0  00000000022xm26hax001
1  00000000022xm26hax002
2  00000000022xm26hax003

Я также могу получить все элементы лексикографически.

redis> ZRANGEBYLEX myset - +
0  00000000022xm26hax001
1  00000000022xm26hax002
2  00000000022xm26hax003

Выполнение поиска по диапазону, опуская последние 3 символа, также работает, как и ожидалось.

redis> ZRANGEBYLEX myset [00000000022xm26hax [00000000022xm26hax\xff
0  00000000022xm26hax001
1  00000000022xm26hax002
2  00000000022xm26hax003

Регулируя аргументы диапазона, я также могу выбрать только первые два элемента.

redis> ZRANGEBYLEX myset [00000000022xm26hax001 [00000000022xm26hax002\xff
0  00000000022xm26hax001
1  00000000022xm26hax002

Короткий старт кажется приемлемым:

redis> ZRANGEBYLEX myset [00000000022x [00000000022xm26hax001\xff
0  00000000022xm26hax001

Проблемные запросы

Однако я сталкиваюсь с проблемами, когда пытаюсь выбрать более короткую версию строки - все они возвращают результаты 0, хотя я ожидал, что они вернут 3.

ZRANGEBYLEX myset [00000000022xm26h [00000000022xm26h\xff
ZRANGEBYLEX myset [00000000022x [00000000022x\xff

Но затем добавление обратно только «m» заставляет снова вернуть все три элемента.

redis> ZRANGEBYLEX myset [00000000022xm [00000000022xm\xff
0  00000000022xm26hax001
1  00000000022xm26hax002
2  00000000022xm26hax003

Может кто-нибудь объяснить такое поведение? Каков правильный способ вернуть все элементы, начинающиеся с "00000000022x", учитывая мой пример набора данных?

Почему ZRANGEBYLEX myset [00000000022x [00000000022x\xff не возвращает никаких результатов, а ZRANGEBYLEX myset [00000000022xm [00000000022xm\xff возвращает все результаты - кажется, что просто добавление «m» заставляет его работать так, как ожидалось?


person doublesharp    schedule 11.10.2017    source источник


Ответы (2)


Если вы хотите, чтобы Redis разрешал escape-коды в ваших строках (например, \xff в ваших примерах), вам нужно заключить строки в кавычки.

Другими словами, это будет обрабатывать \xff как байт 255:

127.0.0.1:6379> ZRANGEBYLEX myset [00000000022xm26hax001 "[00000000022xm26ha\xff"
1) "00000000022xm26hax001"
2) "00000000022xm26hax002"
3) "00000000022xm26hax003"

Принимая во внимание, что это обрабатывает \xff как четыре байта (92, 120, 102, 102):

127.0.0.1:6379> ZRANGEBYLEX myset [00000000022xm26hax001 [00000000022xm26ha\xff
(empty list or set)

Это объясняет ваши запутанные результаты.

person Łukasz Langa    schedule 12.10.2017

Решение этого в конечном итоге не может быть определено вопросом, который я разместил. Для ясности я не учел оценку каждой записи отсортированного набора, которая должна была быть отметкой времени истечения срока действия. К сожалению, документация для ZRANGEBYLEX говорит:

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

Мои записи не имели одинакового балла, поэтому они не сортировались лексикографически.

person doublesharp    schedule 21.10.2017