Redis Scan指令解析与使用示例

Redis Scan指令解析与使用示例


概念

  想要从redis key列表中找到某个key,redis提供了一个简单粗暴的指令keys用来列出满足查询条件的所有key。

keys redis*
keys redis*key

  key指令非常简单,只要提供一个简单的正则表达式即可,但是有两个明显的缺点:

  1. 没有sffset和limit参数,一次性吐出所有满足条件的key。
  2. keys遍历算法时间复杂度O(n),如果实例中有千万级以上的key,那么keys一下就会导致redis服务卡顿,影响所有读写操作。

  redis为了解决这个问题,在2.8版本中加入了scan指令,对比key具有不少特点:

  1. 虽然时间复杂度也是O(n),但是scan通过游标分步进行,不会阻塞线程(scan指令本身不会阻塞,但是如果在遍历过程中进行了大量写入操作)。
  2. 提供limit参数控制每次遍历的字典槽位的数量。
  3. 同key一样,它也提供了模式匹配功能。
  4. 服务器不需要单独为游标保存状态。
  5. 返回结果可能会有重复。
  6. 遍历途中有数据改动,无法保证会被遍历。
  7. 返回的游标值为0表示遍历结束。
scan 0 match you* count 1000

  scan指令有三个参数,第一个参数是游标cursor值(从0开始);第二个参数是需要匹配的正则表达式;第三个参数是遍历的limit限制。

scan遍历顺序

  scan的遍历顺序不是从一位数组的第0位一直遍历到最后一位,而是采用高位进位加法来遍历。
  高位进位加法就是,从左边加,进位往右边移动,例如:

0000 —+1—> 1000 —+1—> 0100 —+1—> 1100

  二进制逢一进一:
  第一次对最高位+1,最高位变为1;
  第二次对最高位+1,发现最高位已满需要向右进一,从而最高位变为0,次高位为1;
  第三次对最高位+1,最高位变为1,且不改变次高位;
  redis之所以这样设计,是为了防止字典扩容和缩容重复遍历和遗漏。


一键三连,让我的信心像气球一样膨胀!

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乐只乐之

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值