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

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

相关推荐
·云扬·10 小时前
MySQL 主从复制实战:Xtrabackup 高效部署方案
数据库·mysql
Ama_tor11 小时前
从零开始MySQL|F盘安装,配置,简单应用以及基础语句
数据库·mysql
亓才孓13 小时前
【MyBatis Exception】Public Key Retrieval is not allowed
java·数据库·spring boot·mybatis
万象.13 小时前
redis缓存和分布式锁
redis·分布式·缓存
_千思_13 小时前
【小白说】数据库系统概念 6
数据库
万象.14 小时前
redis集群算法,搭建,故障处理及扩容
redis·算法·哈希算法
白太岁14 小时前
Redis:(2) hiredis 使用、C++ 封装与连接池
c语言·c++·redis·缓存
野犬寒鸦15 小时前
深入解析HashMap核心机制(底层数据结构及扩容机制详解剖析)
java·服务器·开发语言·数据库·后端·面试
ruxshui16 小时前
元数据及元数据备份、迁移详解
数据库