当前位置:   article > 正文

redis-scan命令_redis scan 全量

redis scan 全量

为什么使用scan?

因为在Redis的命令执行是单线程模型的,使用keys指令时,若数据量很大,Redis会对全量数据进行匹配,导致会有几秒钟的阻塞事件,而Scan是通过游标对hash-slot分步进行的,阻塞时间短,适合进行线上生产环境使用。

scan特点

  1. 复杂度虽然也是 O(n),但是它是通过游标分步进行的,不会阻塞线程;
  2. 提供 limit 参数,可以控制每次返回结果的最大条数,limit 只是一个 hint,返回的结果可多可少;
  3. 同 keys 一样,它也提供模式匹配功能;
  4. 服务器不需要为游标保存状态,游标的唯一状态就是 scan 返回给客户端的游标整数;
  5. 返回的结果可能会有重复,需要客户端去重复,这点非常重要;
  6. 遍历的过程中如果有数据修改,改动后的数据能不能遍历到是不确定的;
  7. 单次返回的结果是空的并不意味着遍历结束,而要看返回的游标值是否为零;

scan遍历方式(高位加法)

普通加法和高位进位加法的区别

高位进位法从左边加,进位往右边移动,同普通加法正好相反。但是最终它们都会遍历所有的槽位并且没有重复。

WHY?

可以大大避免重复检索同一hash-slot

数据重复与丢失问题

数据重复

遍历的过程中,发送了hash-slot的收缩,导致两个hash-slot合并成一个,不得不重新检索当前槽位,造成数据的重复。

数据丢失

scan对全量keys进行分段遍历的过程中,有数据插入到已经遍历过的插槽中,该数据不会被检索出。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/一键难忘520/article/detail/735575
推荐阅读
相关标签
  

闽ICP备14008679号