redis是当前使用很广泛的一款内存key-value软件,有时需要查询下目前redis内存里面有哪些满足条件的键值,在线上系统一定不要使用keys命令,该命令会导致redis停止一切工作,如果redis键值要很多的话会导致redis长时间内都不会响应其他任何命令,这个时候scan命令就呼之欲出了,scan命令可以达到keys命令的效果同时又不会redis出现类似stop-the-world事件的发生,
SCAN 命令是一个基于游标的迭代器(cursor based iterator): SCAN 命令每次被调用之后, 都会向用户返回一个新的游标, 用户在下次迭代时需要使用这个新游标作为 SCAN 命令的游标参数, 以此来延续之前的迭代过程。
scan命令格式:
SCAN cursor [MATCH pattern] [COUNT count]
如果省略count参数的话,默认只返回一部分数据,为了返回全部key,可以将count设置的大些
127.0.0.1:7006> scan 0 match h* count 100 1) "0" 2) 1) "he2lo" 2) "h22" 3) "h16" 4) "h3lo" 5) "h0lo" 6) "h2" 7) "he8lo" 8) "h6" 9) "h7lo" 10) "h26" 11) "h12" 12) "he5lo" 13) "hello" 执行scan命令后,返回了13条数据,说明满足条件的键值有13个,第一个返回值1) "0"说明已经遍历完所有键值,下面执行下分页操作:
127.0.0.1:7006> scan 0 match h* count 10 1) "9" 2) 1) "he2lo" 2) "h22" 3) "h16" 4) "h3lo" 5) "h0lo" 6) "h2" 7) "he8lo" 8) "h6" 9) "h7lo" 上述scan命令返回的9表示可以使用这个游标位置继续搜索,
127.0.0.1:7006> scan 9 1) "0" 2) 1) "h26" 2) "h12" 3) "he5lo" 4) "hello" 127.0.0.1:7006>
OK,到此结束,与scan类似的命令还有:
- SCAN 命令用于迭代当前数据库中的数据库键。
- SSCAN 命令用于迭代集合键中的元素。
- HSCAN 命令用于迭代哈希键中的键值对。
- ZSCAN 命令用于迭代有序集合中的元素(包括元素成员和元素分值)。
PS:不同版本redis命令可能会略有不同,执行前可以使用help scan查看具体命令
参考文章:
1、http://doc.redisfans.com/key/scan.html
2、http://redisdoc.com/database/scan.html#scan