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

相关推荐
TDengine (老段)12 分钟前
TDengine 常见问题 TOP3
大数据·数据库·物联网·时序数据库·tdengine·涛思数据
HanhahnaH15 分钟前
Redis单线程和Tair多线程架构设计对比
分布式·缓存
螺蛳粉 螺蛳粉3 小时前
MySQL 分布式集群系列 · 第五篇——全方位对比:NDB、MGR、主从复制、分库分表怎么选?
数据库·分布式·mysql
wdfk_prog5 小时前
ROS教程07:从 ros::start() 顺着源码读懂 Master、XML-RPC 与 Topic 注册发现
运维·缓存·docker·容器·ros
Escalating_xu6 小时前
【内存管理发展史】从 8086 实模式到分页:CPU 如何把虚拟地址变成物理地址
linux·缓存
wdfk_prog7 小时前
用 Git Submodule + Sparse Checkout 管理 RT-Thread:内核、BSP、第三方库与业务代码分层实践
运维·缓存·docker·容器·ros
努力努力再努力wz7 小时前
【Docker入门系列】镜像为什么能复用?一文吃透 Docker Image、Registry、运行时架构与常用命令
缓存·docker·容器
这个DBA有点耶7 小时前
从OLTP到OLAP到HTAP:数据库负载分类的技术演进与选型指南
数据库·mysql·架构
Nano叶落8 小时前
几十万个-key-扫不过来?-bigkeys、SCAN、RDB-离线分析三步定位最该清的-Big-Key
redis
YangYang9YangYan8 小时前
商业数据分析校招项目怎么选,附项目设计与简历包装思路
大数据·数据库·数据分析