文章目录

  • 1 keys 全局遍历建
  • 2 SCAN 渐进式遍历键
    • 2.1 为什么count和实际返回的数量有可能不一致
    • 2.2 SCAN 命令的保证(guarantees)
    • 2.3 SCAN 命令每次执行返回的元素数量
      • 2.3.1 COUNT 选项

1 keys 全局遍历建

keys:全量遍历键,用来列出所有满足特定正则字符串规则的key,假设redis此时正在生产环境下,使用该命令就会造成隐患,当redis数据量比较大时:

  • keys会一次性返回所有符合条件的key,所以会造成redis的卡顿
  • 另外如果一次性返回所有key,对内存的消耗在某些条件下也是巨大的。

keys性能比较差,要避免使用:

2 SCAN 渐进式遍历键

可用版本 >= 2.8.0

时间复杂度计算如下:每一轮遍历的时间复杂度为O(1)

SCAN是一个基于游标的迭代器,需要基于上一次的游标延续之前的迭代过程。SCAN以0作为游标,开始一次新的迭代,直到命令返回游标0完成一次遍历。

此命令并不保证每次执行都返回某个给定数量的元素,甚至会返回0个元素,但只要游标不是0,程序都不会认为SCAN命令结束,但是返回的元素数量大概率符合count参数。另外,SCAN支持模糊查询。

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

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

语法:

SCAN cursor [MATCH pattern] [COUNT count]
cursor - 游标。
pattern - 匹配的模式。
count - 指定从数据集里返回多少元素,默认值为 10 。

注意:但是scan并非完美无瑕, 如果在scan的过程中如果有键的变化(增加、 删除、 修改) ,那么遍历效果可能会碰到如下问题: 新增的键可能没有遍历到, 遍历出了重复的键等情况, 也就是说scan并不能保证完整的遍历出来所有的键, 这些是我们在开发时需要考虑的。

2.1 为什么count和实际返回的数量有可能不一致

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

2.2 SCAN 命令的保证(guarantees)

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

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

  • 同一个元素可能会被返回多次。 处理重复元素的工作交由应用程序负责, 比如说, 可以考虑将迭代返回的元素仅仅用于可以安全地重复执行多次的操作上。

  • 如果一个元素是在迭代过程中被添加到数据集的, 又或者是在迭代过程中从数据集中被删除的, 那么这个元素可能会被返回, 也可能不会, 这是未定义的(undefined)。

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

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

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

不过命令返回的元素数量总是符合一定规则的, 在实际中:

  • 对于一个大数据集来说, 增量式迭代命令每次最多可能会返回数十个元素(COUNT 参数默认值为10);

  • 而对于一个足够小的数据集来说, 如果这个数据集的底层表示为编码数据结构(encoded data structure,适用于是小集合键、小哈希键和小有序集合键), 那么增量迭代命令将在一次调用中返回数据集中的所有元素。

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

2.3.1 COUNT 选项

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

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

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

COUNT 参数的默认值为 10 。

在迭代一个足够大的、由哈希表实现的数据库、集合键、哈希键或者有序集合键时, 如果用户没有使用 MATCH 选项, 那么命令返回的元素数量通常和 COUNT 选项指定的一样, 或者比 COUNT 选项指定的数量稍多一些。

在迭代一个编码为整数集合(intset,一个只由整数值构成的小集合)、 或者编码为压缩列表(ziplist,由不同值构成的一个小哈希或者一个小有序集合)时, 增量式迭代命令通常会无视 COUNT 选项指定的值, 在第一次迭代就将数据集包含的所有元素都返回给用户。

参考:
《Redis 命令参考》

【Redis】keys命令和SCAN命令相关推荐

  1. redis集群scan_Redis scan命令的一次坑

    Redis作为当前服务架构不可或缺的Cache,其支持丰富多样的数据结构,Redis在使用中其实也有很多坑,本次博主遇到的坑或许说是Java程序员会遇到的多一点,下面就听博主详细道来. 线上服务堵塞 ...

  2. 深入理解Redis的scan命令

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

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

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

  4. Redis Scan命令

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

  5. Redis scan命令原理

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

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

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

  7. Redis Scan 命令

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

  8. Redis命令:scan实现模糊查询

    1.scan前言 从Redis v2.8开始,SCAN命令已经可用,它允许使用游标从keyspace中检索键. 对比KEYS命令,虽然SCAN无法一次性返回所有匹配结果,但是却规避了阻塞系统这个高风险 ...

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

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

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

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

最新文章

  1. SQLite 日期类型(转)
  2. opencv Mat类
  3. TFF 官方demo解释
  4. 自动化运维之SaltStack实践
  5. 【Java文件操作】txt文件的创建
  6. 你可能不知道的跨域解决方案
  7. MCGS与PLC通讯不上
  8. c语言 方程改main的值_C语言编程笔记丨编写第一个C语言程序hello world,我教你哇...
  9. 史上最萌最认真的机器学习/深度学习/模式识别入门指导手册(二)
  10. R语言快速学习第二部分(有其他语言基础)
  11. 浅谈:如何加快本本的开机时间
  12. Office Open XML 文档格式(转)
  13. 《编程机制探析》第二章 计算机语言
  14. linux驱动学习二---driver
  15. 电话那头原来是个大美女
  16. 如何快速自动生成并定制报表
  17. linux新建分区步骤
  18. 数据库设计之概念结构设计---------E-R图详解
  19. 【概率统计】统计函数
  20. 很不错的两款icon图标选择组件

热门文章

  1. ResultSet获取记录条数
  2. 微信小程序开发-软件外包平台案例
  3. mfc9340扫描到文件服务器,兄弟MFC7340打印机怎么扫描文件?
  4. 快速迭代内部学习心得
  5. ionic 配置java_ionic开发环境搭建
  6. python写酒店管理系统_基于WEB的小型酒店管理系统,源码下载
  7. 深入理解高级数据结构之红黑树
  8. Win7,一次性修改所有文件夹图标
  9. SameTime8.5.1安装失败故障诊断
  10. 携程异步消息系统实践