当前位置: 首页 > news >正文

Redis SCAN命令操作实战(详细)

目录

SCAN 介绍

SCAN 命令基本用法

MATCH 选项用法

COUNT 选项用法

TYPE 选项用法

补充

并发执行多个迭代

中途停止迭代

使用错误的游标进行增量式迭代

迭代终结的保证


SCAN 介绍

SCAN cursor [MATCH pattern] [COUNT count][TYPE type]:SCAN 命令及其相关的 SSCAN 命令、 HSCAN 命令和 ZSCAN 命令都用于增量地迭代(incrementally iterate)一集元素(a collection of elements)

  • MATCH选项:可以通过提供一个 glob 风格的模式参数, 让命令只返回和给定模式相匹配的元素
  • COUNT选项:增量式迭代命令不保证每次迭代所返回的元素数量, 但我们可以使用 COUNT 选项, 对命令的行为进行一定程度上的调整返回最大数量
  • TYPE选项:迭代列出指定的数据类型的元素

增量式迭代命令:

  • SCAN 命令用于迭代当前数据库中的数据库键。
  • SSCAN 命令用于迭代集合键中的元素。
  • HSCAN 命令用于迭代哈希键中的键值对。
  • ZSCAN 命令用于迭代有序集合中的元素(包括元素成员和元素分值)

以上命令每次执行均返回少量元素,而不像keys或smembers命令被用于处理大量数据是极有可能导致阻塞服务器。

SCAN 命令基本用法

SCAN 0:SCAN 命令是一个基于游标的迭代器: SCAN 命令每次被调用之后, 都会向用户返回一个新的游标, 用户在下次迭代时需要使用这个新游标作为 SCAN 命令的游标参数, 以此来延续之前的迭代过程

  • 当 SCAN 命令的游标参数被设置为 0 时, 服务器将开始一次新的迭代, 而当服务器向用户返回值为 0 的游标时, 表示迭代已结束
127.0.0.1:6379> mset a 1 b 1 c 1 d 1 e 1 f 1 g 1 h 1 i 1 j 1 k 1 l 1 m 1 n 1 o 1 p 1 q 1 r 1 s 1 t 1 u 1 v 1 w 1 x 1 y 1 z 1 # 初始化键值对
OK
127.0.0.1:6379> scan 0
1) "1"                    # 返回下次换代的新游标
2)  1) "b"2) "t"3) "m"4) "q"5) "e"6) "u"7) "g"8) "w"9) "h"10) "s"
127.0.0.1:6379> scan 1
1) "27"                   # 返回下次换代的新游标
2)  1) "z"2) "c"4) "l"5) "y"6) "d"7) "a"8) "i"9) "k"10) "o"
127.0.0.1:6379> scan 27
1) "0"                    # 返回0表示迭代结束
2) 1) "v"3) "x"4) "j"5) "p"6) "f"7) "n"8) "r"

  • 在上面这个例子中, 第一次迭代使用 0 作为游标, 表示开始一次新的迭代
  • 第二次迭代使用的是第一次迭代时返回的游标, 也即是命令回复第一个元素的值 1
  • 第三次迭代使用的是第一次迭代时返回的游标, 也即是命令回复第一个元素的值 27
  • 第三次迭代返回第一个元素为0 ,表示迭代已结束。

返回:

  • 反复执行scan命令同一个元素可能会被返回多次
  • 返回的元素个数最多可能会返回数十个元素
  • 返回两个元素的数组:第一个数组元素是用于进行下一次迭代的新游标;第二个是数组是包含了所有被迭代的元素
  • 返回0:表示迭代已经结束, 整个数据集已经被完整遍历过了
  • 从上操作可知:迭代命令并不保证每次执行都返回某个给定数量的元素
    • 甚至可能会返回零个元素, 但只要命令返回的游标不是 0 , 应用程序就不应该将迭代视作结束

MATCH 选项用法

SCAN cursor MATCH pattern:通过提供一个 glob 风格的模式参数, 让命令只返回和给定模式相匹配的元素, 这一点可以通过在执行增量式迭代命令时, 通过给定 MATCH <pattern> 参数来实现。

127.0.0.1:6379> mset a00 1 a001 1 a002 1 a003 1 a014 1 a015 1 a016 1
OK
127.0.0.1:6379> keys *
1) "a001"
2) "a01"
3) "a003"
4) "a014"
5) "a016"
6) "a015"
7) "a002"
8) "a00"
127.0.0.1:6379> scan 0 match *01  # 匹配01结尾的key
1) "0"
2) 1) "a001"2) "a01"
127.0.0.1:6379> scan 0 match a01* # 匹配a01开头的key
1) "0"
2) 1) "a016"2) "a015"3) "a01"4) "a014"

