[提前声明]
文章由作者:张耀峰 结合自己生产中的使用经验整理,最终形成简单易懂的文章
写作不易,转载请注明,谢谢!
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相关推荐

  1. 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 ...

  2. iOS 微信SDK1.8.6后需要UniversalLink解决方案及采坑记录

    项目最初因审核原因,一直使用iOS原生分享, 最近因项目需求要求, 接入微信分享, 以为和原来的没有区别, 但是接入时才发现改动的地方还是挺多的, 主要是需要配置UniversalLink和提包时的一 ...

  3. H5拍照、预览、压缩、上传采坑记录

    H5拍照.预览.压缩.上传采坑记录 公司项目前段时间需要实现手机拍照上传的功能,本来以为用createObjectURL和canvas可以很轻松的实现,结果发现问题多多,特此记录下来. DEMO预览( ...

  4. mysql8.0.19.0_分享MySql8.0.19 安装采坑记录

    上篇文章给大家介绍了MySql8.0.19 安装过程,需要的朋友可以点击查看.https://www.jb51.net/article/178988.htm 1.ERROR 1820 (HY000): ...

  5. mysql8.0依赖_分享MySql8.0.19 安装采坑记录

    上篇文章给大家介绍了MySql8.0.19 安装过程,需要的朋友可以点击查看.https://www.jb51.net/article/178988.htm 1.ERROR 1820 (HY000): ...

  6. redis 用scan 代替keys 解决百万数据模糊查询超时问题

    redis 用scan 代替keys 解决百万数据模糊查询超时问题 参考文章: (1)redis 用scan 代替keys 解决百万数据模糊查询超时问题 (2)https://www.cnblogs. ...

  7. Ubuntu18安装微信(deepin-wine版本)完整过程以及采坑记录

    Ubuntu18安装微信(deepin-wine版本)完整过程以及采坑记录(亲测运行) git clone https://gitee.com/wszqkzqk/deepin-wine-for-ubu ...

  8. Linux MySQL数据库冷迁移采坑记录

    Linux MySQL数据库冷迁移采坑记录 当前文件系统已满,需要将MySQL默认路径迁移到新文件系统下. MySQL数据库文件原位置:/var/lib/mysql . 要移动至:/mysql/mys ...

  9. 【SpringBoot DB系列】Jooq批量写入采坑记录

    [SpringBoot DB系列]Jooq批量写入采坑记录 前面介绍了jooq的三种批量插入方式,结果最近发现这里面居然还有一个深坑,我以为的批量插入居然不是一次插入多条数据,而是一条一条的插入-,这 ...

最新文章

  1. 反向传播神经网络 BPNN
  2. oracle命令格式,OraCmD(Oracle命令行工具) V3.1 官方版
  3. sdk版本过低怎么办_滴滴ElasticSearch平台跨版本升级以及平台重构之路
  4. 手机照片导入电脑步骤_如何将手机中的照片、视频快速的保存到U盘上?3分钟教你详细步骤...
  5. 显示控制器注释_欧姆龙可编程控制器CS1D-CPU产品型号说明及功能介绍
  6. Kali Linux 和 渗透测试
  7. u盘盘符不显示 win10_荣耀16.1锐龙版 linux装win10教程
  8. 基于OEA框架的客户化设计(一) 总体设计
  9. Mybatis中SqlNode的组合模式
  10. HTTP缓存 Last-Modified
  11. 内蒙古巴丹吉林沙漠锁定2021中国唯一申遗名额
  12. 【重磅首发新品】AM335x全面升级处理器——AM62x,四核Cortex-A53+M4F,主频1.4GHz
  13. 个人常用iOS第三方库以及XCode插件介绍
  14. 乒乓球拍板和皮子世界排名
  15. 【NA】Hessenberg阵的QR迭代法
  16. 新的开始——1月英语
  17. mysql udf shell_MySQL使用UDF调用shell脚本
  18. html如何把快变为行内元素,怎么把行元素变为块元素
  19. 机器算法有哪几种 python_机器学习10种经典算法的Python实现
  20. 2021年中国2D工业相机出货排行榜TOP10(凌云光未上榜)

热门文章

  1. 这些电商运营指标你知道吗?
  2. iOS端基于RSA公钥加密和解密
  3. 数据库里怎样根据出生日期计算精确年龄
  4. 如何精准化的做微信公众号运营?
  5. 【ACM-ICPC 2018 南京赛区网络预赛】E AC Challenge【状压DP】
  6. 微信个性签名怎么弄成竖的?不仅可以竖着还可以加边框效果!
  7. 使用Egret粒子编辑器实现烟雾效果
  8. android微信风格,微信主题太过简单?教你一键设置,多种风格自由切换
  9. 如何在 GitHub 上高效阅读源码?
  10. python:鸡尾酒疗法