内容简介:还没关注?快动动手指!
还没关注?
快动动手指!
聊技术、论职场!
为IT人打造一个“有温度”的 狸猫技术窝
一、前言
有时候我们需要知道线上 Redis 使用情况,尤其需要知道一些 前缀的key值 ,那我们怎么去查看呢? 而且通常情况下Redis里的数据都是海量的,那么我们访问Redis中的海量数据时,如何避免事故产生?
今天就通过我们实际的一次生产事故,给大家分享一下!
二、事故产生
因为我们的 用户 token缓存是采用了【user_token:userid】格式的key ,保存用户的token的值。
我们运维为了帮助开发小伙伴们查一下线上现在有多少登录用户, 直接用了 keys user_token* 方式进行查询,事故就此发生了: 导致Redis不可用,假死。
三、分析原因
我们线上的登录用户有几百万,数据量比较多; keys算法是遍历算法,复杂度是O(n) ,也就是数据越多,时间越高。
数据量达到几百万, keys这个指令就会导致 Redis 服务卡顿 ,因为 Redis 是单线程程序,顺序执行所有指令,其它指令必须等到当前的 keys 指令执行完了才可以继续。
四、解决方案
那我们 如何去遍历大数据量呢? 其实这个也是面试经常问的。 我们可以采用Redis的另一个命令scan。
我们看一下scan的特点:
-
复杂度虽然也是 O(n),但是它是通过游标分步进行的,不会阻塞线程
-
提供 count 参数,不是结果数量,是Redis单次遍历字典槽位数量(约等于)
-
同 keys 一样,它也提供模式匹配功能;
-
服务器不需要为游标保存状态,游标的唯一状态就是 scan 返回给客户端的游标整数;
-
返回的结果可能会有重复,需要客户端去重复,这点非常重要;
-
单次返回的结果是空的并不意味着遍历结束,而要看返回的游标值是否为零
4.1、scan命令格式
4.2、命令解释
scan 游标 MATCH <返回和给定模式相匹配的元素> count 每次迭代所返回的元素数量
-
SCAN命令是增量的循环,每次调用只会返回一小部分的元素。所以不会让Redis假死;
-
SCAN命令返回的是一个游标,从0开始遍历,到0结束遍历;
4.3、举例
从0开始遍历,返回了游标6,又返回了数据,继续scan遍历,就要从6开始
<img data-src="https://mmbiz.qpic.cn/mmbiz_png/UtWdDgynLda2PySlwtB75LpmXnuib8vggFRcKe5nWsRk0NtOc1E2Ova7g9ibHjgGZXFL6nZjPrJ9gRZolutC1kBA/640?wx_fmt=png" data-type="png" data-ratio="0.4444444444444444" data-w="378" />
五、总结
这个是面试经常会问到的,也是我们小伙伴在工作的过程经常用的,一般数据量不大的时候,不会有什么问题,但数据量多的时候,你的操作方式不对,你的绩效就会被扣哦。
End
作者: 老顾
来源:
https://dwz.cn/pm3pI6MZ
本文版权归作者所有
为您推荐 :
长按下图二维码,即刻关注【 狸猫技术窝 】
阿里、京东、美团、字节跳动
顶尖技术专家 坐镇
为IT人打造一个 “有温度” 的技术窝!
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 面试驱动技术 - Category 相关考点
- AFNetworking源码解析与面试考点思考
- 26 个 CSS 面试的高频考点助力金三银四
- 招银网络面试题、考点、知识点总结(Java岗)
- 数据库考点:为什么要分库分表?用过哪些分库分表中间件?不同的分库分表中间件都有什么优点和缺点?如何对数据库如何进行拆分?
- Python面试经验总结,面试一时爽,一直面试一直爽!
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
The Mechanics of Web Handling
David R. Roisum
This unique book covers many aspects of web handling for manufacturing, converting, and printing. The book is applicable to any web including paper, film, foil, nonwovens, and textiles. The Mech......一起来看看 《The Mechanics of Web Handling》 这本书的介绍吧!