Redis сканирование пропуская ключи

Я использую predis (с laravel, если это имеет какое-то значение) php клиент для работы с Redis.

Мне нужно получить все ключи от Redis, которые соответствуют определенному префиксу, и я делаю это так:

$keys = [];
foreach (new Iterator\Keyspace($this->redis(), Cache::KEY_PREFIX.'*') as $key) {
$keys[] = $rate_key;
}

После того, как работа с этими ключами завершена, операция повторяется — я снова включаю эти ключи в цикл.
Я заметил, что после нескольких итераций некоторые ключи не включаются в массив $ keys.

Самое странное, что исчезающие ключи никогда не появляются в следующих итерациях. Перезапуск процесса php (это демон) решает проблему.

Я использую Redis 3.0.2 с Predis 1.0 и PHP 5.4

Постскриптум В цикле по ключам я изменяю значения для некоторых из них. Однако я не удаляю ключи.

2

Решение

В самом деле! Это потому, что SCAN работает таким образом, цитируя документацию Redis:

Однако, в то время как блокирующие команды, такие как SMEMBERS, могут предоставить все элементы, которые являются частью набора в данный момент, Семейство команд SCAN предлагает только ограниченные гарантии о возвращаемых элементах, поскольку коллекция, которую мы инкрементно перебираем, может измениться в процессе перебора.

Однако, поскольку SCAN имеет очень мало связанных состояний (только курсор), он имеет следующие недостатки:
Данный элемент может быть возвращен несколько раз. Дело за приложением, чтобы обработать случай дублированных элементов, например, только используя возвращенные элементы для выполнения операций, которые безопасны при повторном применении несколько раз.

Так что вы можете использовать хотите использовать array_unique ($ ключи) после foreach,

Чтобы понять, почему итерация работает таким образом, лучше всего прочитать эта часть документации Redis.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]