1. 引子
如何从海量key里查询出某一固定前缀的key?
答:不能直接用: keys key1*
这个命令,因为当数据量太大时会导致客户端卡死,尤其在生产环境上不能使用该命令。应用使用scan命令。
2. scan命令
scan命令的格式如下:
SCAN cursor [pattern] count
scan具有如下特点:
- scan是一个基于游标的迭代器,需要基于上一次的游标延续之前的迭代过程。
- 以0作为游标开始新一轮的迭代,知道命令返回游标0表示完成一次迭代。
- 一次返回的数量不可控,只能大概率符合count参数。
3.示例
假如想查询key值以key1为开始的键值对,可以使用下面的命令:
scan 0 match k1* count 10
这样第一次就指定返回10条数据。结果输出如下:
1) 12345
2) 1) k12214
2) k124
3) k1424
返回结果中第一行的数据为本次查询结束后游标的最新值。下一次查询将依据此游标再次查询;第二行开始的数据为查询结果,可以看到只有三条数据,并不是我们设置的10条数据,即前面说的返回的数量不可控。
下面开始第二次查询:
scan 12345 match k1* count 10
看到游标就是第一次查询的返回值,第二次查询结果如下:
1) 5326
2) 1) k12264
2) k1227
3) k1098
4) k1928
可以看到每次查询结果的数量都不一定相同,第三次查询将5326作为游标开始查询。
scan 5326 match k1* count 10
查询结果为:
1) 3332
2) 1) k1112
2) k1876
这里要注意的是:第三次查询返回的游标值比前面返回的游标值还小,这就有可能导致前后之间的查询结果有重复的数据。为了避免结果重复,可以每次将查询的结果放在同一个set集合里面,这样就可以实现去重了。
网友评论