广告
返回顶部
首页 > 资讯 > 精选 >redis中keys与scan命令的区别有哪些
  • 410
分享到

redis中keys与scan命令的区别有哪些

2023-06-14 08:06:29 410人浏览 薄情痞子
摘要

这篇文章将为大家详细讲解有关redis中keys与scan命令的区别有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Redis keys和scan的区别redis的keys命令,通常在用来删除相关ke

这篇文章将为大家详细讲解有关redis中keys与scan命令的区别有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

Redis keys和scan的区别

redis的keys命令,通常在用来删除相关key时使用,但这个命令有一个弊端,在redis拥有数百万及以上的keys时,执行速度会比较慢,更致命的是,这个命令会阻塞redis多路复用的io线程,如果这个线程阻塞,在此期间,其他发向redis服务端的命令,都会被阻塞,从而引发一系列级联反应,导致瞬间相应卡顿,从而引发超时等问题,所以应该在生产环境禁止用使用keys和类似的命令smembers,这种时间复杂度为O(N),且会阻塞主线程的命令,是非常危险的。

如果在生产环境上,我们有需要查找然后删除key的需求,我们应该使用scan命令,来替代key。scan也是O(N)复杂度,支持通配查找key的命令,不同keys的是它采用的是游标按批次迭代返回数据,可以不用阻塞主线程。

scan:渐进式遍历键

SCAN cursor [MATCH pattern] [COUNT count]

scan 参数提供了三个参数(6.0后增加了一个type参数,具体看官方文档),第一个是 cursor 整数值(hash桶的索引值),第二个是 key 的正则模式,第三个是一次遍历的key的数量(参考值,底层遍历的数量不一定),并不是符合条件的结果数量。

第一次遍历时,cursor 值为 0,然后将返回结果中第一个整数值作为下一次遍历的 cursor。

一直遍历到返回的 cursor 值为 0 时结束。

使用案例如下:

redis中keys与scan命令的区别有哪些

从运行结果,我们可以看出几个问题:

虽然我们指定了扫描的count是10,但它实际扫描出来的数量不一定是10

scan他可能遍历出重复的key

这边解释一下,为什么扫描出来得数量不一定是10。这是因为match实际上相当于过滤器的作用,所以scan其实是先扫描10个元素出来,然后再根据pattern一过滤,那么剩下来的满足条件元素就可能没有10个了,甚至可能一个都没有。

此外呢,如果在scan的过程中有键的变化(增加、删除、修改),那么新增的键可能不会被遍历出来,即scan不能保证完整的遍历出所有的键,这是我们开发的时候需要考虑的。

关于更多的细节,比如为什么新增的键可能不能被遍历出来,等我后面更深入的学习了redis底层的数据结构在回来补充。

总之,对于redis的大数量操作,很难做到很精确。

redis中keys与scan命令的区别有哪些

补充:redis模糊查询keys和scan的比较和用法

一、keys

1、语法

keys pattern

2、说明

redis中允许模糊查询的有3个通配符,分别是:*,?,[]

*:通配任意多个字符

?:通配单个字符

[]:通配括号内的某一个字符

3、操作

192.168.230.21:6379[2]> set hello 1OK192.168.230.21:6379[2]> set Word 1OK192.168.230.21:6379[2]> set hellp 1OK192.168.230.21:6379[2]> set ahellog 1OK192.168.230.21:6379[2]> set hellog 1OK192.168.230.21:6379[2]> keys *1) "hello"2) "hellog"3) "hellp"4) "word"5) "ahellog"192.168.230.21:6379[2]> keys *hell*1) "hello"2) "hellog"3) "hellp"4) "ahellog"192.168.230.21:6379[2]> keys hell*1) "hello"2) "hellog"3) "hellp"//知道前面的一些字母,忘记了最后一个字母192.168.230.21:6379[2]> keys hell?1) "hello"2) "hellp"//知道前面的一些字母,忘记了最后两个个字母192.168.230.21:6379[2]> keys hell??1) "hellog"//知道前面四个字母,最后一个字母有可能是p t y 其中的一个192.168.230.21:6379[2]> keys hell[pty]1) "hellp"192.168.230.21:6379[2]>

二、scan

1、语法

SCAN cursor [MATCH pattern] [COUNT count]

2、说明

scan 游标 MATCH <给定模式相匹配的元素> count 每次迭代所返回的元素数量 ,SCAN 命令是增量的循环,每次调用只会返回一小部分的元素。scan会返回两个结果,一个是用于下次遍历的游标,一个是结果集;

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

当 SCAN 命令的游标参数被设置为 0 时, 服务器将开始一次新的迭代, 而当服务器向用户返回值为 0 的游标时, 表示迭代已结束

3、操作

192.168.230.21:6379[2]> keys *1) "hello"2) "hellog"3) "hellp"4) "word"5) "ahellog"192.168.230.21:6379[2]> scan 0 match *ll* count 21) "5"2) 1) "hellp" 2) "hello"192.168.230.21:6379[2]> scan 5 match *ll* count 21) "0"2) 1) "hellog" 2) "ahellog"192.168.230.21:6379[2]>

三、性能对比

我们在获取redis里面的某个db里面的所有数据可以用 `keys `这样的指令来实现。但是存在一个问题就是这样做的话,在数据量很大的情况下效率是很不理想的;

