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

相关推荐
jiayou6415 小时前
KingbaseES 实战:深度解析数据库对象访问权限管理
数据库
李广坤1 天前
MySQL 大表字段变更实践(改名 + 改类型 + 改长度)
数据库
爱可生开源社区3 天前
2026 年,优秀的 DBA 需要具备哪些素质?
数据库·人工智能·dba
随逸1773 天前
《从零搭建NestJS项目》
数据库·typescript
加号33 天前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql
シ風箏3 天前
MySQL【部署 04】Docker部署 MySQL8.0.32 版本(网盘镜像及启动命令分享)
数据库·mysql·docker
李慕婉学姐3 天前
Springboot智慧社区系统设计与开发6n99s526(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
百锦再3 天前
Django实现接口token检测的实现方案
数据库·python·django·sqlite·flask·fastapi·pip
tryCbest3 天前
数据库SQL学习
数据库·sql
jnrjian3 天前
ORA-01017 查找机器名 用户名 以及library cache lock 参数含义
数据库·oracle