采坑记录-Redis使用scan代替keys
[提前声明]
文章由作者:张耀峰 结合自己生产中的使用经验整理,最终形成简单易懂的文章
写作不易,转载请注明,谢谢!
spark代码案例地址: https://github.com/Mydreamandreality/sparkResearch
线上问题
- 定时任务通过keys* 通配符匹配对应的key
- 在这段时间内的其它服务(需要用到Redis)告警,无法进行正常服务
- 在运维平台查看日志:服务告警这段时间内的请求全部抛出redis连接超时,服务中设置的redis超时时间为200ms
问题定位
- 首先确定是keys命令引起的
- 而且Redis中数据量要特别大,否则是不会触发这个bug的,之前数据量小的时候根本没有这个问题
- 其次
keys
命令本身在redis中数据量特别大的情况下(百万及以上)就会特别慢 - 最致命的是这个命令会阻塞redis多路复用的io主线程,如果这个线程被阻塞了,在这个期间其它服务到redis的请求会全部被阻塞,导致一系列反应,响应卡顿,连接超时等等
问题解决
- 在线上环境,这种会阻塞主线程的操作,并且算法时间复杂度是O(n)的就应该禁止使用
替代方案
- redis.scan
scan如何解决线上问题
- scan和keys都是O(n)复杂度
- scan同样支持通配字符模糊查找
- scan不会阻塞主线程
- scan支持游标按批次迭代返回数据
注:scan返回的数据有可能会重复,需要客户端主动去重
scan注意事项
- scan命令的游标从0开始从0结束
- scan命令每次返回的数据都会携带下次游标所需的值,根据这个值再进行下一次的访问,如果返回的数据为空,不一定是没有数据了,需要通过游标来确认
scan命令使用案例
scan 0 match my*key count 10000
JavaRedisApi-scan命令使用案例
public Set<String> scan(String key, long count) {Set<String> keys = redisTemplate.execute((RedisCallback<Set<String>>) connection -> {Set<String> keyTmp = new HashSet<>();Cursor<byte[]> cursor = connection.scan(new ScanOptions.ScanOptionsBuilder().match(key + "*").count(count).build());while (cursor.hasNext()) {keyTmp.add(new String(cursor.next()));}return keyTmp;});return keys;}
回归测试结果
- 服务正常执行
采坑记录-Redis使用scan代替keys相关推荐
- Centos7.9上利用cephadm安装Ceph Octopus 15.2的采坑记录,附带K8S挂载方法
Centos7.9上利用cephadm安装Ceph Octopus 15.2的采坑记录,附带K8S挂载方法 0.亮点 1 准备 1.1 修改历史记录 1.2 升级系统内核 1.3 配置免密登录 问题1 ...
- iOS 微信SDK1.8.6后需要UniversalLink解决方案及采坑记录
项目最初因审核原因,一直使用iOS原生分享, 最近因项目需求要求, 接入微信分享, 以为和原来的没有区别, 但是接入时才发现改动的地方还是挺多的, 主要是需要配置UniversalLink和提包时的一 ...
- H5拍照、预览、压缩、上传采坑记录
H5拍照.预览.压缩.上传采坑记录 公司项目前段时间需要实现手机拍照上传的功能,本来以为用createObjectURL和canvas可以很轻松的实现,结果发现问题多多,特此记录下来. DEMO预览( ...
- mysql8.0.19.0_分享MySql8.0.19 安装采坑记录
上篇文章给大家介绍了MySql8.0.19 安装过程,需要的朋友可以点击查看.https://www.jb51.net/article/178988.htm 1.ERROR 1820 (HY000): ...
- mysql8.0依赖_分享MySql8.0.19 安装采坑记录
上篇文章给大家介绍了MySql8.0.19 安装过程,需要的朋友可以点击查看.https://www.jb51.net/article/178988.htm 1.ERROR 1820 (HY000): ...
- redis 用scan 代替keys 解决百万数据模糊查询超时问题
redis 用scan 代替keys 解决百万数据模糊查询超时问题 参考文章: (1)redis 用scan 代替keys 解决百万数据模糊查询超时问题 (2)https://www.cnblogs. ...
- Ubuntu18安装微信(deepin-wine版本)完整过程以及采坑记录
Ubuntu18安装微信(deepin-wine版本)完整过程以及采坑记录(亲测运行) git clone https://gitee.com/wszqkzqk/deepin-wine-for-ubu ...
- Linux MySQL数据库冷迁移采坑记录
Linux MySQL数据库冷迁移采坑记录 当前文件系统已满,需要将MySQL默认路径迁移到新文件系统下. MySQL数据库文件原位置:/var/lib/mysql . 要移动至:/mysql/mys ...
- 【SpringBoot DB系列】Jooq批量写入采坑记录
[SpringBoot DB系列]Jooq批量写入采坑记录 前面介绍了jooq的三种批量插入方式,结果最近发现这里面居然还有一个深坑,我以为的批量插入居然不是一次插入多条数据,而是一条一条的插入-,这 ...
最新文章
- 反向传播神经网络 BPNN
- oracle命令格式,OraCmD(Oracle命令行工具) V3.1 官方版
- sdk版本过低怎么办_滴滴ElasticSearch平台跨版本升级以及平台重构之路
- 手机照片导入电脑步骤_如何将手机中的照片、视频快速的保存到U盘上?3分钟教你详细步骤...
- 显示控制器注释_欧姆龙可编程控制器CS1D-CPU产品型号说明及功能介绍
- Kali Linux 和 渗透测试
- u盘盘符不显示 win10_荣耀16.1锐龙版 linux装win10教程
- 基于OEA框架的客户化设计(一) 总体设计
- Mybatis中SqlNode的组合模式
- HTTP缓存 Last-Modified
- 内蒙古巴丹吉林沙漠锁定2021中国唯一申遗名额
- 【重磅首发新品】AM335x全面升级处理器——AM62x,四核Cortex-A53+M4F,主频1.4GHz
- 个人常用iOS第三方库以及XCode插件介绍
- 乒乓球拍板和皮子世界排名
- 【NA】Hessenberg阵的QR迭代法
- 新的开始——1月英语
- mysql udf shell_MySQL使用UDF调用shell脚本
- html如何把快变为行内元素,怎么把行元素变为块元素
- 机器算法有哪几种 python_机器学习10种经典算法的Python实现
- 2021年中国2D工业相机出货排行榜TOP10(凌云光未上榜)