Chaves de ignorar a escala Redis

Estou usando predis (com laravel se faz alguma diferença) o cliente php para trabalhar com a Redis.

Eu preciso buscar todas as chaves da Redis que combinam com determinado prefixo e eu faço isso assim:

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

Depois que o trabalho com essas teclas é feito, a operação se repete – Estou recebendo essas chaves novamente novamente em um loop. Notei que depois de algumas iterações, algumas chaves não estão incluídas na matriz de $ $.

O mais estranho é que as chaves que desaparecem nunca aparecem nas próximas iterações. Reiniciar o processo php (é um daemon) corrige o problema.

Estou usando o Redis 3.0.2 com Predis 1.0 e PHP 5.4

PS Dentro do loop over keys, eu mudo valores para alguns deles. Não estou excluindo nenhuma chave, no entanto.

De fato! Isso ocorre porque SCAN funciona assim, citando a documentação da Redis:

No entanto, enquanto os comandos de bloqueio como SMEMBERS são capazes de fornecer todos os elementos que fazem parte de um Conjunto em um determinado momento, a família de comandos SCAN oferece apenas garantias limitadas sobre os elementos retornados, uma vez que a coleta que iteracionalmente pode alterar durante o processo de iteração .

No entanto, como SCAN tem muito pouco estado associado (apenas o cursor), ele tem as seguintes desvantagens: Um elemento dado pode ser retornado várias vezes. Cabe ao aplicativo tratar o caso de elementos duplicados , por exemplo, apenas usando os elementos retornados para executar operações que são seguras quando reaplicadas várias vezes.

Então, você pode querer usar usar o array_unique ($ keys) após o foreach .

Para entender por que a iteração funciona assim, o melhor é ler esta parte da documentação da Redis .