说明:

  • 命令第一步是先执行 scan cursor取出元素列表
  • 命令第二步才执行match操作
  • 所以返回值第二个数组有可能是空的

COUNT 选项用法

SCAN cursor COUNT count:增量式迭代命令不保证每次迭代所返回的元素数量, 但我们可以使用 COUNT 选项, 对命令的行为进行一定程度上的调整

  • 不使用count的情况下,COUNT 参数的默认值为 10
  • 该选项告知迭代命令, 在这次迭代中应该从数据集里返回多少元素
127.0.0.1:6379> mset a0111 1 a0121 1 a0031 1 a0041 1 a0051 1 a0061 1 a0071 1 a0081 1 a0011 1 a0101 1 a0111 1 a0121 1 a0131 1
OK
127.0.0.1:6379> mset a001 1 a002 1 a003 1 a004 1 a005 1 a006 1 a007 1 a008 1 a001 1 a010 1 a011 1 a012 1 a013 1
OK
127.0.0.1:6379> scan 0 count 5
1) "4"
2) 1) "a005"2) "a0041"3) "a0121"4) "a0031"5) "a004"
  • 在迭代一个足够大的集合键时, 如果用户没有使用 MATCH 选项, 那么命令返回的元素数量通常和 COUNT 选项指定的一样, 或者比 COUNT 选项指定的数量稍多一些
127.0.0.1:6379> scan 0 count 5
1) "6"
2) 1) "a22"         # count 5 返回了5个2) "a016"3) "a25"4) "a26"5) "a015"
127.0.0.1:6379> scan 0 count 8
1) "9"
2)  1) "a22"        # count 8 返回了10个2) "a016"3) "a25"4) "a26"5) "a015"6) "a21"7) "a001"8) "a01"9) "a003"10) "a014"
  • 在迭代一个编码为整数集合(intset,一个只由整数值构成的小集合)、 或者编码为压缩列表(ziplist,由不同值构成的一个小哈希或者一个小有序集合)时, 增量式迭代命令通常会无视 COUNT 选项指定的值
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> mset a001 1 a002 1 a003 1 a004 1 a005 1 a006 1 a007 1 a008 1 a001 1 a010 1 a011 1 a012 1 a013 1
127.0.0.1:6379> mset a0111 1 a0121 1 a0031 1 a0041 1 a0051 1 a0061 1 a0071 1 a0081 1 a0011 1 a0101 1 a0111 1 a0121 1 a0131 1127.0.0.1:6379> scan 0 count 8
1) "2"
2)  1) "a005"    # 无似count 8限制,返回了10个2) "a0041"3) "a0121"4) "a0031"5) "a004"6) "a013"7) "a0011"8) "a0081"9) "a012"10) "a0061"

TYPE 选项用法

SCAN cursor TYPE type:type选择保证每次迭代输出均为指定的数据类型


127.0.0.1:6379> get a005
"1"
127.0.0.1:6379> type a005
string
127.0.0.1:6379> scan 0 type string
1) "2"
2)  1) "a005"2) "a0041"3) "a0121"4) "a0031"5) "a004"6) "a013"7) "a012"8) "a0081"9) "a0011"10) "a0061"
127.0.0.1:6379> scan 2 type string
1) "9"
2) 1) "a0101"2) "a010"3) "a008"4) "a007"5) "a0111"6) "a006"7) "a0071"8) "a001"9) "a003"

补充

并发执行多个迭代

在同一时间, 可以有任意多个客户端对同一数据集进行迭代, 客户端每次执行迭代都需要传入一个游标, 并在迭代执行之后获得一个新的游标, 而这个游标就包含了迭代的所有状态, 因此, 服务器无须为迭代记录任何状态。

中途停止迭代

因为迭代的所有状态都保存在游标里面, 而服务器无须为迭代保存任何状态, 所以客户端可以在中途停止一个迭代, 而无须对服务器进行任何通知。

即使有任意数量的迭代在中途停止, 也不会产生任何问题。

使用错误的游标进行增量式迭代

使用间断的(broken)、负数、超出范围或者其他非正常的游标来执行增量式迭代并不会造成服务器崩溃, 但可能会让命令产生未定义的行为。

未定义行为指的是, 增量式命令对返回值所做的保证可能会不再为真。

只有两种游标是合法的:

  • 在开始一个新的迭代时, 游标必须为 0 
  • 增量式迭代命令在执行之后返回的, 用于延续(continue)迭代过程的游标

迭代终结的保证

增量式迭代命令所使用的算法只保证在数据集的大小有界(bounded)的情况下, 迭代才会停止, 换句话说, 如果被迭代数据集的大小不断地增长的话, 增量式迭代命令可能永远也无法完成一次完整迭代。

