文章目录

  • 1. Scan 命令的基本用法
    • 1.1 Scan 命令的输入值
    • 1.2 Scan 命令的返回值
  • 2. Scan 命令与 Keys 命令比较
    • 2.1 Keys 命令的缺点
    • 2.2 Scan 命令的优点
  • 3. Scan 命令的限制
    • 3.1 有限保证原则
    • 3.2 返回的结果有可能会重复

1. Scan 命令的基本用法

Scan 命令是一个基于游标的迭代器:Scan 命令每次被调用之后,都会向用户返回一个新的游标,用户在下次迭代时需要使用这个新游标作为 Scan 命令的游标参数,以此来延续之前的迭代过程。

当 Scan 命令的游标参数被设置为 0 时,服务器将开始一次新的迭代,而当服务器向用户返回值为 0 的 游标时,表示迭代已经结束。

1.1 Scan 命令的输入值

Scan 命令的语法为:

SCAN cursor [MATCH pattern] [COUNT count] (The default COUNT value is 10)

举例:当需要查找以 keyA 开头的 key 值时,可以使用如下命令进行开始:

SCAN 0 match keyA* count 20

注意,上面的 0 代表第一次遍历,20 是限定服务器单次遍历的字典槽位数量。

1.2 Scan 命令的返回值

Scan 命令的返回值是一个包含两个元素的数组,第一个数组元素是用于下一次迭代的新游标,而第二个数组元素则是一个数组,这个数组中包含了所有被迭代的元素。

以 0 作为游标开始一次新的迭代,一直调用 Scan 命令,直到命令返回游标 0,这个过程称之为一次完整遍历。

2. Scan 命令与 Keys 命令比较

2.1 Keys 命令的缺点

  • 没有限制返回结果的参数。由于 Keys 命令只能一次性获取所有符合匹配规则的 key,所以没办法限制返回的结果数量。
  • keys 命令是遍历来实现的,时间复杂度是 O(N)

所以结合以上两个缺点,再加上 Redis单线程 的这个性质,在结果集数量非常大时,会造成 Redis 进程被阻塞,导致 Redis 服务卡顿。

2.2 Scan 命令的优点

  • Scan 命令提供了 limit 参数, 可以限制返回的结果数量。
  • Scan 命令时间复杂度也为 O(N),但是它是分次进行的,即不会阻塞进程。

所以结合以上两个优点, Scan 命令不会导致 Redis 服务卡顿。

3. Scan 命令的限制

3.1 有限保证原则

Scan 命令可以保证:

从完整遍历开始直到完整遍历结束期间,一直存在于数据集内的所有元素都会被完整遍历返回,但是同一个元素可能会被返回多次。如果一个元素是在遍历过程中被添加到数据集或者从数据集中被删除,那么这个元素可能被返回,也可能不被返回。

3.2 返回的结果有可能会重复

Scan 命令每次返回的结果有可能会重复,所以要在应用层进行去重处理。

Redis Scan 命令相关推荐

  1. Redis Scan命令

    原地址:https://www.cnblogs.com/tekkaman/p/4887293.html [Redis Scan命令] SCAN cursor [MATCH pattern] [COUN ...

  2. redis scan 命令底层原理(为什么会重复扫描?)

    文章目录 前言 一.迭代器 1. 全遍历 2. 间断遍历 二.scan 扫描原理 1. 扫描算法: 2. 减少重复扫描? 2.1 扩容 2.2 缩容 3. 迭代过程中正在进行rehash 4. 完整的 ...

  3. Redis scan命令原理

    scan类型命令 SCAN cursor [MATCH pattern] [COUNT count]SSCAN KEY cursor [MATCH pattern] [COUNT count]HSCA ...

  4. redis 命令 释放连接_redis scan命令导致redis连接耗尽,线程上锁的解决

    使用redis scan方法无法获取connection,导致线程锁死. 0.关键字 redis springboot redistemplate scan try-with-resource 1.异 ...

  5. 一次 Scan 竟耗时上百秒?Redis Scan 原理解析与踩坑

    来自:指月 https://www.lixueduan.com 原文:https://www.lixueduan.com/post/redis/redis-scan/ 主要分析了 Redis Scan ...

  6. redis的scan命令的源码分析,实现原理

    简言 1. 线上环境keys命令不可用,会导致redis卡死.scan命令因为可以分批遍历,比较实用 2. scan命令包括多个 遍历整个数据库的scan命令,处理函数 scanCommand(),最 ...

  7. 深入理解Redis的scan命令

    熟悉Redis的人都知道,它是单线程的.因此在使用一些时间复杂度为O(N)的命令时要非常谨慎.可能一不小心就会阻塞进程,导致Redis出现卡顿. 有时,我们需要针对符合条件的一部分命令进行操作,比如删 ...

  8. java redis优化_Redis性能优化:使用scan命令替换keys

    由于每个Redis实例是使用单线程处理所有请求的,故keys命令和其他命令都是在同一个队列排队等待执行的,如果keys命令执行时间长(数量多),则会阻塞其他命令的执行,导致性能问题. scan命令是在 ...

  9. 因 Redis Key 命令不规范,导致熬了一个通宵才把Key删完了!

    来源:http://dwz.date/cmSG 前言 由于有一条业务线不理想,高层决定下架业务.对于我们技术团队而言,其对应的所有服务器资源和其他相关资源都要释放.释放了8台应用服务器: 1台es服务 ...

最新文章

  1. 布袋除尘器过滤风速多少_塑烧板除尘器过滤风速选多少
  2. 多媒体计算机技术在教学中的应用,【浅谈多媒体计算机技术在中学物理教学中的应用】计算机技术是什么...
  3. json字符串转换成json对象,json对象转换成字符串,值转换成字符串,字符串转成值...
  4. IRIS在win2003中安装 报 error while loading a DLL错误
  5. 单源最短路 SPFA 算法模板
  6. android微信支付服务端,Android 微信支付返回-1
  7. SecureCRT设置
  8. Python选择结构注意事项
  9. dell 服务器ghost系统,Dell 5000笔记本装win7 64位Ghost系统真正成功教程
  10. 刷网课-踩坑——jsDOM获取不到页面元素节点-iframe标签获取元素节点
  11. 身份证号归属地数据库
  12. mysql建立唯一索引升序_MySQL数据库SQL优化技巧六之唯一索引
  13. Windows系统查看电脑系统信息(操作系统与版本、系统型号、处理器具体型号、BIOS版本、BIOS模式、主板信息等等)
  14. 软件需求工程 高校教学平台 项目总结报告
  15. python 优点 英文_值得关注的 10 个 Python 英文博客
  16. 中国艺术孙溟㠭书法《觉》
  17. nacos界面定制化
  18. NLP中<SOS>、<EOS>、<UNK>、<PAD>等标识符的含义
  19. webstorm安装及汉化后无法设置的原因总结
  20. JavaEE:RocketMQ安装与使用

热门文章

  1. Python datetime astimezone()方法与示例
  2. java 根据类名示例化类_Java LocalDateTime类| AdjustInto()方法与示例
  3. nodejs Error: request entity too large解决方案
  4. NVelocity标签使用详解
  5. 微信公众号——永久素材的上传
  6. python自己做个定时器_python 创建一个自己的类计时器
  7. C#利用反射实现实体类ListT索引器
  8. 为什么MySQL索引更适合B+树而不是二叉树、B树
  9. SQL Server和MysQL中的联表更新sql示例
  10. jq在html中添加dom元素,使用jQuery添加DOM元素的最佳方法