Наистина! Това е, защото SCAN работи по този начин, цитирайки от документацията на Redis:
Въпреки това, докато блокиращите команди като SMEMBERS са в състояние да предоставят всички елементи, които са част от набор в даден момент, Семейството команди SCAN предлага само ограничени гаранции относно върнатите елементи, тъй като колекцията, която итерираме постепенно, може да се промени по време на процеса на итерация.
Въпреки това, тъй като SCAN има много малко свързано състояние (само курсора), то има следните недостатъци:Даден елемент може да бъде върнат няколко пъти. Приложението трябва да се справи със случая на дублирани елементи , например използвайки само върнатите елементи, за да изпълнявате операции, които са безопасни, когато се прилагат многократно.
Така че може да искате да използвате искате да използвате array_unique($keys) след foreach
.
За да разберете защо итерацията работи по този начин, най-доброто нещо е да прочетете тази част от документацията на Redis .