在平时我们维护线上Redis的时候需要从n个key里面找到某些特定规则的key,可能查看某些key可能清理某些不需要的key,可能我们第一印象就是keys这个指令,我们可以使用这个指令匹配我们想要的key,下面我们来试试。

keys指令基本用法

> mset name1 a name2 a na1me a na2me aOK> keys name*1) "name"2) "name2"3) "name1"> keys na*me1) "name"2) "na1me"3) "na2me"

这个指令使用非常简单,但是还是存在非常多的问题:

  1. 没有一个类似获取某几条或某个区间的搜索,比如我只想要搜索第一条,比如我想分页搜索获取第一页的10条数据。

  2. keys的方法是遍历整个redis树,执行效率是O(n),所以当我们搜索的key非常庞大的时候。必须等到这个指令执行完后才能执行其他指令,redis搜索会延迟,这样会阻塞其他指令或者延迟等问题。

所以针对这个问题,我们的Redis在2.8版本提出了scan这个指令,那么这个指令有哪些特色呢?

  1. 复杂度虽然也是O(n),但它是通过游标分步进行的,不会阻塞线程 。

  2. 提供limit参数,可以控制每次返回结果的最大条数,limit只是个hint,返回的结果可多可少。

  3. 同keys一样,它也提供模式匹配功能。

  4. 服务器不需要为 游标保存状态 ,游标的唯一状态就是 scan 返回给客户端的游标整数。

  5. 返回的结果可能会有重复,需要客户端去重,这点非常重要。

  6. 遍历的过程中如果有数据修改,改动后的数据能不能遍历到是不确定的。

  7. 单次返回的结果是空的并不意昧着遍历结束,而要看返回的游标值是否为零。

scan指令基本用法

..........漫长的添加数据> scan 0 match name* count 101) "30"2)  1) "name3"    2) "name9"    3) "name12"    4) "name"    5) "name6"    6) "name8"    7) "name11"    8) "name4"    9) "name2"   10) "name7"> scan 30 match name* count 101) "0"            #游标为0,没有数据了2) 1) "name10"   2) "name5"   3) "name1"

scan遍历原理

首先我们介绍redis整个模型,redis简单来讲其实就是一个大的字典,关于字典不了解的同学可以查看我的redis字典基础。字典是由一维数组+链表构成,那么我们把这个一维数组叫做槽当然也有叫桶的,那么scan遍历的时候就是遍历这个槽,那么在上面我们发现有时候我们想返回10条记录,但是redis返回的并没有10条,这是因为我们的scan遍历槽,每个槽下面不一定有链表或者链表值不一定只有一个,所以我们在有些时候使用scan返回的数据是不规则的就是这个原因。

关于scan的遍历顺序

scan的遍历顺序和我们普通的顺序不同,普通方式就是从0->1->2->3....这样遍历下去,而scan的遍历规则是反过来的,这样的特殊遍历方式是考虑到字典扩容和内存回收字典收缩时避免槽位重复或者冲突。scan指令扩展

scan指令是一系列指令,除了可以遍历所有的key之外,还可以对指定的容器

集合进行遍历。

比如zscan遍历zset集合元素,hscan遍历hash字典的元素,sscan遍历set集合的元素。

