如何访问redis中的海量数据?避免事故产生

栏目: 数据库 · 发布时间: 5年前

内容简介:有时候我们需要知道线上的因为我们的用户直接用了

前言

有时候我们需要知道线上的 redis的使用情况 ,尤其需要知道一些 前缀的key值 ,让我们怎么去查看呢?今天老顾分享一个小知识点

事故产生

因为我们的用户 token缓存是采用了【user_token:userid】格式的key ,保存用户的token的值。我们运维为了帮助开发小伙伴们查一下线上现在有多少登录用户。

直接用了 keys user_token*方式 进行查询,事故就此发生了。 导致 redis 不可用,假死

分析原因

我们线上的登录用户有几百万,数据量比较多; keys算法是遍历算法复杂度是O(n) ,也就是数据越多,时间复杂度越高。

数据量达到几百万, keys这个指令就会导致 Redis 服务卡顿 ,因为  Redis 是单线程程序,顺序执行所有指令,其它指令必须等到当前的 keys 指令执行完了才可以继续

解决方案

那我们如何去 遍历大数据量 呢?这个也是面试经常问的。我们可以采用redis的另一个 命令scan。 我们看一下 scan的特点

1、 复杂度虽然也是 O(n) ,但是它是通过游标分步进行的, 不会阻塞线程 2、提供 count 参数,不是结果数量,是redis单次遍历字典槽位数量(约等于) 3、同 keys 一样,它也提供模式匹配功能; 4、服务器不需要为游标保存状态,游标的唯一状态就是  scan 返回给客户端的游标整数 ; 5、返回的结果 可能会有重复,需要客户端去重复 ,这点非常重要; 6、单次返回的结果是空的并不意味着遍历结束,而要看 返回的游标值是否为零

一、scan命令格式

二、 命令解释

scan 游标 MATCH <返回和给定模式相匹配的元素> count 每次迭代所返回的元素数量

SCAN命令是 增量的循环 ,每次调用只会 返回一小部分的元素 。所以不会让redis假死 SCAN命令返回的是一个游标, 从0开始遍历,到0结束遍历

三、举例

如何访问redis中的海量数据?避免事故产生

从0开始遍历,返回了游标6,又返回了数据,继续scan遍历,就要从6开始

如何访问redis中的海量数据?避免事故产生

总结

这个是 面试经常会问到的 ,也是我们小伙伴在 工作的过程经常用的 ,一般小公司,不会有什么问题,但 数据量多的时候,你的操作方式不对 ,你的绩效就会被扣哦,哈哈。谢谢!!!


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Automate This

Automate This

Christopher Steiner / Portfolio / 2013-8-9 / USD 25.95

"The rousing story of the last gasp of human agency and how today's best and brightest minds are endeavoring to put an end to it." It used to be that to diagnose an illness, interpret legal docume......一起来看看 《Automate This》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

MD5 加密
MD5 加密

MD5 加密工具