Redis中的Scan命令的使用

5 篇文章 0 订阅
订阅专栏

Redis中的Scan命令的使用

Redis中有一个经典的问题,在巨大的数据量的情况下,做类似于查找符合某种规则的Key的信息,这里就有两种方式,
一是keys命令,简单粗暴,由于Redis单线程这一特性,keys命令是以阻塞的方式执行的,keys是以遍历的方式实现的复杂度是 O(n),Redis库中的key越多,查找实现代价越大,产生的阻塞时间越长。
二是scan命令,以非阻塞的方式实现key值的查找,绝大多数情况下是可以替代keys命令的,可选性更强

以下写入100000条key***:value***格式的测试数据(ps:用pipline的话,1w一笔,每一笔在秒级完成)

# -*- coding: utf-8 -*-
# !/usr/bin/env python3
import redis
import sys
import datetime

def create_testdata():
    r = redis.StrictRedis(host='***.***.***.***', port=***, db=0, password='***')
    counter = 0
    with r.pipeline(transaction=False) as p:
        for i in range(0, 100000):
            p.set('key' + str(i), "value" + str(i))
            counter = counter + 1
            if (counter == 10000):
                p.execute()
                counter = 0
                print("set by pipline loop")

if __name__ == "__main__":
    create_testdata()

比如这里查询key111开头的key有哪些?
若使用keys命令,则执行keys key1111*,一次性全部查出来。

在这里插入图片描述

同样,如果使用scan命令,则用 scan 0 match key1111* count 20
在这里插入图片描述

scan的语法为:SCAN cursor [MATCH pattern] [COUNT count] The default COUNT value is 10.

SCAN命令是一个基于游标的迭代器。这意味着命令每次被调用都需要使用上一次这个调用返回的游标作为该次调用的游标参数,以此来延续之前的迭代过程。
这里使用scan 0 match key1111* count 20命令来完成这个查询,稍显意外的是,使用一开始都没有查询到结果,这个要从scan命令的原理来看。
scan在遍历key的时候,0就代表第一次,key1111*代表按照key1111开头的模式匹配,count 20中的20并不是代表输出符合条件的key,而是限定服务器单次遍历的字典槽位数量(约等于)。

那么,什么又叫做槽的数据?这个槽是不是Redis集群中的slot?答案是否定的。其实上图已经给出了答案了。
如果上面说的“字典槽”的数量是集群中的slot,又知道集群中的slot数量是16384,那么遍历16384个槽之后,必然能遍历出来所有的key信息,
上面清楚地看到,当遍历的字典槽的数量20000的时候,游标依旧没有走完遍历结果,因此这个字典槽并不等于集群中的slot的概念。
经过测试,在scan的时候,究竟遍历多大的COUNT值能完全match到符合条件的key,跟具体对象的key的个数有关,
如果以超过key个数的count来scan,必定会一次性就查找到所有符合条件的key,比如在key个数为10W个的情况下,一次遍历20w个字典槽,肯定能完全遍历出来结果。
在这里插入图片描述

scan 指令是一系列指令,除了可以遍历所有的 key 之外,还可以对指定的容器集合进行遍历。
zscan 遍历 zset 集合元素,
hscan 遍历 hash 字典的元素、
sscan 遍历 set 集合的元素。
SSCAN 命令、 HSCAN 命令和 ZSCAN 命令的第一个参数总是一个数据库键(某个指定的key)。

另外,使用redis desktop manager的时候,当刷新某个库的时候,控制台自动不断刷新scan命令,也就知道它在干嘛了

在这里插入图片描述

参考

Redis SCAN 命令
Redis key(键)

Redis Scan 命令用于迭代数据库中的数据库键。

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

SCAN 返回一个包含两个元素的数组, 第一个元素是用于进行下一次迭代的新游标, 而第二个元素则是一个数组, 这个数组中包含了所有被迭代的元素。如果新游标返回 0 表示迭代已结束。

相关命令:

SSCAN 命令用于迭代集合键中的元素。
HSCAN 命令用于迭代哈希键中的键值对。
ZSCAN 命令用于迭代有序集合中的元素(包括元素成员和元素分值)。
语法
redis Scan 命令基本语法如下:

SCAN cursor [MATCH pattern] [COUNT count]
cursor - 游标。
pattern - 匹配的模式。
count - 指定从数据集里返回多少元素,默认值为 10 。
可用版本
>= 2.8.0

返回值
数组列表。

实例
使用 SCAN 命令迭代:

