Redis扫描是否将扫描开始扫描操作后插入的数据?

时间:2019-08-05 11:58:29

标签: redis redis-cluster elastic-cache

我正在使用redis扫描来遍历redis数据库中的密钥。这是我正在使用的代码

#example :1

start_cursor=0

r=redis.StrictRedis(host='localhost',port=6379)
cur, keys = r.scan(cursor=start_cursor, match='*', count=3)
records=len(keys)
values=[]
values.extend(i for i in keys)
print cur,records,values


while cur != 0:
        cur, keys = r.scan(cursor=cur, match='*', count=3)
        records+=len(keys)
        data = r.mget(keys=keys)
        values.extend(i for i in keys)
        print cur, len(keys),values

print "Total records scanned :{}".format(records)

我的数据库具有(键,值)(1,1)(2,2)(3,3)(4,4)(5,5)格式的以下值

当我使用

扫描记录时

start_cursor=0

我得到以下记录

scan #=>Cursor,new records,all records

scan  #1 =>5,3,['1', '2', '5']
scan  #2 =>0,2,['1', '2', '5', '3', '4']
Total Records scanned :5

当我从扫描#1的光标编号开始扫描时说(5)。在示例1中,我从扫描#2获取了记录

Example : 2
start_cursor=5
scan #=>Cursor,new records,all records

scan  #1 =>0 2 ['3', '4']
Total Records scanned :2

到目前为止一切都很好。当我再插入四个新数据时,说(6,6)(7,7)(8,8)(9,9),然后使用相同的start_cursor = 5扫描数据例如:2 我缺少一些数据,说这里缺少(6)。

Example : 3
start_cursor=5
scan #=>Cursor,new records,all records

scan  #1 =>3 3 ['3', '4', '9']
scan  #1 =>0 2 ['3', '4', '9', '7', '8']
Total Records scanned :5

Redis扫描是否将扫描在扫描操作开始后插入的数据?如果没有,还有其他方法可以实现吗?

提前谢谢!

1 个答案:

答案 0 :(得分:1)

来自doc

  

在整个迭代过程中不经常出现的元素可能会返回,也可能不会返回:它是未定义的。

由于数据是在扫描操作开始后插入的,因此这些数据为不稳定的当前状态。因此SCAN不能保证返回新插入的数据。

  

如果没有,还有其他方法可以实现吗?

AFAIK,没有其他方法可以实现。