【Redis】渐进式遍历

🐼scan

☑️为什么会存在scan?

我们之前介绍了关于keys的使用,有一个特别危险的命令就是keys*,一旦key的数量特别多,那么很多可能阻塞redis服务器,这是一个特别危险的命令。

那我们就想遍历所有的key怎么办,redis给我们提供了一个渐进式的遍历方案,即一次性遍历一部分,这一部分不足以导致redis服务器挂掉,是很轻松的,直到把所有的key遍历完。

redis给我们提供了一个渐进式的命令scan,scan有扫描的意思,是不是很形象。

每次 scan 命令的时间复杂度是 O(1),但是要完整地完成所有键的遍历,需要执⾏多次 scan

核心思想就是一个"化整为零"

不过值得一提的是,渐进式遍历其实是一组命令,不过好在他们的使用方法是一致的,这里以scan为例。

scan的语法:

时间复杂度:O(1)

返回值:下⼀次 scan 的游标(cursor)以及本次得到的键

cpp 复制代码
SCAN cursor [MATCH pattern] [COUNT count] [TYPE type]
  1. 其中cursor为光标,cursor为0表示从头开始遍历,在遍历完后,redis-server会给你返回一个cursor,告诉你下次从此光标遍历。注意:这个光标不是下标,不能从下标的角度来理解,毫无规律,就是一个字符串,我们也不需要考虑,服务器给我们啥,我们就从这里开始遍历就行!当返回的cursor回到0了,就说明遍历结束了
  2. MATCH pattern 和我们前面keys*的匹配模式是一样的。
  3. COUNT count 是我们此次需要遍历key的个数,默认是10个。注意,这里的count和MySQL的limit有点类似,但又不完全类似,MySQL中limit是精确的,你限制几那么MySQL服务器就给你返回几行。但是这里,count是大概的,有可能你限制为100个key,但是reids服务器给你返回98也是有可能得。
  4. TYPE type:由于redis中key都是一样的数据类型,都是字符串,而value我们现在已经知道了10种数据类型了,如果我们要约束查找的key的value的数据类型,可以选填这个字段。

除了 scan 以外,Redis 面向哈希类型、集合类型、有序集合类型分别提供了 hscan、sscan、zscan 命令,它们的用法和 scan 基本类似

渐进性遍历 scan 虽然解决了阻塞的问题,但如果在遍历期间键有所变化(增加、修改、删

除), 就跟迭代器失效问题,或者多线性的线程安全问题,有的线程正在读,也有的线程正在写这种问题类似 ,可能导致遍历时键的重复遍历或者遗漏,所以我们在使用这个命令时,要考虑到真的要遍历所有的key吗,能不能有替代方案,如果真的使用了,这点务必在实际开发中考虑

最后,记得在执行命令前根据rediscli的提示,带上其关键字不然reids-server可不知道要帮你执行个啥,比如count, type, match...


🐼数据库管理

Redis 提供了几个⾯向 Redis 数据库的操作,分别是 dbsize、select、flushdb、flushall 命令

许多关系型数据库,例如 MySQL 支持在⼀个实例下有多个数据库存在的,但是与关系型数据库⽤字符来区分不同数据库名不同,一个MySQL下可以有多个database,Redis 只是用数字作为多个数据库的实现。

Redis 默认配置中是有 16 个数据库。select0 操作会切换到第⼀个数据库 ,select 15 会切换到最后⼀个数据库。0 号数据库和 15 号数据库保存的数据是完全不冲突的(如图 2-30 所⽰),即各种有各⾃的键值对。默认情况下,我们处于数据库 0

各个数据库的key不冲突

Redis 中虽然支持多数据库,但随着版本的升级,其实不是特别建议使用多数据库特性。如果真的需要完全隔离的两套键值对,更好的做法是维护多个 Redis 实例 ,而不是在⼀个 Redis 实例中维护多数据库。这是因为本身Redis 并没有为多数据库提供太多的特性,其次⽆论是否有多个数据库,Redis 都是使用单线程模型,所以彼此之间还是需要排队等待命令的执⾏。同时多数据库还会让开发、调试和运维⼯作变得复杂。

所以实践中,始终使用数据库 0 其实是⼀个很好的选择。

介绍一下这几个命令,select index就表示切换数据库,index的范围为0-15,进入后可以看到\[\]里就是当前数据库的编号。

dbsize可以返回当前数据库存在多少的key。

flushall可以清空0-15的所有数据库的内容。

flushdb清楚指定数据库编号的内容。

永远不要在生产环境执行清除数据的操作,除⾮你想体验⼀把 "从删库到跑路" 的操作。

相关推荐
憧憬成为web高手3 分钟前
皮卡丘靶场速通--sql 2
数据库·sql·mybatis
段一凡-华北理工大学16 分钟前
向量数据库实战:选型、调优与落地~系列文章12:文本分块策略实战:chunk_size 怎么选?重叠多少?
开发语言·数据库·后端·oracle·rust·工业智能体·高炉智能化
二宝哥1 小时前
CentOS 7.9 系统下 Redis 5.0.4 单机安装与源码编译安装指南
redis·centos
oradh2 小时前
Oracle XTTS实现跨版本迁移和升级(Oracle 11g单库升级至19C RAC集群)
数据库·oracle·11g升级19c·xtts跨版本迁移和升级
z123456789863 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程
程序猿DD3 小时前
一个 API Key,统一调用大模型、生图和联网搜索
数据库·网关
刘较瘦_4 小时前
AI 开发中的 Git Submodule 父子仓库模式:前后端分仓管理与协作实践
前端·github
TlSfoward4 小时前
抓包代理链路下的 TLS 指纹变化分析 TLSFOWARD抓包工具
数据库·爬虫·网络协议·搜索引擎·php
数智化管理手记4 小时前
账龄分析手工统计易遗漏?自动账龄分析工具怎么搭建
大数据·网络·数据库·人工智能·数据挖掘
LabVIEW开发5 小时前
NI Package Manager安装LabVIEW时InternalServerError错误
网络·数据库·labview·labview知识·labview功能·labview程序