LPOS
LPOS
LPOS key element [RANK rank] [COUNT num-matches] [MAXLEN len]
- Доступно с версии:
- 6.0.6
- Сложность по времени:
- O(N), где N — количество элементов в списке, в среднем случае. При поиске элементов, близких к началу или концу списка, или при использовании опции MAXLEN, команда может выполняться за постоянное время.
- Категории ACL:
-
@read,@list,@slow,
Команда возвращает индекс совпадающих элементов внутри списка Redis. По умолчанию, при отсутствии опций, она просматривает список от начала к концу, ища первое совпадение с "элементом". Если элемент найден, возвращается его индекс (нулевая позиция в списке). В противном случае, если совпадений нет, возвращается nil.
> RPUSH mylist a b c 1 2 3 c c > LPOS mylist c 2
Дополнительные аргументы и опции могут изменить поведение команды. Опция RANK указывает "ранг" первого возвращаемого элемента, в случае нескольких совпадений. Ранг 1 означает возврат первого совпадения, 2 — второго и т.д.
Например, в приведённом выше примере элемент "c" встречается несколько раз. Если мне нужен индекс второго совпадения, я напишу:
> LPOS mylist c RANK 2 6
То есть, второе вхождение "c" находится на позиции 6. Отрицательный "ранг" как аргумент RANK указывает команде LPOS инвертировать направление поиска, начиная с конца списка.
Итак, мы хотим получить первый элемент, начиная с конца списка:
> LPOS mylist c RANK -1 7
Обратите внимание, что индексы всё ещё сообщаются естественным образом, то есть, учитывая первый элемент в начале списка с индексом 0, следующий элемент с индексом 1 и так далее. Это означает, что возвращаемые индексы стабильны, независимо от того, является ли ранг положительным или отрицательным.
Иногда мы хотим вернуть не только N-ый совпадающий элемент, но и позиции всех первых N совпадающих элементов. Это можно сделать, используя опцию COUNT.
> LPOS mylist c COUNT 2 [2,6]
Мы можем комбинировать COUNT и RANK, чтобы COUNT пыталась вернуть до указанного количества совпадений, но начиная с N-го совпадения, как указано опцией RANK.
> LPOS mylist c RANK -1 COUNT 2 [7,6]
Когда используется COUNT, можно указать 0 как количество совпадений, чтобы сказать команде, что мы хотим вернуть все найденные совпадения в виде массива индексов. Это лучше, чем задавать очень большое значение опции COUNT, потому что это более общий подход.
> LPOS mylist c COUNT 0 [2,6,7]
Если используется COUNT, и совпадений не найдено, возвращается пустой массив. Однако, если COUNT не используется, и совпадений нет, команда возвращает nil.
Наконец, опция MAXLEN указывает команде сравнивать предоставленный элемент только с заданным максимальным количеством элементов списка. Например, указание MAXLEN 1000 гарантирует, что команда выполнит только 1000 сравнений, фактически выполнив алгоритм на подмножестве списка (первая или последняя часть, в зависимости от того, используем ли мы положительный или отрицательный ранг). Это полезно для ограничения максимальной сложности команды. Это также полезно, когда мы ожидаем найти совпадение очень рано, но хотим быть уверены, что в случае его отсутствия, команда не будет выполняться слишком долго.
При использовании MAXLEN, можно указать 0 как максимальное количество сравнений, чтобы сказать команде, что мы хотим неограниченное количество сравнений. Это лучше, чем задавать очень большое значение опции MAXLEN, потому что это более универсально.
Возврат
Команда возвращает целое число, представляющее совпадающий элемент, или nil, если совпадений нет. Однако, если задана опция COUNT, команда возвращает массив (пустой, если совпадений нет).
Примеры
RPUSH mylist a b c d 1 2 3 4 3 3 3 LPOS mylist 3 LPOS mylist 3 COUNT 0 RANK 2
© 2006–2022 Salvatore Sanfilippo
Licensed under the Creative Commons Attribution-ShareAlike License 4.0.
https://redis.io/commands/lpos/