【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. 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清楚指定数据库编号的内容。

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

相关推荐
小陈工25 分钟前
Python Web开发入门(十七):Vue.js与Python后端集成——让前后端真正“握手言和“
开发语言·前端·javascript·数据库·vue.js·人工智能·python
研究点啥好呢5 小时前
Github热门项目推荐 | 创建你的像素风格!
c++·python·node.js·github·开源软件
科技小花5 小时前
数据治理平台架构演进观察:AI原生设计如何重构企业数据管理范式
数据库·重构·架构·数据治理·ai-native·ai原生
一江寒逸5 小时前
零基础从入门到精通MySQL(中篇):进阶篇——吃透多表查询、事务核心与高级特性,搞定复杂业务SQL
数据库·sql·mysql
D4c-lovetrain5 小时前
linux个人心得22 (mysql)
数据库·mysql
阿里小阿希6 小时前
CentOS7 PostgreSQL 9.2 升级到 15 完整教程
数据库·postgresql
荒川之神6 小时前
Oracle 数据仓库雪花模型设计(完整实战方案)
数据库·数据仓库·oracle
做个文艺程序员6 小时前
MySQL安全加固十大硬核操作
数据库·mysql·安全
不吃香菜学java6 小时前
Redis简单应用
数据库·spring boot·tomcat·maven
一个天蝎座 白勺 程序猿6 小时前
Apache IoTDB(15):IoTDB查询写回(INTO子句)深度解析——从语法到实战的ETL全链路指南
数据库·apache·etl·iotdb