怎样正确访问Redis中的海量数据

87次阅读
没有评论

共计 981 个字符,预计需要花费 3 分钟才能阅读完成。

本篇文章为大家展示了怎样正确访问 Redis 中的海量数据,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

一、前言

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

上述内容就是怎样正确访问 Redis 中的海量数据,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注丸趣 TV 行业资讯频道。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-16发表,共计981字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)