Keys模糊匹配,请大家在实际运用的时候忽略掉。因为Keys会引发Redis,并且增加Redis的CPU占用,情况是很恶劣的;如果数据庞大的话可能需要几秒或更长,对于生产服务器上锁定几秒这绝对是灾难了;

新的命令SCAN出现,它可以帮助我们解决因为用keys遍历大数据量的数据库而导致服务器阻塞的情况,因为它每次都只便利一小部分数据,每次操作对应的时间复杂度是O(1);

关于“redis中keys与scan命令的区别有哪些”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: redis中keys与scan命令的区别有哪些

本文链接: https://www.lsjlt.com/news/269176.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • redis中keys与scan命令的区别有哪些
    这篇文章将为大家详细讲解有关redis中keys与scan命令的区别有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。redis keys和scan的区别redis的keys命令,通常在用来删除相关ke...
    99+
    2023-06-14
  • redis keys与scan命令的区别说明
    redis keys和scan的区别 redis的keys命令,通常在用来删除相关key时使用,但这个命令有一个弊端,在redis拥有数百万及以上的keys时,执行速度会比较慢,更致...
    99+
    2022-11-11
  • Redis中KEYS和SCAN命令的区别和建议
    当我们需要遍历Redis所有key或者指定模式的key时,首先想到的是KEYS命令,例如:keys * 相当于关系型数据库里的select *,因此在一个生产环境中的大Redis数据库中使用这个命令可...
    99+
    2022-10-18
  • Redis遍历所有key的两个命令(KEYS 和 SCAN)
    当我们需要遍历Redis所有key或者指定模式的key时,首先想到的是KEYS命令: KEYS pattern 官网对于KEYS命令有一个提示:  KEYS 的速度非...
    99+
    2022-11-12
  • redis中setex命令和set命令有哪些区别
    这篇文章主要介绍了redis中setex命令和set命令有哪些区别,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。导语:Redis Setex...
    99+
    2022-10-18
  • dos命令与linux命令的区别有哪些
    本文小编为大家详细介绍“dos命令与linux命令的区别有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“dos命令与linux命令的区别有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。dos命令与lin...
    99+
    2023-06-30
  • mongod命令的pidfilepath与mongod.lock区别有哪些
    这篇文章主要介绍“mongod命令的pidfilepath与mongod.lock区别有哪些”,在日常操作中,相信很多人在mongod命令的pidfilepath与mongod.lock区别有哪些问题上存在...
    99+
    2022-10-18
  • redis与jedis的区别有哪些
    redis与jedis的区别有哪些?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!redis与spring的整合一般分为sp...
    99+
    2022-10-18
  • 批处理中Copy与Xcopy命令有哪些区别
    这篇文章主要介绍了批处理中Copy与Xcopy命令有哪些区别,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Copy与Xcopy的区别一,copy不能在有子目录存在的文件中拷贝...
    99+
    2023-06-08
  • redis 中setex、setnx、set、getset 命令的区别与使用
      介绍几个常用的redis命令: SET 命令 set key value 设置指定 key 的值为 value。 如果 key 已经存储其他值, SET 就覆写旧值,且无视类型。 127.0.0.1:6379> set ...
    99+
    2017-09-08
    redis 中setex setnx set getset 命令的区别与使用
  • Redis中常用的命令有哪些
    这篇文章将为大家详细讲解有关Redis中常用的命令有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。  Redis提供了丰富的命令(command)对数据库和各种数据类...
    99+
    2022-10-19
  • Linux的du和df命令有哪些区别
    今天小编给大家分享一下Linux的du和df命令有哪些区别的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1 . Linux ...
    99+
    2023-06-28
  • npm i常见命令有哪些区别
    这篇“npm i常见命令有哪些区别”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“npm i常见命令有哪些...
    99+
    2023-07-05
  • Redis常用的命令有哪些
    这篇文章主要介绍“Redis常用的命令有哪些”,在日常操作中,相信很多人在Redis常用的命令有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Redis常用的命令有哪些”...
    99+
    2022-10-18
  • Redis的通用命令有哪些
    这篇文章主要讲解了“Redis的通用命令有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Redis的通用命令有哪些”吧!Redis 是什么Redis 是...
    99+
    2022-10-19
  • Linux下find和grep命令有哪些区别
    这篇文章将为大家详细讲解有关Linux下find和grep命令有哪些区别,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在使用linux时,经常需要进行文件查找。其中查找的命令主要有find和grep。两个...
    99+
    2023-06-09
  • redis和session的区别有哪些
    这篇文章主要介绍redis和session的区别有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!           ...
    99+
    2022-10-18
  • redis和kafka的区别有哪些
    这篇文章给大家分享的是有关redis和kafka的区别有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。 Kafka与Redis PUB/SUB之间较大的区别在于Ka...
    99+
    2022-10-18
  • ​SSDB和Redis的区别有哪些
    这篇文章主要介绍SSDB和Redis的区别有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!SSDB是一个 C++ 开发的 NoSQL 数据库, 使用 Google 公司开源的 L...
    99+
    2022-10-18
  • redis和Memcached的区别有哪些
    这篇文章主要讲解了“redis和Memcached的区别有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“redis和Memcached的区别有哪些”吧!redis是一个数据库,不过与传统...
    99+
    2023-06-27
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作