node_redis获取全部键的方法
按现在大多数在node上使用redis去查询Redis里所有键,都是使用的keys这个命令
redisClient.keys("key",callback)
但是,redis官方其实不推荐使用keys这个命令来获取所有的键值,官网是这样描述的:
keys针对大型数据库执行时,可能会破坏性能,此命令只用于调试和特殊操作。其实不难理解,redis是单线程处理用户的命令,而keys命令会一次遍历所有的key,在执行过程中是无法执行其他命令的。这就导致key比较多的时候key命令执行时间会比较的长,从而堵塞redis。
官方推荐了sets和scan两个命令去执行。因为这次存储全部使用的String类型存储,sets方法只能用于set类型,所以只能用scan。
scan会分次进行遍历,不会堵塞线程,提供了一个count参数来控制每次遍历的集合数,可以理解为是一种渐进式的keys。
然而scan的这个方法基本没看到有人使用,node_redis的官方文档永远就讲get、set这两个api,找不到相关参数。于是乎在外网找到了scan的用法
redisClient.scan(cursor,"MATCH","pattern",'COUNT',"10000",callback)
- ursor - 游标。
- pattern - 匹配的模式。
- count - 指定每次遍历多少个集合。
- 可以简单理解为每次遍历多少个元素
- 根据测试,推荐 Count大小为 1W
这个count值比较的重要,这个值如果过于小了反而会导致scan执行特别慢,太大了可能又会导致redis堵塞时间长,和key没啥区别了,所以这个值得根据数据库中的数据数量来设置,不过有人测试过scan count值理想的大小为10000。
明白了scan的参数和原理,接下来该谈谈如何去使用scan来执行查询。
因为设置了10000这个值,所以每次遍历只会遍历出10000个结果,如果你的数据库键的数量小于10000个值,可能就会全部输出出来,但是如果超过了可能得到的结果就不是全部的了,无论如何你都无法保证count 值超过你数据库里存放的键的数量。
scan方法考虑到这一点,所以在查询的结果会返回一个key,这个key值是一个数组,数组[1]是查询到全部键,数组[0]就是查询返回的游标值。如果key等于0的话就等于查询结束,如果还未结束,这个key做为游标就表示hash遍历的最后一个值,我们需要将这个值重新传回给scan作为cursor继续进行查询。
首先我们需要定一个变量cursor设置为0
const cursor = 0
然后设置好scan方法和回调
redisClient.scan(cursor,"MATCH",type,'COUNT',"10000",(err,key)=>{
if(err){
throw err
}
})
在回调中将key赋值给变量cursor,并判断cursor是否为0
function scan(res){
redisClient.scan(cursor,"MATCH","user_info:username:*",'COUNT',"10000",(err,key)=>{
if(err){
throw err
}
cursor = key[0]
if(cursor === '0'){
}
})
}
如果游标为零,将结果存储起来,如果不为0就返回函数方法。
function scan(res){
redisClient.scan(cursor,"MATCH","user_info:username:*",'COUNT',"10000",(err,key)=>{
if(err){
throw err
}
cursor = key[0]
if(cursor === '0'){
keyarr.push(...key[1])
}else{
if(key[1].length !== 0){
keyarr.push(...key[1])
}
return scan(res)
}
})
}
这样子就可以将数据库中的所有键值遍历并保存下来了。
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhefghff
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01