原地址:https://www.cnblogs.com/tekkaman/p/4887293.html

Redis Scan命令

SCAN cursor [MATCH pattern] [COUNT count]

SCAN 命令及其相关的 SSCAN 命令、 HSCAN 命令和 ZSCAN 命令都用于增量地迭代(incrementally iterate)一集元素(a collection of elements):

  • SCAN 命令用于迭代当前数据库中的数据库键。
  • SSCAN 命令用于迭代集合键中的元素。
  • HSCAN 命令用于迭代哈希键中的键值对。
  • ZSCAN 命令用于迭代有序集合中的元素(包括元素成员和元素分值)。

以上列出的四个命令都支持增量式迭代, 它们每次执行都只会返回少量元素, 所以这些命令可以用于生产环境, 而不会出现像 KEYS命令、 SMEMBERS 命令带来的问题 —— 当 KEYS 命令被用于处理一个大的数据库时, 又或者 SMEMBERS 命令被用于处理一个大的集合键时, 它们可能会阻塞服务器达数秒之久。

不过, 增量式迭代命令也不是没有缺点的: 举个例子, 使用 SMEMBERS 命令可以返回集合键当前包含的所有元素, 但是对于 SCAN这类增量式迭代命令来说, 因为在对键进行增量式迭代的过程中, 键可能会被修改, 所以增量式迭代命令只能对被返回的元素提供有限的保证 (offer limited guarantees about the returned elements)。

因为 SCAN 、 SSCAN 、 HSCAN 和 ZSCAN 四个命令的工作方式都非常相似, 所以这个文档会一并介绍这四个命令, 但是要记住:

  • SSCAN 命令、 HSCAN 命令和 ZSCAN 命令的第一个参数总是一个数据库键。
  • 而 SCAN 命令则不需要在第一个参数提供任何数据库键 —— 因为它迭代的是当前数据库中的所有数据库键。

SCAN命令的基本用法】  

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

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

以下是一个 SCAN 命令的迭代过程示例:

SCAN的命令保证

  SCAN 命令, 以及其他增量式迭代命令, 在进行完整遍历的情况下可以为用户带来以下保证: 从完整遍历开始直到完整遍历结束期间, 一直存在于数据集内的所有元素都会被完整遍历返回; 这意味着, 如果有一个元素, 它从遍历开始直到遍历结束期间都存在于被遍历的数据集当中, 那么 SCAN 命令总会在某次迭代中将这个元素返回给用户。

然而因为增量式命令仅仅使用游标来记录迭代状态, 所以这些命令带有以下缺点:

  • 同一个元素可能会被返回多次。 处理重复元素的工作交由应用程序负责, 比如说, 可以考虑将迭代返回的元素仅仅用于可以安全地重复执行多次的操作上。
  • 如果一个元素是在迭代过程中被添加到数据集的, 又或者是在迭代过程中从数据集中被删除的, 那么这个元素可能会被返回, 也可能不会, 这是未定义的(undefined)。

SCAN 命令每次执行返回的元素数量

  增量式迭代命令并不保证每次执行都返回某个给定数量的元素。

  增量式命令甚至可能会返回零个元素, 但只要命令返回的游标不是 0 , 应用程序就不应该将迭代视作结束。

  用户可以通过增量式迭代命令提供的 COUNT 选项来指定每次迭代返回元素的最大值。

  虽然增量式迭代命令不保证每次迭代所返回的元素数量, 但我们可以使用 COUNT 选项, 对命令的行为进行一定程度上的调整。

基本上, COUNT 选项的作用就是让用户告知迭代命令, 在每次迭代中应该从数据集里返回多少元素。

虽然 COUNT 选项只是对增量式迭代命令的一种提示(hint), 但是在大多数情况下, 这种提示都是有效的。

MATCH选项

  和 KEYS 命令一样, 增量式迭代命令也可以通过提供一个 glob 风格的模式参数, 让命令只返回和给定模式相匹配的元素, 这一点可以通过在执行增量式迭代命令时, 通过给定 MATCH <pattern> 参数来实现。

  以下是一个使用 MATCH 选项进行迭代的示例:

  

参考:http://redisdoc.com/key/scan.html

Redis Scan命令相关推荐

  1. Redis Scan 命令

    文章目录 1. Scan 命令的基本用法 1.1 Scan 命令的输入值 1.2 Scan 命令的返回值 2. Scan 命令与 Keys 命令比较 2.1 Keys 命令的缺点 2.2 Scan 命 ...

  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. 5.html基础标签:块级+行级元素+特殊字符+嵌套规则
  2. 防范SQL指令植入式***
  3. 嵌套 思维导图_Python 这方面,8张思维导图助你转身变大牛!
  4. axios获取图片显示_Vue.js+axios图片预览以及上传显示进度
  5. MCU——JLINK接外部电源调试问题
  6. jackson 忽略多余字段_Java进阶学习:JSON解析利器JackSon
  7. spring boot mail发送邮件异常解决
  8. canvas应用之各种游戏转盘
  9. iOS 网页截取长图
  10. 《巴菲特的第一桶金》读书笔记
  11. ovs 内核态加打印调试
  12. [python3]读取docx每个段落下的table数据
  13. SDRAM中的DQM
  14. 重要知识:身份证复印件的正确使用方法
  15. DB2控制中心菜单中文乱码问题
  16. 线性回归分析——高尔顿数据集更正版
  17. 关于simplis仿真和驱动方法
  18. 什么是JavaBean、bean?
  19. wpf入门第七篇 使用Squirrel自动更新应用
  20. 毕业设计 STM32天气预报盒子 - 嵌入式 单片机 物联网

热门文章

  1. 线程:等待/通知机制
  2. linux oracle 数据库导出
  3. 前端一HTML:十八:元素的显示方式
  4. Zsh vs. Bash不完全对比解析,zsh是一种更强大的被成为“终极”的Shell
  5. 2017.3.9 对象 函数
  6. Python黑客编程基础3网络数据监听和过滤
  7. AOP之PostSharp2-OnMethodBoundaryAspect
  8. netty4.0.x源码分析—bootstrap
  9. HTTP协议和几种常见的状态码
  10. JVM内存参数详解以及配置调优