它们的原理同scan类似,因为hash底层就是字典,set也是一个特殊的hash(所有的value指向同一个元素,zset内部也使用了字典来存储所有的元素内容。

避免大key扫描

比如我们在操作hash或者zset的时候,它的底层实现是一个字典,我们知道当字典的值到达一定程度的时候就会扩容,每次扩容的时候都会开辟一个更大的内存空间,如果在集群环境中,这个key或被迁移或被删除会影响系统性能导致系统卡顿现象,我们在运维redis系统的时候如果说redis内存大起大落的很有可能就是大key回收导致的。

那么我们在开发过程中如何避免呢?这里我们就需要用到scan指令了,对于扫描出来的每一个key,使用type指令获得key的类型,然后使用相应数据结构的size或者len方法来得到它的大小,对于每一种类型,将大小排名的前若干名作为扫描结果展示出来。

上面这样的过程需要编写脚本,比较烦琐,不过Redis官方已经在redis-cli指令

redis-cli -h 127.0.0.1 -p 7001 --bigkeys -i 0.1

一名正在抢救的coder

笔名:mangolove

CSDN地址:https://blog.csdn.net/mango_love

GitHub地址:https://github.com/mangoloveYu

Redis快速扫描Scan相关推荐

  1. golang快速扫描

    利用golang的并发优势快速扫描端口 Scanner startIp [endIp] port thread package main import ( "flag" " ...

  2. 索引全扫描与索引快速扫描的区别

    1.索引全扫描(index full scan),跟随全表扫描样,索引也存在全扫描.全索引扫描只在CBO下有效,当优化器认为全索引扫描比全表扫描更有效时,才使用全索引扫描. 例如:select id ...

  3. 存储型xss漏洞怎么解决_FinDOMXSS:一款针对DOM型XSS漏洞的快速扫描工具

    FinDOM-XSS FinDOM-XSS是一款针对DOM型XSS漏洞的快速扫描工具,广大安全研究人员可以利用FinDOM-XSS快速地发现/扫描出目标应用中潜在的DOM型XSS漏洞. 工具安装 广大 ...

  4. 优缺点 快速扫描 硬盘监测_机械硬盘坏道如何检测与修复?看完这篇你就知道了...

    电脑硬盘使用几年之后,特别是经常不正确关闭计算机(非法关机)的用户,如果出现电脑不明原因卡顿.经常提示系统文件丢失.蓝屏等故障,说明电脑硬盘已经出现逻辑坏道了,如果发现得早,是可以利用硬盘管理工具Di ...

  5. 【转】Android bluetooth介绍(三): 蓝牙扫描(scan)设备分析

    原文网址:http://blog.csdn.net/xubin341719/article/details/38584469 关键词:蓝牙blueZ  A2DP.SINK.sink_connect.s ...

  6. 使用 arp-scan 快速扫描局域网 IP -> raspberry pi ssh vnc

    简介 在使用 ssh/vnc 对树莓派进行远程操作的时候,都需要获取树莓派的 IP.常见的办法是路由器管理页面或者使用 Advanced IP Scanner.但是我既没有路由器,也没搞懂这个软件怎么 ...

  7. Redis 快速提高系统性能的银弹

    GitChat 作者:拿客_三产 原文:Redis 快速提高系统性能的银弹 关注微信公众号:GitChat 技术杂谈 ,一本正经的讲技术 [不要错过文末彩蛋] 前言 说明:阅读该文章需要一定 Web ...

  8. 端口扫描程序 快速扫描 多线程、范围端口、范围IP、查看历史记录 Windows/MacOS

    支持平台 Windows7.Windows8.Windows10.MacOS10.15以上(MacOS10.15以下会有权限问题) 简介 设计思路: 1.对指定IP段的端口进行扫描. 2.基于多线程, ...

  9. 【检测工具】奇安信CVE-2020-0796快速扫描检测工具使用手册

    奇安信 CVE-2020-0796 漏洞快速扫描检测工具是奇安信公司针对"Microsoft SMBv3 远程代码执行漏洞 CVE-2020-0796"推出的一款远程扫描工具. 一 ...

最新文章

  1. evaluate函数使用无效_[Python实战]使用栈实现简易计算器
  2. Angular-在服务和组件中使用管道
  3. java element 获取属性_java 获取类,属性变量,方法,方法参数上注解的值等
  4. 《DSP using MATLAB》Problem 7.4
  5. html 鼠标移动3d视图,HTML5 鼠标悬停3D平面摇晃动效
  6. HttpServletRequest对象
  7. STM32输出比较模式和PWM模式 比较
  8. linux重定向权限不够,linux – 如何使用sudo将输出重定向到一个我没有权限写入的位置?...
  9. 第二届360杯全国大学生信息安全技术大赛部分解题思路(加密解密题)
  10. html%3c arial%3e,【博客园】样式美化+网站统计访问+添加网易云背景音乐
  11. STC学习:扫描频率可变的电子钟
  12. 硅谷战争:苹果、Google和微软上演三国演义
  13. 如何取消Idea里面的中文语法检查
  14. LINUX HTB队列规定用户指南
  15. 高频信号发生器设计—电容三点式振荡电路
  16. SQL Server Always Encrypted加密使用
  17. AWS部署大淘客CMS
  18. 1024(Windows考点整理)
  19. 原厂技术支持FLD5302和FLD5303升压充电芯片
  20. YOLOv4网络详解

热门文章

  1. AE学习笔记——第二章:AE图层中的图层用法及基本操作
  2. (计算机组成原理)第三章存储系统-第六节1:高速缓冲存储器Cache及其相关基本概念、程序访问的局部性原理和命中率
  3. linux 下脚本查看带宽 (不需要安装其他工具包)
  4. Python 的构建工具 setup.py
  5. Qt:Windows编程—Qt实现本地服务管理
  6. 汇编语言:实验10 根据材料编程—1.显示字符串
  7. C++11范围for循环
  8. javascript耐人寻味
  9. ***CSS3 Gradient渐变色(转:http://www.w3cplus.com/content/css3-gradient)
  10. 让WEB FORM更像WINDOWS FORM: 控制窗体事件