redis 127.0.0.1:6379> scan 0   # 使用 0 作为游标,开始新的迭代
1) "17"                        # 第一次迭代时返回的游标
2)  1) "key:12"
    2) "key:8"
    3) "key:4"
    4) "key:14"
    5) "key:16"
    6) "key:17"
    7) "key:15"
    8) "key:10"
    9) "key:3"
   10) "key:7"
   11) "key:1"
redis 127.0.0.1:6379> scan 17  # 使用的是第一次迭代时返回的游标 17 开始新的迭代
1) "0"
2) 1) "key:5"
   2) "key:18"
   3) "key:0"
   4) "key:2"
   5) "key:19"
   6) "key:13"
   7) "key:6"
   8) "key:9"
   9) "key:11"
 

参考:http://jinguoxing.github.io/redis/2018/09/04/redis-scan/

windows脚本echo含义
weixin_41888877的博客
11-09 1012
.bat@echo off的意义 @echo off   echo  回显命令,将此命令后的内容显示到控制台上 @echo off  表示关闭该命令后所有命令的回显。echo off 表示关闭其他所有命令回显,@作用就是关闭紧跟在其后的一条命令的回显。 简单的说 @echo off   执行后,后面所有的命令均不显示,包括本命令 echo off     执行后,后面所有的命令均不显示,不包括本命令 ...
Redis】4、Scan 命令
最新发布
呆呆的猫的博客
03-20 2095
SCAN 命令
Redis专题】scan命令
weixin_41248819的博客
12-29 770
SCAN cursor [MATCH pattern] [COUNT count] SCAN 命令及其相关的 SSCAN 命令、 HSCAN 命令和 ZSCAN 命令是基于游标的迭代器,用于实现增量地迭代redis数据。每次被调用都使用上一次这个调用返回的游标作为该次调用的游标参数,以此来延续之前的迭代过程;该命令返回的值为:下一次迭代开始的游标(当该值为0时,表示迭代查询完成);及本次迭代获取到的满足条件的数据列表 scan 遍历所有key zscan 遍历 zset 集合元素, hscan ..
redis scan命令
johnhuster的专栏
08-12 2791
redis是当前使用很广泛的一款内存key-value软件,有时需要查询下目前redis内存里面有哪些满足条件的键值,在线上系统一定不要使用keys命令,该命令会导致redis停止一切工作,如果redis键值要很多的话会导致redis长时间内都不会响应其他任何命令,这个时候scan命令就呼之欲出了,scan命令可以达到keys命令的效果同时又不会redis出现类似stop-the-world事件的...
Redis-SCAN命令
LLKET的博客
08-23 4559
一、背景 由于Redis是单线程的,因此在使用一些像KEYS、SMEMBERS等时间复杂度为O(N)的命令时,数据量大的键就会阻塞进程,导致Redis卡顿。 Redis在2.8版本之后增加了SCAN命令: SCAN cursor [MATCH pattern] [COUNT count] SCAN及相关命令: SCAN 命令用于迭代当前数据库的数据库键 SSCAN 命令用于迭代集合键(Set)的元素 HSCAN 命令用于迭代哈希键(Hash)的键值对 ZSCAN 命令用于迭代有序集合(Sorted
FarelDB 第7章 第15讲 键值对命令 键操作类(key) 之 SCAN cursor
weixin_53142030的博客
07-25 91
SCAN 返回当前使用的kv数据表符合匹配模式的键的元素数组,下一次游标即为当前游标加返回元素个数。
RedisScan命令的踩坑实录
01-21
但是最近在使用redis的scan的命令式却踩了一个坑,顿时发觉自己原来对redis的游标理解的很有限。所以记录下这个踩坑的过程,背景如下: 公司因为redis服务器内存吃紧,需要删除一些无用的没有设置过期时间的key。...
RedisScan命令的基本使用教程
01-19
二是scan命令,以非阻塞的方式实现key值的查找,绝大多数情况下是可以替代keys命令的,可选性更强 以下写入100000条key***:value***格式的测试数据(ps:用pipline的话,1w一笔,每一笔在秒级完成) # -*- coding: ...
Redisscan命令的深入讲解
09-09
主要给大家介绍了关于Redisscan命令的相关资料,文通过示例代码介绍的非常详细,对大家学习或者使用redis具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
redis数据类型及api操作,建议收藏
yueyunyin的博客
09-06 306
key keys * scan 0 match * count 1 exists key 判断某个key是否存在 move key db 当前库就没有了,到指定的库去了 expire key 为给定的key设置过期时间 ttl key 查看还有多少时间过期 -1表示永不过期 -2表示已过期 type key 查看key是什么类型 1.string string是redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。 string类型是二进制安全的。意思是re
Java代码Redis的scan方法cursor(即scanResult.getStringCursor())返回乱码
Receptive2WE的博客
03-11 5775
Java代码Redis的scan方法cursor返回乱码 scanResult.getStringCursor 乱码 JedisDataException: ERR invalid cursor
Linux的scan命令,linux的scan命令
weixin_33759613的博客
05-01 1765
Linux下scan命令主要是以scanf的形式使用转换符解析字符串,下面由学习啦小编为大家整理了linux下scan命令的相关知识,希望对大家有帮助!linux的scan命令详解scan - 以sscanf的形式使用转换符解析字符串语法:scan string format ?varName varName ...?介绍:scan命令根据format的格式解析string并给varName赋值,...
scan命令
Hanyinh的博客
05-06 835
Redis scan 命令踩坑,千万别乱用!! 总结: redis提供了scan命令,就是用于增量迭代的。 这个命令可以每次返回少量的元素,所以这个命令十分适合用来处理大的数据集的迭代,可以用于生产环境。 count选项后面跟的数字并不是意味着每次返回的元素数量,而是scan命令每次遍历字典槽的数量。 所以在使用scan命令的时候,如果需要迭代的遍历,需要每次调用都需要使用上一次这个调用返回的游标作为该次调用的游标参数,以此来延续之前的迭代过程。 ...
redis深入学习-05—redisscan的用法
jll126的博客
06-14 688
12321
Redis Scan的使用方式以及Spring redis的坑
热门推荐
hashcon
10-17 7万+
SpringRedisTemplate针对这个Scan进行了封装,示例使用(针对最新库spring-data-redis-1.8.1.RELEASE):Set<Object> execute = redisTemplate.execute(new RedisCallback<Set<Object>>() { @Override public Set<Object> doInRedis(
HBase Scan命令详解
zy353003874的博客
09-16 1万+
hbasescan命令是我们经常使用到的,而filter的作用尤其强大。这里简要的介绍下scan下filter命令使用. 插入scan命令需要的数据 这里模拟了部分微博评论的数据,然后使用代码插入数据到hbase,代码就不列出来了比较简单。 public class Comment { //1-->普通文章,2--->热点文章 Integer articleType; //文章id String articleId; String userId;
redis的SCAN命令用法
stay hungry ! stay foolish!
05-01 2915
redis的SCAN命令用法 MATCH:功能对元素的模式匹配工作是在命令从数据集取出元素后和向客户端返回元素前的这段时间内进行的, 所以如果被迭代的数据集只有少量元素和模式相匹配, 那么迭代命令或许会在多次执行都不返回任何元素。 详情见官网链接http://www.redis.cn/commands/scan.html jav...
Python RedisScan遇到问题
weixin_30256505的博客
07-10 2453
在项目启动需要删除redis原先相同key储存的值,所以使用scan_iter来便利相关的key,并删除。 这里需要注意两个性能问题 1. scan_iter的模糊匹配的过滤器要正确,否则会带来很多无畏的查询, 例如:原本redis储存了a:b:c 而scan的时候多了空格 a: b:c 2. 有很多key要删除的时候使用 delete(*key)一次性删除key列表,而代替一个一个删除...
Redis的Scan命令
05-05
Redis的`SCAN`命令是用于迭代数据库的键。它可以遍历整个数据库,并返回与给定模式匹配的键。它的语法如下: ``` SCAN cursor [MATCH pattern] [COUNT count] ``` 其,`cursor`表示当前迭代的位置,`MATCH`和`COUNT`是可选参数,用于筛选和限制迭代结果的数量。 `SCAN`命令返回两个值:下一个迭代的位置和迭代结果。迭代结果是一个包含键的列表,列表的长度最多为`COUNT`指定的值。如果没有指定`COUNT`,则默认返回10个键。 使用`SCAN`命令可以有效地遍历Redis的大量键,而不会对服务器产生太大的负载。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 华为-STP生成树协议-理论加操作(附实验配置详解) 72738
  • 华为-ACL-访问控制列表(基础理论与配置实验详解) 42267
  • 华为--NAT技术easy IP 原理配置or实验详解 38751
  • Linux-centos8 网络服务--查看网络设置,测试网络连接,设置网络地址参数,修改网络配置文件详解 理论+实操(兼容centos7) 9977
  • linux -centos7-U盘挂载失败之 mount: 未知的文件系统类型“ntfs”破解之法 9803

分类专栏

  • 网络基础篇 10篇
  • openstack 1篇
  • Python入门到放弃
  • 监控 4篇
  • 数据库mysql 12篇
  • 排障合集 11篇
  • k8s 之资源发布 3篇
  • kubernetes(k8s)集群 19篇
  • linux操作篇 31篇
  • linux 知识命令大全 13篇
  • 存储 4篇
  • 分布式 1篇
  • keepalive 1篇
  • LVS负载均衡 1篇
  • nacos 1篇
  • redis 5篇
  • Tomcat 1篇
  • docker 容器 14篇
  • ansible 3篇
  • rsync 远程同步 1篇
  • mongodb 2篇
  • linux网络篇 12篇
  • squid代理 2篇
  • 华为网络设备交互篇 14篇
  • 群集部署 4篇
  • ELK,EFK ..日志分析 1篇
  • ECS 1篇
  • VIMWARE 1篇
  • Web服务器群集 11篇
  • kubeadm 3篇
  • 5G篇 2篇
  • shell 7篇

最新评论

  • IP子网划分 和 5层7层网络参考模型

    CSDN-Ada助手: 哇, 你的文章质量真不错,值得学习!不过这么高质量的文章, 还值得进一步提升, 以下的改进点你可以参考下: (1)使用更多的站内链接;(2)提升标题与正文的相关性。

  • 华为-ACL-访问控制列表(基础理论与配置实验详解)

    2301_77338160: 你这有问题呀,在还有思科的?

  • 华为-STP生成树协议-理论加操作(附实验配置详解)

    qq_52597712: 因为都不在一个网段怎么通

  • oracle ,mysql5.7 数据库表字段添加、修改、删除等DDL操作

    Hoshea_sun: ** 语法:alter table tablename rename column name to name1; 说明:alter table 表名rename column 原字段名 to 更改后的字段名; 举例:ALTER TABLE tb_permission_user RENAME COLUMN NAME TO ch_name; 这个不是mysql5.7里边的语法吧。这个是8.0版本的。我刚看了官网技术文档。

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • 如何快速找到被监控组件的开源GRAFANA模版文件
  • mysql中的group by 和 having使用
  • k8s 系列之 CoreDNS 解读
2023年4篇
2022年5篇
2021年6篇
2020年144篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

聚圣源k8jd初生儿起名打分结果属马的人起什么名字好电脑c盘满了怎么清理带符号游戏起名大全蓬莱疫情大连疫情新增2人华中科技大学同济医学院附属梨园医院起名的大师们家居软装设计棋牌室起什么名字更好三个人三天喝了三桶水九个人九天喝了几桶水免费起名免费生辰八字取名字四神汤蒙古人的名字表决心的话酷猫影视沦落的五课dnf起名起名字李女孩子重庆社区论坛中医药起名字梅花三弄之鬼丈夫战地2地图下载小小孩起名网顾问公司起什么名字好易经起名大全测试打分天空不要为我掉眼泪ddr31333姓张女宝起名大全淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男孩疑遭霸凌 家长讨说法被踢出群国产伟哥去年销售近13亿网友建议重庆地铁不准乘客携带菜筐雅江山火三名扑火人员牺牲系谣言代拍被何赛飞拿着魔杖追着打月嫂回应掌掴婴儿是在赶虫子山西高速一大巴发生事故 已致13死高中生被打伤下体休学 邯郸通报李梦为奥运任务婉拒WNBA邀请19岁小伙救下5人后溺亡 多方发声王树国3次鞠躬告别西交大师生单亲妈妈陷入热恋 14岁儿子报警315晚会后胖东来又人满为患了倪萍分享减重40斤方法王楚钦登顶三项第一今日春分两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?周杰伦一审败诉网易房客欠租失踪 房东直发愁男子持台球杆殴打2名女店员被抓男子被猫抓伤后确诊“猫抓病”“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火男孩8年未见母亲被告知被遗忘恒大被罚41.75亿到底怎么缴网友洛杉矶偶遇贾玲杨倩无缘巴黎奥运张立群任西安交通大学校长黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发妈妈回应孩子在校撞护栏坠楼考生莫言也上北大硕士复试名单了韩国首次吊销离岗医生执照奥巴马现身唐宁街 黑色着装引猜测沈阳一轿车冲入人行道致3死2伤阿根廷将发行1万与2万面值的纸币外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万手机成瘾是影响睡眠质量重要因素春分“立蛋”成功率更高?胖东来员工每周单休无小长假“开封王婆”爆火:促成四五十对专家建议不必谈骨泥色变浙江一高校内汽车冲撞行人 多人受伤许家印被限制高消费

聚圣源 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化