• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

node_redis获取全部键的方法

武飞扬头像
Catalike、
帮助6

按现在大多数在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
系列文章
更多 icon
同类精品
更多 icon
继续加载