如何访问 Redis 中的海量数据,服务才不会挂掉?

如何访问 Redis 中的海量数据,服务才不会挂掉?_第1张图片

来源:www.toutiao.com/i6697540366528152077

如何访问 Redis 中的海量数据,服务才不会挂掉?_第2张图片

一、前言

有时候我们需要知道线上的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开始


五、总结

这个是面试经常会问到的,也是我们小伙伴在工作的过程经常用的,一般数据量不大的时候,不会有什么问题,但数据量多的时候,如果你的操作方式不对,那很有可能就GG了。

--完--

如果需要Redis视频,可以在公众号后台聊天框回复【Redis视频】,可以免费获取编程视频 。

Redis其它推荐阅读:

Redis 零基础入门视频教程

Linux 安装 Redis 图文教程

刚接触学Redis,看这一篇就够了!

再来聊聊Redis到底是什么?

说说 Redis 数据结构和常用命令

Redis最常见面试问题,附答案!

阿里巴巴官方 Redis 开发规范!

史上最全 Redis 高可用解决方案总结

Redis 分布式锁的正确实现方式

Redis 源码学习之 Redis 事务

详解Redis的内存淘汰策略

Redis 的各项功能,都解决了哪些问题?

为什么单线程的Redis却能支撑高并发?

Redis应用场景,实现功能 “附近的人”

超详细揭秘 Redis 持久化,建议收藏!

后端开发都应该掌握的Redis基础

Redis是如何实现点赞、取消点赞的?

一文深入了解Redis内存模型!

Redis常见的几种缓存模式

长按加入10W+朋友的IT圈

觉得内容还不错的话,给我点个“在看”呗

你可能感兴趣的:(java,编程语言,redis,数据库,缓存)