【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 的类型为特定的类型。

相关推荐
最后的最后、79610 小时前
SQLi-Labs 六关 SQL 注入过关笔记
数据库·笔记·sql
晓子文集10 小时前
Tushare接口文档:现金流量表(cashflow)
大数据·数据库·大模型·金融数据·量化投资·tushare
難釋懷11 小时前
Nginx代理https请求
redis·nginx·https
会编程的土豆11 小时前
数据库mysql八股
数据库·笔记·八股
nVisual11 小时前
巡检任务与工单闭环方案
运维·服务器·数据库·数据中心基础设施
施嘉伟11 小时前
它以为自己连的是MongoDB
数据库·mongodb
承渊政道11 小时前
从设备数据到AI洞察:时序数据的多模融合实践
数据库·人工智能·性能优化·金仓数据库·多模融合
会编程的土豆11 小时前
MySQL 中的 IN 和 EXISTS(零基础笔记)
数据库·笔记·mysql
科技圈快迅11 小时前
2026年数据库国产化替代性能调优方法论:从SQL基线建立到持续优化的全流程体系
数据库·sql
你有我备注吗11 小时前
SQL之数据更新
数据库·sql