【Redis】渐进式遍历

目录

渐进式遍历简单介绍

在 Redis 中我们可以使用 keys * 把整个 Redis 中的所有 key 都获取到,但是这个操作比较危险,因为 Redis 是单线程模型,如果获取的 key 很多,那么可能会阻塞线程。

Redis 使用 scan 命令进行渐进式遍历键,进而解决直接使用 keys 获取键时可能出现的阻塞问题。每次 scan 命令的时间复杂度是 O(1),但是要完整地完成所有键的遍历,需要执行多次 scan。

渐进式遍历在遍历过程中,也就是没有遍历完时,是可以随时终止的,这个指令不会在服务器这边存储任何的状态信息。

渐进式遍历 scan 虽然解决了阻塞的问题,但是如果遍历期间键有所变化(增删改),可能会导致键的重复遍历或遗漏,其实就类似于线程不安全的意思。

参数介绍

MATCH pattern

这个参数和 keys 的一样。

所以用法也是一致的,不知道的可以看【Redis】Redis基本全局命令

COUNT count

限制这一次遍历所能获取的元素数量,不写默认是10。注意,这里的数目不像 MySQL 的 limit,限制多少就是多少,Redis 这里的是给一个建议,采不采纳 Redis 说的算,也就是写入的 count 和实际返回的可能会不一样,但是也不会差很多。

TYPE type

Redis 中的 key 都是 string 类型,但是 value 的类型不一样。这个选项不指定,那就不会限制返回 key 对应的 value 的类型,如果指定,那么就会限制返回 key 的 value 的类型为指定类型。

可以指定的类型和 type 指令对各类型 value 对应的 key 使用后的返回值一致:string、hash、list、set、zset、stream。

cursor

cursor 有光标的意思,是 scan命令的必选参数(第一个参数),本质是一个无符号整数(非负整数)。光标指向了当前遍历的位置,但是,需要注意,光标不保证连续性,光标起始是 0,我们遍历返回了 10 个元素,并不能保证光标此时指向 10,光标是 Redis 内部的 "位置标记",不是键的数量索引,持续的遍历 cursor 可能会前后乱跳,这是正常现象,我们 scan 一次之后,想接着上次的访问,我们就根据返回值给的下次 scan 所需的光标位置继续。

使用演示

可以看到即使我们指定了 count 为 10,它也不一定返回 10 个。此外,scan 的返回值先分成了两部分,第二部分继续分,这就是遍历返回的 key,第一部分就是继续下一次 scan 所要在参数中加的光标,可以看到这个光标也不是连续的,这里给的 11,但是无所谓,我们不可理解 Redis 理解就行,我们加在下一次 scan 中,可以看到,果然完成了全部指定条件 key 的遍历。这里还有一点要注意,就是因为 scan 有好几个可选参数,所以我们使用可选参数时得在前面加标识,不然每个都可能省略,Redis 就没法识别参数到底啥意思。

我们也能使用 type 选项指定返回的 key 所对应的 value 的类型为特定的类型。

相关推荐
用户30745969820720 小时前
Redis 延时队列详解
redis
GBASE20 小时前
G术时刻 |GBase 8s数据库事务并发控制之封锁技术介绍(下)
数据库
烤代码的吐司君1 天前
Redis 数据结构 ZSet, BIT, HyperLogLog,Geo 空间数据
redis·后端
xiezhr1 天前
逛GitHub发现了一款免费的带AI功能的数据库管理工具
数据库·ai编程·dba
吃糖的小孩2 天前
给 QQ AI 机器人设计“可控记忆”:会话摘要、手动长期记忆与角色卡边界
数据库
笃行3503 天前
金仓数据库数据安全双防线:静态存储加密与传输加密实战
数据库
笃行3503 天前
金仓数据库物理备份实战:sys_rman 全流程演练与误覆盖抢救
数据库
笃行3503 天前
金仓数据库逻辑备份实战:从全库导出到 Schema 替换的完整闭环
数据库
leeyi3 天前
Checkpoint 机制:Agent 怎么在断电后接着跑
redis·aigc·agent