如何访问 Redis 中的海量数据,服务才不会挂掉?
来源:www.toutiao.com/i6697540366528152077
一、前言
有时候我们需要知道线上的Redis的使用情况,尤其需要知道一些前缀的key值,让我们怎么去查看呢?并且通常情况下Redis里的数据都是海量的,那么我们访问Redis中的海量数据?如何避免事故产生!今天就给大家分享一个小知识点,希望大家轻喷。
二、事故产生
因为我们的用户token缓存是采用了【user_token:userid】格式的key,保存用户的token的值。我们运维为了帮助开发小伙伴们查一下线上现在有多少登录用户。
直接用了keys user_token*方式进行查询,事故就此发生了。导致Redis不可用,假死。《一个致命的 Redis 命令,导致公司损失 400 万!》值得一读。
三、分析原因
我们线上的登录用户有几百万,数据量比较多;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开始
五、总结
这个是面试经常会问到的,也是我们小伙伴在工作的过程经常用的,一般数据量不大的时候,不会有什么问题,但数据量多的时候,你的操作方式不对,你的绩效就会被扣哦。
关注Java技术栈微信公众号,在后台回复关键字:redis,可以获取一份栈长整理的 Redis 最新技术干货。
最近干货分享
点击「阅读原文」一起搞技术,爽~
如何访问 Redis 中的海量数据,服务才不会挂掉?的更多相关文章
- 如何正确访问Redis中的海量数据?服务才不会挂掉!
一.前言 有时候我们需要知道线上的Redis的使用情况,尤其需要知道一些前缀的key值,让我们怎么去查看呢?并且通常情况下Redis里的数据都是海量的,那么我们访问Redis中的海量数据?如何避免事故 ...
- CentOS6.5(4)----宿主机无法访问虚拟机中的web服务解决方案
宿主机无法访问虚拟机中的web服务 在Windows7宿主机中的VMware虚拟机中安装了CentOS6.5操作系统,并且基于Nginx搭建了Web服务器,网页刚刚搭建好的时候,通过宿主机的浏览器可以 ...
- 使用Rest访问Redis中的数据
原创文章转载请注明出处:@协思, http://zeeman.cnblogs.com 大家在用Redis保存数据的时候,有不同的序列化方式.用得最多应该还是JSON,有一些场景我们需要以Http请 ...
- 访问arcserver中的featureServer服务
1.在arcmap中加载图层,并发布成arcser服务(服务名dizhi),记住勾选FeatureServer服务 2.在arcserver manger中查看刚才发布的服务 3.访问featureS ...
- 主机不能访问虚拟机中的web服务【解决方案】
百度了其它一些方法都不行,最后实在没辙,关了windows防火墙和Linux防火墙,居然能够访问了,我服. 总结一下,原来是Red Hat Linux 6.0防火墙没有开启端口80,开启的方法为(老版 ...
- ubuntu下不能访问docker中的rabbitmq服务端口
主要原因是防火墙屏蔽了15672端口,宿主机就不能直接通过 ip:port的形式访问rabbitmq的管理界面了. 解决方法很简单: 设置防火墙规则,使外部主机能够访问虚拟机的15672端口. 启动i ...
- WCF分布式4:客户端访问寄宿在IIS中的WCF服务
部署过程比较简单,新建一个站点,指向服务的物理路径,设置一个端口.即可. 新建的站点对应一个应用程序池,设置应用程序池中的.NET版本为4.0 写一个测试客户端,访问IIS中的WCF服务,可能会出现, ...
- Redis 中的原子操作(1)-Redis 中命令的原子性
Redis 如何应对并发访问 Redis 中处理并发的方案 原子性 Redis 的编程模型 Unix 中的 I/O 模型 thread-based architecture(基于线程的架构) even ...
- Redis中的批量删除数据库中的Key
本文参考:http://blog.csdn.net/spring21st/article/details/15771861 http://stackoverflow.com/questions/575 ...
随机推荐
- Spring学习笔记(3)——快速入门
项目目录如下: Say.java为主函数通过ApplicationContext创建对象,利用方法ClassPathXmlApplicationContext访问配置文件Applicationcont ...
- 09-python的面向对象
# 1. 面向对象概述(ObjectOriented,OO) - OOP思想 - 接触到任意一个任务,首先想到的是任务这个世界的构成,是由模型构成的 - 几个名词 - OO:面向对象 - OOA:面向 ...
- 【问题解决方案】Markdown正文中慎用星号否则容易变斜体
参考链接: [学习总结]Markdown 使用的正确姿势:第九部分-斜体and加粗 原理: 注意: Markdown中,若在正文中使用星号,如乘号或者指针的星号时,需要特别注意 当一句话中包含两个或者 ...
- 使用 typeof bar === "object" 来确定 bar 是否是对象的潜在陷阱是什么?
使用typeof首先要明白 typeof 可以检测什么. typeof 主要用于检测基本数据类型.typeof尽量不要用来检测复杂数据类型. typeof 检测null 和 数组 的时候 结果也是ob ...
- Intellij 选择profile
注意有3个地方需要改
- rabbitmq必须应答
当autoAck设置为true时,只要消息被消费者处理,不管成功与否,服务器都会删除该消息, 而当autoAck设置为false时,只有消息被处理,且反馈结果后才会删除 https://www.cnb ...
- vue的列表交错过渡
参考文章 https://juejin.im/post/5cccf5b0e51d453a907b4af1
- Maven 错误: Unknown lifecycle phase ".sourceforge.javacsv". You must specify a valid lifecycle phase or a goal
这是在Win10系统下,将Jar包手工导入进Maven本地仓库,使用PowerShell执行命令报的错. 命令如下: mvn install:install-file -Dfile=E:\Worksp ...
- centos 6.5 查看发行版本
cat /etc/redhat-release 其他发行版 lsb_release -a
- Nmon监控服务端性能
一.安装1.查看服务器操作系统的版本信息 lsb_release -a cat /etc/*release2.下载 a.nmon下载地址:http://nmon.sourceforge.net/pmw ...