前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >老大说:谁再用redis 的 keys命令,立刻给我走人

老大说:谁再用redis 的 keys命令,立刻给我走人

作者头像
traffic
发布2020-04-24 15:40:47
4K0
发布2020-04-24 15:40:47
举报
文章被收录于专栏:大龄码农大龄码农

先看现象

代码语言:javascript
复制
redis-cli keys * | args redis-cli del
(error) ERR network error
(30.00s)

#执行了一条 keys xxxxx* 命令,令数据库宕机了,怪不得技术总监发狠话:谁要是敢用 keys 命令,直接收拾包袱走人。接下来我们看看是什么回事:

最近有好多个项目要迁移了,一般迁移前都会做评估,对现有的业务,资源,关系等等做整理,其中有个项目,在做旧云 与 新云之间的数据源(redis)同步时,同步工具卡死了,新云的数据源竟然报警,内存不足!纳尼!!!!用的可是 8G容量的redis实例阿!why!!!! 赶紧查下redis内存信息

代码语言:javascript
复制
info memory

used_memory:16638616792
used_memory_human:16.88G
代码语言:javascript
复制
dbsize
(integer) 98923051

旧云的redis实例的key竟然高达 16G+,接近1亿个key,我的天,操着为公司节省资源的心,我发誓一定要把一切的垃圾通通清掉,于是就走向了深渊

开始我使用 big key命令

代码语言:javascript
复制
[0.43%] Sampled 1000000 keys so far
[0.87%] Sampled 2000000 keys so far

但是一个下午过去了,才0.87%,果断放弃了,选择直接看业务代码,后来发现是因为某个key没有设过期时间造成的,于是就想看看它的量有多大,于是就有了下面的操作

代码语言:javascript
复制
redis-cli keys * | args redis-cli del
(error) ERR network error
(30.00s)

直接30秒超时,并且直接锁住了整个redis,执行 keys 模糊的匹配命令是为了清理没用的键,但是没有考虑到keys *进行模糊匹配引发 Redis 锁,造成 Redis 锁住,CPU 飙升,引起了所有调用链路的超时并且卡住,等 Redis 锁的那几秒结束,所有的请求流量全部请求到 RDS 数据库中,使数据库产生了雪崩,使数据库宕机

那应该怎么办呢,其实有改进方案的

  1. 所有线上操作,全部要经过运维通过后方可执行,运维部门逐步快速收回各项权限
  2. 新增 Redis 实例,进行分离
  3. 如果有使用类似 keys 正则命令需求,使用 scan 命令代替

SCAN 命令

Redis从2.8版本开始支持scan命令,SCAN命令的基本用法如下:

  1. 复杂度虽然也是 O(n),通过游标分步进行不会阻塞线程;
  2. 有限制参数 COUNT ;
  3. 同 keys命令 一样提供模式匹配功能;
  4. 服务器不需要为游标保存状态,游标的唯一状态就是 scan 返回给客户端的游标整数;

批量删除scan命令

因为KEYS命令的时间复杂度为O(n),而SCAN命令会将遍历操作分解成m次,然后每次去执行,从而时间复杂度为O(1)。也解决使用keys命令遍历大量数据而导致Redis服务器阻塞的情况。所以建议使用下边的指令进行批量的删除操作:

代码语言:javascript
复制
redis-cli --scan --pattern "key的前缀*" | xargs -L 1000 redis-cli del

最后,经过删除命令,redis实例的内存占用,之下下降到 不到100M,直接换要给1g的实例,刚刚,经过1天的折腾,为公司剩下了资源,也算是很有意义产出了,日报周报赶紧安排!!!

总结 因为Redis的KEYS在某种情况下会阻塞。在生产环境中一定要慎用慎用,有个真实真案件小哥哥生产用KEYS,最终导致服务宕机。后果很严重,产生的经济损失就不说了。

切记严重会导致程序的雪崩,删除的时候用SCAN命令,看完这篇文章应该都记住了。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 先看现象
  • 那应该怎么办呢,其实有改进方案的
  • SCAN 命令
  • 批量删除scan命令
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档