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

2023-11-08 09:28

本文主要是介绍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的个数.

这篇关于Redis中的渐进式遍历-Scan命令的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/368996

相关文章

redis中使用lua脚本的原理与基本使用详解

《redis中使用lua脚本的原理与基本使用详解》在Redis中使用Lua脚本可以实现原子性操作、减少网络开销以及提高执行效率,下面小编就来和大家详细介绍一下在redis中使用lua脚本的原理... 目录Redis 执行 Lua 脚本的原理基本使用方法使用EVAL命令执行 Lua 脚本使用EVALSHA命令

Redis 热 key 和大 key 问题小结

《Redis热key和大key问题小结》:本文主要介绍Redis热key和大key问题小结,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、什么是 Redis 热 key?热 key(Hot Key)定义: 热 key 常见表现:热 key 的风险:二、

C#使用StackExchange.Redis实现分布式锁的两种方式介绍

《C#使用StackExchange.Redis实现分布式锁的两种方式介绍》分布式锁在集群的架构中发挥着重要的作用,:本文主要介绍C#使用StackExchange.Redis实现分布式锁的... 目录自定义分布式锁获取锁释放锁自动续期StackExchange.Redis分布式锁获取锁释放锁自动续期分布式

Redis Pipeline(管道) 详解

《RedisPipeline(管道)详解》Pipeline管道是Redis提供的一种批量执行命令的机制,通过将多个命令一次性发送到服务器并统一接收响应,减少网络往返次数(RTT),显著提升执行效率... 目录Redis Pipeline 详解1. Pipeline 的核心概念2. 工作原理与性能提升3. 核

redis过期key的删除策略介绍

《redis过期key的删除策略介绍》:本文主要介绍redis过期key的删除策略,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录第一种策略:被动删除第二种策略:定期删除第三种策略:强制删除关于big key的清理UNLINK命令FLUSHALL/FLUSHDB命

Redis消息队列实现异步秒杀功能

《Redis消息队列实现异步秒杀功能》在高并发场景下,为了提高秒杀业务的性能,可将部分工作交给Redis处理,并通过异步方式执行,Redis提供了多种数据结构来实现消息队列,总结三种,本文详细介绍Re... 目录1 Redis消息队列1.1 List 结构1.2 Pub/Sub 模式1.3 Stream 结

Linux命令之firewalld的用法

《Linux命令之firewalld的用法》:本文主要介绍Linux命令之firewalld的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux命令之firewalld1、程序包2、启动firewalld3、配置文件4、firewalld规则定义的九大

Linux之计划任务和调度命令at/cron详解

《Linux之计划任务和调度命令at/cron详解》:本文主要介绍Linux之计划任务和调度命令at/cron的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux计划任务和调度命令at/cron一、计划任务二、命令{at}介绍三、命令语法及功能 :at

SpringBoot中配置Redis连接池的完整指南

《SpringBoot中配置Redis连接池的完整指南》这篇文章主要为大家详细介绍了SpringBoot中配置Redis连接池的完整指南,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以... 目录一、添加依赖二、配置 Redis 连接池三、测试 Redis 操作四、完整示例代码(一)pom.

Linux ls命令操作详解

《Linuxls命令操作详解》通过ls命令,我们可以查看指定目录下的文件和子目录,并结合不同的选项获取详细的文件信息,如权限、大小、修改时间等,:本文主要介绍Linuxls命令详解,需要的朋友可... 目录1. 命令简介2. 命令的基本语法和用法2.1 语法格式2.2 使用示例2.2.1 列出当前目录下的文