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]:SCAN 命令及其相…...
计网第五章(运输层)(六)(TCP可靠传输的实现)
目录 一、基本概述 二、具体实现 1.前后沿: 2.利用指针描述发送窗口的状态 3.有差错情况 之前在数据链路层时已经讨论过可靠传输(计网第三章(数据链路层)(二)(可靠传输)&#x…...
酒店外卖小程序商城的作用是什么
随着线上餐品销售属性增强,传统酒店除了承接到店客户,外送也成为生意的一部分,但传统打电话、微信发送的方式无法实现餐品全面呈现和客户随时订购需求,在配送方面也无法规范化。 除此之外,还需要完善营销、会员管理、…...
居家养老一键通的功能
居家养老一键通的功能 居家养老一键通是指为老年人提供全方位的居家养老服务的平台或系统。它通过整合各种资源和服务,为老年人提供便捷、安全、舒适的居家养老环境,帮助他们解决生活中的各种难题。 居家养老一键通的功能通常包括以下几个方面ÿ…...
海外代理IP是什么?如何使用?
一、海外代理IP是什么? 首先,代理服务器是在用户和互联网之间提供网关的系统或路由器。它是一个服务器,被称为“中介”,因为它位于最终用户和他们在线访问的网页之间。 海外IP代理是就是指从海外地区获取的IP地址,用…...
mmdetection v3避坑
命令: 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课程学习笔记
为什么需要使用打包工具? 开发时使用的框架、es6 语法 、less 等浏览器无法识别。 需要经过编译成浏览器能识别的css、js才可以运行。 打包工具可以帮我们编译,号可以做代码压缩、兼容处理、性能优化。 常见的打包工具有什么? vite、webpac…...
c++模版元编程-可变参数模版
在 C 中,我们可以使用模板参数包(Template Parameter Pack)和展开表达式(Expanding Expression)来定义可变参数模板。 模板参数包 模板参数包是一种特殊的语法,用于表示接受多个模板类型参数或非类型参数…...
pcl--第十节 点云曲面重建
曲面重建技术在逆向工程、数据可视化、机器视觉、虚拟现实、医疗技术等领域中得到了广泛的应用 。 例如,在汽车、航空等工业领域中,复杂外形产品的设计仍需要根据手工模型,采用逆向工程的手段建立产品的数字化模型,根据测量数据建…...
【力扣-每日一题】2560. 打家劫舍 IV
class Solution { public:bool check(vector<int> &nums,int max_num,int k){//只需要计算可以偷的房间。在满足最大值为max_num下时,能偷的最多的房间,与k值比较//如果大于K,说明max_num还可以缩小//如果小于看,说明ma…...
vue简单案例----小张记事本
小张记事本 具体效果如图所示,这里就简单展示,还有很多不足的地方,希望大家可以对这个小项目进行改进,话不多说可以参考下面的代码 源代码如下 <html lang"en"><head><meta charset"UTF-8"…...
爬虫获取接口数据
上一讲讲的是获取静态网页数据的教程,适用于我们要爬取的数据在网页源代码中出现,但是还是有很多的数据是源代码中没有的,需要通过接口访问服务器来获得,下面我就来讲讲如何爬取这类数据。 以巨潮资讯网爬取比亚迪企业年报为例。…...
私域流量的变现方式,你知道多少?
私域流量的变现方式是指通过有效的管理和运营自有的用户群体,将流量转化为实际收益的过程。私域流量的变现方式多样,下面将介绍其中几种常见的方式。 1. 电商平台入驻 通过将自有流量引导到电商平台,开设店铺进行商品销售,从中获…...
Webpack配置entry修改入口文件或打包多个文件
当我们使用Webpack进行文件打包时,默认打包的文件是src文件下的index.js文件 一、修改Webpack打包入口 如果我们想要在其他文件下打包指定的js文件就需要在webpack.config.js文件中进行entry配置 二、将指定的多个文件打包为一个文件 现在有两个文件,…...
Mac mini2014(装的windows)重装回MacOS
Mac mini2014(装的windows)重装回MacOS 制作macos的启动U盘,我的是32G的 第一步下载你的硬件能使用的系统,建议最好低一个版本,因为我安装的时候出现问题。 下载地址:https://blog.csdn.net/netgc/article/details/130641479下载…...
珠海建筑模板厂家-能强优品木业:为您提供优质建筑模板解决方案
在珠海这座美丽的沿海城市,建筑行业蓬勃发展,对于高质量的建筑模板需求也日益增加。在这里,有一家备受赞誉的建筑模板厂家,那就是能强优品木业。作为一家专业的建筑模板供应商,他们以优质的产品和卓越的服务在业界享有…...
图像识别技术如何改变智能家居的体验?
图像识别技术在智能家居中的应用正在改变我们的生活体验。通过图像识别技术,智能家居可以更准确地识别用户,并自动调整环境以适应用户的需求。以下是图像识别技术在智能家居中的一些应用: 人脸识别:通过人脸识别技术,智…...
前端中blob文件流和base64的区别
在前端中,base64 和 fileBlob 是用于处理文件数据的两种不同方式。 1. Base64 编码 Base64 是一种将二进制数据转换为文本字符串的编码方式。它将文件数据转换为一串由 ASCII 字符组成的字符串。在前端中,可以使用 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 实现流程…...
什么样的应用程序适合使用Flutter开发桌面?
桌面应用开发的现状 在过去,桌面应用程序的开发通常需要使用特定于操作系统的工具和语言,如C、C#、Java等。这导致了高昂的开发成本和维护困难。尽管有一些跨平台桌面开发工具,如Electron和Qt,但它们在性能、用户体验和开发效率方…...
02强化学习基本概念
强化学习基本概念 前言1、State、Action、Policy等① State② Action③ State transition④ State transition probability⑤ Polity 2、Reward、Return、MDP等① Reward② Trajectory and return③ Discounted return④ Episode⑤ MDP 总结: 前言 本文来自西湖大学…...
笔记2.2:网络应用基本原理
一. 网络应用的体系结构 (1)客户机/服务器结构(Client-Server, C/S) (2)点对点结构(Peer-to-Peer,P2P) (3)混合结构(Hybrid&#x…...
生活垃圾数据集(YOLO版)
文章目录 1、数据集介绍1.1、数据集图片组成2.1、获取数据集方式 2、扩展代码2.1、文件结构树2.2、划分数据集2.3、获取数据集文件名字2.4、文件成功对应检测 3、其他文章 1、数据集介绍 1.1、数据集图片组成 【有害垃圾】:电池(1 号、2 号、5 号&…...
操作系统篇之虚拟内存
虚拟内存是什么? 虚拟内存是计算机操作系统中的一种技术,它将每个进程的内存空间划分成若干个固定大小的页,并通过页面映射技术将这些页与物理内存或磁盘上的页面文件进行交换 虚拟内存能干什么? 扩展了实际物理内存容量:虚拟内存使得每个…...
浅谈SpringMVC的请求流程
目录标题 浅谈SpringMVC的请求流程SpringMVC的介绍SpringMVC的逻辑概念运行图解知识总结 浅谈SpringMVC的请求流程 对于SpringMVC而言重点是了解它的底层运行逻辑,从而可以根据其逻辑来进行实际业务的操作或者是利用原理增强业务的功能性,最终达到项目预…...
2309json.nlohmann数格示例1
参考 示例 下面是一些示例,可让你了解如何使用该类. 除了以下示例之外,你可能还需要: ->检查文档 ->浏览独立示例文件 每个API函数(记录在API文档中)都有相应独立示例文件.如,emplace()函数有一个匹配的emplace.cpp示例文件. 从文件中读取JSON json类提供了操作JSON…...
你知道 delete 删除属性时的一些细节吗?
探究 delete 的一些细节,起源于刚刚做过的一道笔试,原题如下: a 1; const b 2; console.log(delete a); console.log(delete b); // 输出结果是? // 答:true false我可从来没用过 delete 的返回值,但凡…...
Blender入门——快捷键
视角控制 旋转视角:鼠标中键摁住即可旋转平移视角:shift中远近视角:中键滚动 物体控制 移动物体:G旋转物体:R缩放物体:S回复变换:AltG,R,S新建物体:shiftA复制物体:shiftD删除物体&a…...
实例讲解Spring boot动态切换数据源
前言 在公司的系统里,由于数据量较大,所以配置了多个数据源,它会根据用户所在的地区去查询那一个数据库,这样就产生了动态切换数据源的场景。 今天,就模拟一下在主库查询订单信息查询不到的时候,切换数据…...
网站制作公司 佛山/郴州seo快速排名
在查看glsl的函数定义时,经常会看到类型,其实这些不是具体的数据类型,而是一类类型的代称。 genType指的是float, vec2, vec3, or vec4 genIType指的是int, ivec2, ivec3, or ivec4 genUType指的是uint, uvec2, uvec3, or uvec4 genBType…...
漯河市住房和乡镇建设局官方网站/域名查询
1、ant-design的使用总结及常用组件和他们的基本用法? ant-design为React,Angular和Vue都提供了组件,同时为PC和移动端提供了常用的基础组件。ant-design提供的demo非常的丰富并且样式能够基本的覆盖开发需求。antd的Demo因为是多人编写的,…...
宁波做网站的公司/win7系统优化大师
5-硝基-二乙酸荧光素名称 中文名 5-硝基-二乙酸荧光素 英文名 (6-acetyloxy-5-nitro-3-oxospiro[2-benzofuran-1,9-xanthene]-3-yl) acetate 5-硝基-二乙酸荧光素物理化学性质 密度 1.56g/cm3 沸点 666.2C at 760mmHg 分子式 C24H15NO9 分子量 461.37700 闪…...
打好代码怎么做网站/2345网址大全下载到桌面
1 背景 R1属于AS 100,R2、R3和R4属于AS编号为200的一个联盟,R5属于AS300.在联盟AS200中,R2和R4属于成员AS 2001,R3 属于成员AS2002。全网路由器使用直连接口建立BGP邻居关系。需要实现BGP团体属性来实现下面的需求: 10.0.100.2/32这条路由只…...
手机网站建设yu/营销外包公司
2019独角兽企业重金招聘Python工程师标准>>> SOLID五大原则使我们能够管理解决大多数软件设计问题。由Robert C. Martin在20世纪90年代编写了这些原则。这些原则为我们提供了从紧耦合的代码和少量封装转变为适当松耦合和封装业务实际需求的结果方法。使用这些原则&a…...
blog网站模板/查域名的网址
我跳舞也有挺久的了,就自己对音乐的理解来谈下看法,说得不对的地方希望大家指出: 大家都知道一段曲有很多东西组成在一起,我就分开来说一下吧!说出来我嘴巴会爽一些,相信对DANCER和B-BOY都有用!!!!!!!!!!!!! 1.音乐中的鼓点: 首先我为什么不说是节奏而说是鼓点,因为音…...