Redis-sscan(或扫描)操作的终止条件



我使用的Redis具有集合结构,分别通过SADD、SREM插入和删除。在某个时间点,我需要迭代集合中的所有元素并处理它们,最后从集合中删除每个元素。为了迭代所有元素,我使用了SSCAN。在文件中,他们说如下

命令还允许返回零个元素,只要返回的游标不为零,客户端就不应认为迭代完成

为了迭代集合中的所有元素,我将光标从零开始。然后,我处理了从SSCAN返回的每个元素,并使用SREM操作从集合中删除每个元素。我在下一次迭代中使用了从SSCAN操作的上一个结果返回的光标。这个过程一直持续到SSAN返回的游标为零并且返回的数组中没有元素为止。在迭代过程中,不会向集合中添加任何新元素。然而,在完成该过程之后,集合中仍然存在一些元素。在我看来,这套应该是空的。怎么了?我应该检查集合中是否有元素吗?例如,通过使用SCARD?

这是我做的手术,

SADD key element
SADD key element
..
..
result = SSCAN key 0 Count 100
while elements and next_cursor != 0:
for e in elements
process e
SREM key
SSCAN key next_cursor Count 100
// process the last result returned with zero value cursor
for e in elements
process e
SREM key

此过程继续进行,直到SSAN返回的游标为零,并且返回的数组中没有元素为止

这是不正确的。您应该只检查返回的游标是否为0。

cursor = 0
while true:
cursor = SSCAN key cursor count 100
process_elements
if cursor == 0:
break

最新更新