从直觉上可以看出, 当一个数据集不断地变大时, 想要访问这个数据集中的所有元素就需要做越来越多的工作, 能否结束一个迭代取决于用户执行迭代的速度是否比数据集增长的速度更快。

时间复杂度:增量式迭代命令每次执行的复杂度为 O(1) , 对数据集进行一次完整迭代的复杂度为 O(N) , 其中 N 为数据集中的元素数量。

返回值:

  • SCAN 命令、 SSCAN 命令、 HSCAN 命令和 ZSCAN 命令都返回一个包含两个元素的回复: 回复的第一个元素是字符串表示的无符号 64 位整数(游标), 回复的第二个元素是包含了本次被迭代的元素
  • SCAN 命令返回的每个元素都是一个数据库键
  • SSCAN 命令返回的每个元素都是一个集合成员
  • HSCAN 命令返回的每个元素都是一个键值对,一个键值对由一个键和一个值组成
  • ZSCAN 命令返回的每个元素都是一个有序集合元素,一个有序集合元素由一个成员(member)和一个分值(score)组成

相关文章:

Redis SCAN命令操作实战(详细)

目录 SCAN 介绍 SCAN 命令基本用法 MATCH 选项用法 COUNT 选项用法 TYPE 选项用法 补充 并发执行多个迭代 中途停止迭代 使用错误的游标进行增量式迭代 迭代终结的保证 SCAN 介绍 SCAN cursor [MATCH pattern] [COUNT count][TYPE type]&#xff1a;SCAN 命令及其相…...

计网第五章(运输层)(六)(TCP可靠传输的实现)

目录 一、基本概述 二、具体实现 1.前后沿&#xff1a; 2.利用指针描述发送窗口的状态 3.有差错情况 之前在数据链路层时已经讨论过可靠传输&#xff08;计网第三章&#xff08;数据链路层&#xff09;&#xff08;二&#xff09;&#xff08;可靠传输&#xff09;&#x…...

酒店外卖小程序商城的作用是什么

随着线上餐品销售属性增强&#xff0c;传统酒店除了承接到店客户&#xff0c;外送也成为生意的一部分&#xff0c;但传统打电话、微信发送的方式无法实现餐品全面呈现和客户随时订购需求&#xff0c;在配送方面也无法规范化。 除此之外&#xff0c;还需要完善营销、会员管理、…...

居家养老一键通的功能

居家养老一键通的功能 居家养老一键通是指为老年人提供全方位的居家养老服务的平台或系统。它通过整合各种资源和服务&#xff0c;为老年人提供便捷、安全、舒适的居家养老环境&#xff0c;帮助他们解决生活中的各种难题。 居家养老一键通的功能通常包括以下几个方面&#xff…...

海外代理IP是什么?如何使用?

一、海外代理IP是什么&#xff1f; 首先&#xff0c;代理服务器是在用户和互联网之间提供网关的系统或路由器。它是一个服务器&#xff0c;被称为“中介”&#xff0c;因为它位于最终用户和他们在线访问的网页之间。 海外IP代理是就是指从海外地区获取的IP地址&#xff0c;用…...

mmdetection v3避坑

命令&#xff1a; python tools/test.py projects/DiffusionDet/configs/diffusiondet_r50_fpn_500-proposals_1-step_crop-ms-480-800-450k_coco.py /data/zhangrui/mmdetection-master/checkpoints/diffusiondet_r50_fpn_500-proposals_1-step_crop-ms-480-800-450k_coco_202…...

备份服务器数据库并保存到Git仓库

备份项目及数据库脚本 #!/bin/bash # MySQL数据库信息 DB_HOST"localhost" DB_USER"root" DB_PASS"************" DB_NAME"my-space" # 导出文件目录 EXPORT_PATH"/home/MySpace/mysql" # 获取当前时间并格式…...

尚硅谷wepack课程学习笔记

为什么需要使用打包工具&#xff1f; 开发时使用的框架、es6 语法 、less 等浏览器无法识别。 需要经过编译成浏览器能识别的css、js才可以运行。 打包工具可以帮我们编译&#xff0c;号可以做代码压缩、兼容处理、性能优化。 常见的打包工具有什么&#xff1f; vite、webpac…...

c++模版元编程-可变参数模版

在 C 中&#xff0c;我们可以使用模板参数包&#xff08;Template Parameter Pack&#xff09;和展开表达式&#xff08;Expanding Expression&#xff09;来定义可变参数模板。 模板参数包 模板参数包是一种特殊的语法&#xff0c;用于表示接受多个模板类型参数或非类型参数…...

pcl--第十节 点云曲面重建

