当前位置: 首页 > 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 实现流程…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...