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

相关推荐
沃尔威武15 小时前
数据库 Sinks(.net8)
数据库·.net·webview
Dreamboat¿16 小时前
SQL 注入漏洞
数据库·sql
曹牧17 小时前
Oracle数据库中,将JSON字符串转换为多行数据
数据库·oracle·json
被摘下的星星17 小时前
MySQL count()函数的用法
数据库·mysql
末央&17 小时前
【天机论坛】项目环境搭建和数据库设计
java·数据库
徒 花17 小时前
数据库知识复习07
数据库·作业
素玥18 小时前
实训5 python连接mysql数据库
数据库·python·mysql
jnrjian18 小时前
text index 查看index column index定义 index 刷新频率 index视图
数据库·oracle
瀚高PG实验室18 小时前
审计策略修改
网络·数据库·瀚高数据库
言慢行善19 小时前
sqlserver模糊查询问题
java·数据库·sqlserver