Infatti! Questo perché SCAN funziona in questo modo, citando dalla documentazione Redis:
Tuttavia, mentre i comandi di blocco come SMEMBERS sono in grado di fornire tutti gli elementi che fanno parte di un Set in un dato momento, La famiglia di comandi SCAN offre solo garanzie limitate sugli elementi restituiti poiché la raccolta che iteriamo in modo incrementale può cambiare durante il processo di iterazione.
Tuttavia, poiché SCAN ha pochissimo stato associato (solo il cursore) presenta i seguenti inconvenienti:Un determinato elemento può essere restituito più volte. Spetta all'applicazione gestire il caso di elementi duplicati , ad esempio utilizzando solo gli elementi restituiti per eseguire operazioni sicure se riapplicate più volte.
Quindi potresti voler usare want to use array_unique($keys) dopo il foreach
.
Per capire perché l'iterazione funziona in questo modo la cosa migliore è leggere questa parte della documentazione Redis .