【Redis】渐进式遍历

🐼scan

☑️为什么会存在scan?

我们之前介绍了关于keys的使用,有一个特别危险的命令就是keys*,一旦key的数量特别多,那么很多可能阻塞redis服务器,这是一个特别危险的命令。

那我们就想遍历所有的key怎么办,redis给我们提供了一个渐进式的遍历方案,即一次性遍历一部分,这一部分不足以导致redis服务器挂掉,是很轻松的,直到把所有的key遍历完。

redis给我们提供了一个渐进式的命令scan,scan有扫描的意思,是不是很形象。

每次 scan 命令的时间复杂度是 O(1),但是要完整地完成所有键的遍历,需要执⾏多次 scan

核心思想就是一个"化整为零"

不过值得一提的是,渐进式遍历其实是一组命令,不过好在他们的使用方法是一致的,这里以scan为例。

scan的语法:

时间复杂度:O(1)

返回值:下⼀次 scan 的游标(cursor)以及本次得到的键

cpp 复制代码
SCAN cursor [MATCH pattern] [COUNT count] [TYPE type]
  1. 其中cursor为光标,cursor为0表示从头开始遍历,在遍历完后,redis-server会给你返回一个cursor,告诉你下次从此光标遍历。注意:这个光标不是下标,不能从下标的角度来理解,毫无规律,就是一个字符串,我们也不需要考虑,服务器给我们啥,我们就从这里开始遍历就行!当返回的cursor回到0了,就说明遍历结束了
  2. MATCH pattern 和我们前面keys*的匹配模式是一样的。
  3. COUNT count 是我们此次需要遍历key的个数,默认是10个。注意,这里的count和MySQL的limit有点类似,但又不完全类似,MySQL中limit是精确的,你限制几那么MySQL服务器就给你返回几行。但是这里,count是大概的,有可能你限制为100个key,但是reids服务器给你返回98也是有可能得。
  4. TYPE type:由于redis中key都是一样的数据类型,都是字符串,而value我们现在已经知道了10种数据类型了,如果我们要约束查找的key的value的数据类型,可以选填这个字段。

除了 scan 以外,Redis 面向哈希类型、集合类型、有序集合类型分别提供了 hscan、sscan、zscan 命令,它们的用法和 scan 基本类似

渐进性遍历 scan 虽然解决了阻塞的问题,但如果在遍历期间键有所变化(增加、修改、删

除), 就跟迭代器失效问题,或者多线性的线程安全问题,有的线程正在读,也有的线程正在写这种问题类似 ,可能导致遍历时键的重复遍历或者遗漏,所以我们在使用这个命令时,要考虑到真的要遍历所有的key吗,能不能有替代方案,如果真的使用了,这点务必在实际开发中考虑

最后,记得在执行命令前根据rediscli的提示,带上其关键字不然reids-server可不知道要帮你执行个啥,比如count, type, match...


🐼数据库管理

Redis 提供了几个⾯向 Redis 数据库的操作,分别是 dbsize、select、flushdb、flushall 命令

许多关系型数据库,例如 MySQL 支持在⼀个实例下有多个数据库存在的,但是与关系型数据库⽤字符来区分不同数据库名不同,一个MySQL下可以有多个database,Redis 只是用数字作为多个数据库的实现。

Redis 默认配置中是有 16 个数据库。select0 操作会切换到第⼀个数据库 ,select 15 会切换到最后⼀个数据库。0 号数据库和 15 号数据库保存的数据是完全不冲突的(如图 2-30 所⽰),即各种有各⾃的键值对。默认情况下,我们处于数据库 0

各个数据库的key不冲突

Redis 中虽然支持多数据库,但随着版本的升级,其实不是特别建议使用多数据库特性。如果真的需要完全隔离的两套键值对,更好的做法是维护多个 Redis 实例 ,而不是在⼀个 Redis 实例中维护多数据库。这是因为本身Redis 并没有为多数据库提供太多的特性,其次⽆论是否有多个数据库,Redis 都是使用单线程模型,所以彼此之间还是需要排队等待命令的执⾏。同时多数据库还会让开发、调试和运维⼯作变得复杂。

所以实践中,始终使用数据库 0 其实是⼀个很好的选择。

介绍一下这几个命令,select index就表示切换数据库,index的范围为0-15,进入后可以看到\[\]里就是当前数据库的编号。

dbsize可以返回当前数据库存在多少的key。

flushall可以清空0-15的所有数据库的内容。

flushdb清楚指定数据库编号的内容。

永远不要在生产环境执行清除数据的操作,除⾮你想体验⼀把 "从删库到跑路" 的操作。

相关推荐
是发财不是旺财2 分钟前
Hermes 网关四层权限控制方案:让 AI Agent 安全地查数据库
数据库·安全·agent·openclaw·hermes
阿正的梦工坊18 分钟前
【Rust】04-借用、引用与切片
java·数据库·rust
AOwhisky23 分钟前
学习自测与解析:MySQL第五、六、七期核心知识点详解
运维·数据库·笔记·学习·mysql·云计算
阿标在干嘛33 分钟前
政策平台的推送系统:消息队列、定时任务、AB测试的工程实践
服务器·数据库·ab测试
Upsy-Daisy43 分钟前
Hermes Agent 学习笔记 02:安装、配置与第一次运行
java·前端·数据库
旅之灵夫1 小时前
【GitHub项目推荐--Harness:一体化的开源 DevOps 平台】⭐
github
小二·1 小时前
Redis 7 分布式缓存架构实战
redis·分布式·缓存
Tongpao_SSDHDD1 小时前
希捷酷鹰ST6000VX008实测解析:中小安防监控高性价比存储方案
大数据·数据库·人工智能
蓝鸟19742 小时前
Oracle超大DMP备份文件瘦身、日志精简、磁盘空间优化实战方案日志
数据库·oracle·数据库运维·生产运维实战·oracle避坑·磁盘空间优化·oracle日志清理
金融支付架构实战指南2 小时前
CQRS + 命令模式 + 事件驱动 + 数据库持久化
数据库·ddd·命令模式·领域驱动模型