Vskutku! To proto, že SCAN funguje tímto způsobem, cituji z dokumentace Redis:
Zatímco blokovací příkazy jako SMEMBERS jsou schopny poskytnout všechny prvky, které jsou součástí sady v daném okamžiku, Rodina příkazů SCAN nabízí pouze omezené záruky o vrácených prvcích, protože kolekce, kterou postupně iterujeme, se může během procesu iterace změnit.
Protože však SCAN má velmi málo přidruženého stavu (pouze kurzor), má následující nevýhody:Daný prvek může být vrácen vícekrát. Je na aplikaci, jak si poradí s případem duplicitních prvků , například pouze pomocí vrácených prvků za účelem provádění operací, které jsou bezpečné při opakovaném opakovaném použití.
Možná budete chtít použít chtít použít array_unique($keys) po foreach
.
Abyste pochopili, proč iterace funguje tímto způsobem, nejlepší je přečíst si tuto část dokumentace Redis .