一个 randomkey 命令导致的 Redis 事故

HelloWord 2020/9/22 5:04:10

最近在公司对redis做一些二次开发时,发现一个randomkey命令可能导致整个redis实例长时间阻塞的问题,redis版本为3.2.9,以此记录。问题由于我们公司使用的是redis集群版Codis,Codis内置的redis版本比较低,为3.2.9版本。我们近期在做Codis双机房时,需要对redis增加一些…

最近在公司对redis做一些二次开发时,发现一个randomkey命令可能导致整个redis实例长时间阻塞的问题,redis版本为3.2.9,以此记录。

问题

由于我们公司使用的是redis集群版Codis,Codis内置的redis版本比较低,为3.2.9版本。

我们近期在做Codis双机房时,需要对redis增加一些功能以此支持双机房,在开发和测试中发现,执行randomkey命令有可能导致整个redis长时间阻塞的问题。

randomkey主要功能是在redis中随机返回一个key出来,它随机选取key的代码如下。

一个 randomkey 命令导致的 Redis 事故

从上面代码可以看出来,如果当前是个slave,并且整个实例中存在大量已经过期的key(key已过期,但redis还未来得及删除key),执行randomkey命令时,由于找不到不过期的key,那么这个逻辑就会陷入死循环,阻塞住整个实例,整个实例不可用。

如果当前是master,执行randomkey命令时,redis会一直随机选择key,直到找到一个不过期的key,同时会把已经过期的key从整个实例中删除。

也就是说,在这种场景下,虽然不会长时间阻塞整个实例,但也会比执行一个普通的命令耗时要久。如果你在一个大量已过期的实例上执行randomkey命令,那可能会导致业务访问redis变慢。

解决

我们对比了官方最新版的redis,已经针对此问题进行了修复。

一个 randomkey 命令导致的 Redis 事故

解决方案就是增加一个最大重试次数,如果整个实例都是过期key,那么最多寻找maxtries次就返回,避免阻塞整个实例。

注意点

但要注意的是,如果达到了maxtries,那么返回的key是已经过期的key,你虽然在randomkey中看到了这个key,但对这个key执行其他命令时,还是拿不到这个key的。

这个方案只针对slave上执行这个命令进行了修复,也就是不会再让redis陷入死循环。

但在master上执行这个命令还是会发生上述的变慢问题,如果你在使用redis时,经常使用这个命令,同时实例中存在大量已经过期的key,那么redis变慢很有可能是这个问题导致的。

随时随地学软件编程-关注百度小程序和微信小程序
关于找一找教程网

本站文章仅代表作者观点,不代表本站立场,所有文章非营利性免费分享。
本站提供了软件编程、网站开发技术、服务器运维、人工智能等等IT技术文章,希望广大程序员努力学习,让我们用科技改变世界。
[一个 randomkey 命令导致的 Redis 事故]http://www.zyiz.net/tech/detail-147304.html

上一篇:7000字 Redis 超详细总结、笔记!建议收藏

下一篇:redis命令和RedisTemplate操作对应表

赞(0)

共有 条评论 网友评论

验证码: 看不清楚?
    关注微信小程序
    程序员编程王-随时随地学编程

    扫描二维码或查找【程序员编程王】

    可以随时随地学编程啦!

    技术文章导航 更多>
    扫一扫关注最新编程教程