redis-scan

本文介绍了Redis的Scan命令。Redis是单线程的,使用时间复杂度为O(N)的命令易阻塞,如Keys命令。Scan命令有limit参数,可控制每次返回结果最大条数,虽复杂度也是O(N),但分次进行不阻塞线程。还介绍了其结构、遍历顺序及rehash时扩容和缩容的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

redis的scan命令

  • redis是单线程的,因此使用一些时间复杂度为0(N)的命令要十分谨慎,容易阻塞
  • 使用keys命令查询key容易阻塞
    • 没有limit
    • 遍历算法,复杂度O(N)
  • scan命令(SCAN cursor [MATCH pattern] [COUNT count])
    • 特点
      • 有limit参数,可以控制每次返回结果的最大条数
      • 复杂度虽然也是0(N),但分次进行,不会阻塞线程
    • 结构
      • redis使用hash作为底层实现,数据+链表的结构,数组的大小为2n(n>=0)。每次扩容数组长度扩大一倍
      • scan命令遍历这个一位数组,每次返回的游标值是这个数组的索引,limit表示遍历多少个数组的元素,将这些元素下挂接的符合条件的结果都返回。因为每个元素下挂接的链表大小不同,所以每次返回的结果数量也就不同
    • 遍历顺序(二进制高位加1)(考虑了扩容和缩容)(游标倒置加1再倒置)
    • rehash
      • 扩容:原来挂接在xx下的所有元素被分配到0xx和1xx下。在上图中,当我们即将遍历10时,dict进行了rehash,这时,scan命令会从010开始遍历,而000和100(原00下挂接的元素)不会再被重复遍历
      • 缩容:假设dict从3位缩容到2位,当即将遍历110时,dict发生了缩容,这时scan会遍历10。这时010下挂接的元素会被重复遍历,但010之前的元素都不会被重复遍历了。所以,缩容时还是可能会有些重复元素出现的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值