曲面重建技术在逆向工程、数据可视化、机器视觉、虚拟现实、医疗技术等领域中得到了广泛的应用 。 例如&#xff0c;在汽车、航空等工业领域中&#xff0c;复杂外形产品的设计仍需要根据手工模型&#xff0c;采用逆向工程的手段建立产品的数字化模型&#xff0c;根据测量数据建…...

【力扣-每日一题】2560. 打家劫舍 IV

class Solution { public:bool check(vector<int> &nums,int max_num,int k){//只需要计算可以偷的房间。在满足最大值为max_num下时&#xff0c;能偷的最多的房间&#xff0c;与k值比较//如果大于K&#xff0c;说明max_num还可以缩小//如果小于看&#xff0c;说明ma…...

vue简单案例----小张记事本

小张记事本 具体效果如图所示&#xff0c;这里就简单展示&#xff0c;还有很多不足的地方&#xff0c;希望大家可以对这个小项目进行改进&#xff0c;话不多说可以参考下面的代码 源代码如下 <html lang"en"><head><meta charset"UTF-8"…...

爬虫获取接口数据

上一讲讲的是获取静态网页数据的教程&#xff0c;适用于我们要爬取的数据在网页源代码中出现&#xff0c;但是还是有很多的数据是源代码中没有的&#xff0c;需要通过接口访问服务器来获得&#xff0c;下面我就来讲讲如何爬取这类数据。 以巨潮资讯网爬取比亚迪企业年报为例。…...

私域流量的变现方式,你知道多少?

私域流量的变现方式是指通过有效的管理和运营自有的用户群体&#xff0c;将流量转化为实际收益的过程。私域流量的变现方式多样&#xff0c;下面将介绍其中几种常见的方式。 1. 电商平台入驻 通过将自有流量引导到电商平台&#xff0c;开设店铺进行商品销售&#xff0c;从中获…...

Webpack配置entry修改入口文件或打包多个文件

当我们使用Webpack进行文件打包时&#xff0c;默认打包的文件是src文件下的index.js文件 一、修改Webpack打包入口 如果我们想要在其他文件下打包指定的js文件就需要在webpack.config.js文件中进行entry配置 二、将指定的多个文件打包为一个文件 现在有两个文件&#xff0c;…...

Mac mini2014(装的windows)重装回MacOS

Mac mini2014(装的windows)重装回MacOS 制作macos的启动U盘&#xff0c;我的是32G的 第一步下载你的硬件能使用的系统&#xff0c;建议最好低一个版本&#xff0c;因为我安装的时候出现问题。 下载地址&#xff1a;https://blog.csdn.net/netgc/article/details/130641479下载…...

珠海建筑模板厂家-能强优品木业:为您提供优质建筑模板解决方案

在珠海这座美丽的沿海城市&#xff0c;建筑行业蓬勃发展&#xff0c;对于高质量的建筑模板需求也日益增加。在这里&#xff0c;有一家备受赞誉的建筑模板厂家&#xff0c;那就是能强优品木业。作为一家专业的建筑模板供应商&#xff0c;他们以优质的产品和卓越的服务在业界享有…...

图像识别技术如何改变智能家居的体验?

图像识别技术在智能家居中的应用正在改变我们的生活体验。通过图像识别技术&#xff0c;智能家居可以更准确地识别用户&#xff0c;并自动调整环境以适应用户的需求。以下是图像识别技术在智能家居中的一些应用&#xff1a; 人脸识别&#xff1a;通过人脸识别技术&#xff0c;智…...

前端中blob文件流和base64的区别

在前端中&#xff0c;base64 和 fileBlob 是用于处理文件数据的两种不同方式。 1. Base64 编码 Base64 是一种将二进制数据转换为文本字符串的编码方式。它将文件数据转换为一串由 ASCII 字符组成的字符串。在前端中&#xff0c;可以使用 JavaScript 的 btoa() 和 atob() 函数…...

MySQL详解六:备份与恢复

文章目录 1. 数据库备份的分类1.1 从物理和逻辑上分类1.1.1 物理备份1.1.2 逻辑备份 1.2 从数据库的备份策略角度上分类1.2.1 完全备份1.2.2 差异备份1.2.3 增量备份 1.3 常见的备份方法 2. MySQL完全备份2.1 完全备份简介2.2 优点与缺点2.3 实现物理冷备份与恢复2.3.1 实现流程…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

NPOI Excel用OLE对象的形式插入文件附件以及插入图片

static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...

NPOI操作EXCEL文件 ——CAD C# 二次开发

缺点:dll.版本容易加载错误。CAD加载插件时&#xff0c;没有加载所有类库。插件运行过程中用到某个类库&#xff0c;会从CAD的安装目录找&#xff0c;找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库&#xff0c;就用插件程序加载进…...