Redis迭代查询详解及其使用:Scan命令、Sscan命令、Hscan命令、Zscan命令
一、总结
Scan命令又细分为:scan命令,Sscan命令、Hscan命令、Zscan命令。
- scan命令用于迭代字符串中的元素。
- Sscan命令用于迭代集合键中的元素。
- Hscan命令用于迭代哈希键中的键值对。
- Zscan命令用于迭代有序集合中的元素(包括元素成员和元素分值)。
二、scan的由来
Redis中的Keys命令和Smembers命令类似于数据库中的全表扫描,其中,Smembers命令返回集合中的所有的成员,与数据库中的全表扫描无异。由于Redis是单线程,而Keys命令和Smembers命令会造成Redis线程的堵塞,在生产环境需要十分慎重的使用。
为了避免Redis线程的堵塞,出现了查询迭代命令,也就是Scan命令,其用于迭代当前数据库中的缓存数据。Scan 命令是一个基于游标的迭代器,每次被调用之后, 都会向用户返回一个新的游标, 用户在下次迭代时需要使用这个新游标作为Scan命令的游标参数, 以此来延续之前的迭代过程。
Scan命令返回一个包含两个元素的数组,
第一个元素:是用于进行下一次迭代的新游标(如果新游标返回 0 表示迭代已结束)
第二个元素:则是一个数组, 这个数组中包含了所有被迭代的元素。
在同一时间,可以有任意多个客户端对同一数据集进行迭代,客户端每次执行迭代都需要传入一个游标,并在迭代执行之后获得一个新的游标,而这个游标就包含了迭代的所有状态,因此,服务器无须为迭代记录任何状态。因为迭代的所有状态都保存在游标里面,而服务器无须为迭代保存任何状态,所以客户端可以在中途停止一个迭代,而无须对服务器进行任何通知。即使有任意数量的迭代在中途停止,也不会产生任何问题。
例如:
以下是一个SCAN命令的迭代过程示例:
127.0.0.1:6379> scan 0 MATCH ops-coffee-*
1)"38"
2) "ops-coffee-25"
"ops-coffee-19"
"ops-coffee-29"
"ops-coffee-10"
"ops-coffee-23"
"ops-coffee-5"
"ops-coffee-14"
"ops-coffee-16"
"ops-coffee-11"
"ops-coffee-15"
"ops-coffee-7"
"ops-coffee-1"
127.0.0.1:6379> scan 38 MATCH ops-coffee-* COUNT 1000
1) "0"
2) "ops-coffee-13"
"ops-coffee-9"
"ops-coffee-21"
"ops-coffee-6"
"ops-coffee-30"
"ops-coffee-20"
"ops-coffee-2"
"ops-coffee-12"
"ops-coffee-28"
"ops-coffee-3"
"ops-coffee-26"
"ops-coffee-4"
"ops-coffee-31"
"ops-coffee-8"
"ops-coffee-22"
"ops-coffee-27"
"ops-coffee-18"
"ops-coffee-24"
"ops-coffee-17"
参考自:https://www.jianshu.com/p/e325015ad5fa
上面这个例子的意思是扫描所有前缀为“ops-coffee-”的key
- 第一次迭代:使用0作为游标,表示开始一次新的迭代,同时使用了MATCH匹配前缀为ops-coffee-的key,返回了游标值38以及遍历到的数据。
- 第二次迭代:使用的是第一次迭代时返回的游标,也即是命令回复第一个元素的值38,同时通过将COUNT选项的参数设置为1000,强制命令为本次迭代扫描更多元素。
在第二次调用SCAN命令时,命令返回了游标0,这表示迭代已经结束,整个数据集已经被完整遍历过了。
三、扩展
1. linux shell命令
KEYS命令的时间复杂度为O(n),而SCAN命令会将遍历操作分解成m次时间复杂度为O(1)的操作来执行,从而解决使用keys命令遍历大量数据而导致服务器阻塞的情况,使用下边的指令可以达到优雅删除的目的:
redis-cli --scan --pattern "ops-coffee-*" | xargs -L 2000 redis-cli del
其中xargs -L指令表示xargs一次读取的行数,也就是每次删除的key数量,一次读取太多xargs会报错
2. sscan
类似的SCAN命令,对于Redis不同的数据类型还有另外几个SSCAN、HSCAN和ZSCAN,使用方法类似:
sscan ops-coffee 0 MATCH v1*
1) "7"
2) "v15"
"v13"
"v12"
"v10"
"v14"
"v1"
与SCAN命令不同的是这几个命令需要多加一个key的参数,例如本例中的ops-coffee
转载自:
Redis迭代查询详解:Scan命令、Sscan命令、Hscan命令、Zscan命令 - MyBatis中文官网
redis scan 优雅的批量删除 - 简书
Redis迭代查询详解及其使用:Scan命令、Sscan命令、Hscan命令、Zscan命令相关推荐
- Redis分布式锁详解
Redis分布式锁详解 1. 分布式所概述 1.1 分布式锁 2. 缓存数据库Redis 2.1 redis简介 2.2 Springboot整合Redis两种方式 3. 实现验证 3.1 环境准备 ...
- 探索Redis设计与实现6:Redis内部数据结构详解——skiplist
Redis内部数据结构详解(6)--skiplist 2016-10-05 本文是<Redis内部数据结构详解>系列的第六篇.在本文中,我们围绕一个Redis的内部数据结构--skipl ...
- Django 模型层(models) 复杂查询详解
Django 模型层(models) 复杂查询详解 一般Django orm 和原生sql混合使用 1.测试文件 只单独测试django中的某一个py文件 不一定是tests.py 1.配置 在任意一 ...
- Redis最全详解(一)——基础介绍
Redis介绍 redis是基于内存可持久化的日志型.Key-Value数据库.redis安装在磁盘,但是数据存储在内存.非关系型数据库NoSql.开源免费,遵守BSD协议,不用关注版权问题. red ...
- Redis底层数据结构详解
Redis底层数据结构详解 我们知道Redis常用的数据结构有五种,String.List.Hash.Set.ZSet,其他的集中数据结构基本上也是用这五种实现的,那么,这五种是Redis提供给你的数 ...
- Redis内部数据结构详解(2)——skiplist
Redis里面使用skiplist是为了实现sorted set这种对外的数据结构.sorted set提供的操作非常丰富,可以满足非常多的应用场景.这也意味着,sorted set相对来说实现比较复 ...
- Redis AOF 持久化详解
来自公众号:程序员历小冰 Redis 是一种内存数据库,将数据保存在内存中,读写效率要比传统的将数据保存在磁盘上的数据库要快很多.但是一旦进程退出,Redis 的数据就会丢失. 为了解决这个问题,Re ...
- 03 mysql数据查询_MySql学习day03:数据表之间的连接、查询详解
主键: 关键字:primary key 特点:不能为null,并且唯一. 主键分类: 逻辑主键:例如ID,不代表实际的业务意义,只是用来唯一标识一条记录(推荐) 业务主键:例如username,参与实 ...
- 转-Redis AOF 持久化详解
转自: https://juejin.cn/post/6844903902991630349 Redis AOF 持久化详解 Redis 是一种内存数据库,将数据保存在内存中,读写效率要比传统的将数据 ...
- mysql多表查询详解_MySQL多表查询详解上
时光在不经意间,总是过得出奇的快.小暑已过,进入中暑,太阳更加热烈的绽放着ta的光芒,...在外面被太阳照顾的人们啊,你们都是勤劳与可爱的人啊.在房子里已各种姿势看我这篇这章的你,既然点了进来,那就由 ...
最新文章
- 通过IP获取地址,限制某些地址访问(GeoIp)
- JRE System Library、Referenced Libraries、Web App Libraries的含义
- YY一下,扎克伯格做了一个什么样的AI家居助手?
- EA(Enterprise Architect)UML修改字体大小
- 基于SQLite+EF6实现一套自己的Key-Value存储管理工具包(3)
- VIM使用系列之一——配置VIM下编程和代码阅读环境
- jqmobile小技巧
- python批量读取文件内容_Python之批量读取文件【面试必学】
- Golang 接口相等比较注意要点
- bzoj 1612: [Usaco2008 Jan]Cow Contest奶牛的比赛(floyd)
- J1939协议简介【小白入门】
- Windows使用ffmpeg教程
- AI产品经理必懂的硬知识(一):应用领域篇
- PDF编辑器中文版免费下载哪里可以下载?
- 作业三 使用病毒分析工具对病毒进行分析
- 识别电容、电阻的大小,那些电子元件上的103、104、105都是什么含义?
- 采购工作内容是什么?如何成为一名优秀的采购?
- USBTO232的几个问题,乱码,回车无效,驱动安装
- Learn day2 运算/循环/字符串操作
- 自主研发项目四之微信上门洗车III