Redis中的渐进式遍历-Scan命令

之前我们学习过遍历命令keys,而keys *是一次性的把整个redis中所有的key都获取到.在不知道当前redis中有多少key的情况下,这个操作是非常危险的,可能会一下子得到太多的key而阻塞redis服务器.从而使其他redis客户端卡顿.

通过渐进式遍历,就可以做到,既可以获取到所有的key,同时又不会阻塞服务器.

渐进式遍历,不是一个命令把所有的key都拿到,而是每执行一次命令,只会获取其中的一部分,要想得到所有的key就需要多次执行渐进式遍历命令,进行多次遍历.

渐进式命令其实是一组命令,这一组命令的使用方法是一样的,其中的代表命令就是scan.

cursor:代表光标,指向了当前遍历的位置.

首次scan光标是从0开始的,当scan返回的下次光标的位置是0的时候,就代表完成了一次完整的遍历了.

注意此处的光标不能理解为下标,光标不是一个连续递增的整数,仅仅是一个"字符串",只有redis服务器知道这个光标对应的元素位置,redis客户端和程序员是不知道的.

光标设置成0,意味着这一次遍历是从头开始获取的,返回值的前半部分表示下次遍历,光标应该从哪里开始;后半部分则表示真正遍历到的key的内容.

pattern就和keys命令的里pattern一样.指的是字符串匹配规则.

count表示此次遍历要获取多少个key.注意此处的count只是给redis服务器一个"建议",写入的count和实际返回的key的个数不一定是一致的,可能会多几个,也可能会少几个,但是总体上不会相差太多.

type:指定要遍历的key的value类型是什么,比如写string就表示此次遍历遍历出的key对应的value类型都是string.

count这里的数字不是说每次遍历都得设置成一样.

这里的渐进式遍历,在遍历过程中,不会在服务器这里存储任何的状态信息,此处的遍历时是随时可以终止的,不会对服务器产生任何的副作用.

渐进式遍历scan虽然解决了阻塞的问题,但如果在遍历期间key有所变化(增加或者删除),可能导致遍历时键的重复遍历或者遗漏,这一点要特别注意!!!


redis中的数据库管理

redis中也是有database这样的概念的,只不过不像mysql那样可以随意的创建和删除database,redis中的database都是现成的,用户不能创建新的数据库也不能删除已有的数据库.

默认redis给用户提供了16个数据库(0-15),这16个数据库中的数据是隔离的,相互之间不会有影响.

默认情况下使用的数据库都是0号.

可以使用select dbIndex来切换数据库.实际使用redis很少会关注到数据库,一般都是默认使用0号数据库就可以了.

切换到0-15之外的会报错.

flushdb是删除当前数据库中所有的key,flushall删除所有数据库中的key.

时间复杂度都是O(N),flushdb中N指的是当前数据库中的key的个数,flushall中的N是所有数据库中key的个数.

上述两个命令在生产环境里要慎用!!!!!!!

dbsize用来查询当前数据库中key的个数.

相关推荐
Muscleheng1 小时前
Navicat连接postgresql时出现‘datlastsysoid does not exist‘报错
数据库·postgresql
罗超驿2 小时前
18.事务的隔离性和隔离级别:MySQL面试高频考点全解析
数据库·mysql·面试
jran-2 小时前
Redis 命令
数据库·redis·缓存
小江的记录本2 小时前
【Java基础】Java 8-21新特性:JDK21 LTS:虚拟线程、模式匹配switch、结构化并发、序列集合(附《思维导图》+《面试高频考点清单》)
java·数据库·python·mysql·spring·面试·maven
189228048612 小时前
NY382固态MT29F32T08GSLBHL8-24QM:B
大数据·服务器·人工智能·科技·缓存
June`3 小时前
多线程redis下如何解决aof重写和rdb持久化的数据一致性问题
数据库·redis·缓存
二宝哥3 小时前
离线安装maven
java·数据库·maven
SZLSDH3 小时前
场景适配论 | 数字孪生IOC建设中渲染技术与智能体能力的协同逻辑
前端·数据库·ai·数字孪生·数据可视化·智能体
这个DBA有点耶3 小时前
SQL改写实战:子查询、CTE、窗口函数性能对比
数据库·mysql·性能优化
@我漫长的孤独流浪3 小时前
数据库完整性约束全解析:从理论到实践
数据库