redis 用scan指令 代替keys指令(详解)
众所周知,当redis中key数量越大,keys命令执行越慢,而且最重要的会阻塞服务器,对单线程的redis来说,简直是灾难,终于找到了替代命令scan。
SCANcursor[MATCHpattern][COUNTcount]
SCAN命令及其相关的SSCAN命令、HSCAN命令和ZSCAN命令都用于增量地迭代(incrementallyiterate)一集元素(acollectionofelements):
SCAN命令用于迭代当前数据库中的数据库键。
SSCAN命令用于迭代集合键中的元素。
HSCAN命令用于迭代哈希键中的键值对。
ZSCAN命令用于迭代有序集合中的元素(包括元素成员和元素分值)。
以上列出的四个命令都支持增量式迭代,它们每次执行都只会返回少量元素,所以这些命令可以用于生产环境,而不会出现像KEYS命令、SMEMBERS命令带来的问题——当KEYS命令被用于处理一个大的数据库时,又或者SMEMBERS命令被用于处理一个大的集合键时,它们可能会阻塞服务器达数秒之久。
不过,增量式迭代命令也不是没有缺点的:举个例子,使用SMEMBERS命令可以返回集合键当前包含的所有元素,但是对于SCAN这类增量式迭代命令来说,因为在对键进行增量式迭代的过程中,键可能会被修改,所以增量式迭代命令只能对被返回的元素提供有限的保证(offerlimitedguaranteesaboutthereturnedelements)。
因为SCAN、SSCAN、HSCAN和ZSCAN四个命令的工作方式都非常相似,所以这个文档会一并介绍这四个命令,但是要记住:
SSCAN命令、HSCAN命令和ZSCAN命令的第一个参数总是一个数据库键。
而SCAN命令则不需要在第一个参数提供任何数据库键——因为它迭代的是当前数据库中的所有数据库键。
scan0默认返回10条数据。
127.0.0.1:6379>scan0
1)"81920"
2) 1)"CMD:1000004739:4"
2)"CMD:1000010475:2"
3)"CMD:380071400001208:766"
4)"CMD:1000006866:LIST"
5)"CMD:380071400001208:20415"
6)"CMD:380071400001231:21530"
7)"CMD:380071400001208:21780"
8)"CMD:7485630165:LIST"
9)"CMD:1000001545:2"
10)"CMD:380071400001231:4387"
可以用count参数指定返回数据量:
127.0.0.1:6379>scan0count100
1)"104448"
2) 1)"CMD:1000004739:4"
2)"CMD:1000010475:2"
3)"CMD:380071400001208:766"
4)"CMD:1000006866:LIST"
5)"CMD:380071400001208:20415"
6)"CMD:380071400001231:21530"
7)"CMD:380071400001208:21780"
8)"CMD:7485630165:LIST"
9)"CMD:1000001545:2"
10)"CMD:380071400001231:4387"
......
94)"CMD:201610200062:6"
95)"CMD:VF3748211006:3"
96)"CMD:1000009121:4"
97)"CMD:380071400001231:6563"
98)"CMD:1000010252:ID"
99)"CMD:1000005261:5"
100)"SERVER:45568_0"
使用match参数来匹配模式:
127.0.0.1:6379>scan0matchCMD*count100
1)"104448"
2) 1)"CMD:1000004739:4"
2)"CMD:1000010475:2"
3)"CMD:380071400001208:766"
4)"CMD:1000006866:LIST"
5)"CMD:380071400001208:20415"
6)"CMD:380071400001231:21530"
7)"CMD:380071400001208:21780"
8)"CMD:7485630165:LIST"
9)"CMD:1000001545:2"
10)"CMD:380071400001231:4387"
......
86)"CMD:201610200062:6"
87)"CMD:VF3748211006:3"
88)"CMD:1000009121:4"
89)"CMD:380071400001231:6563"
90)"CMD:1000010252:ID"
91)"CMD:1000005261:5"
最重要的是scan不会阻塞服务器,现网环境也可以用,真方便。
以上这篇redis用scan指令代替keys指令(详解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。