温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Redis bigkeys命令会阻塞问题如何解决

发布时间:2023-03-29 17:28:18 来源:亿速云 阅读:135 作者:iii 栏目:开发技术

这篇文章主要介绍“Redis bigkeys命令会阻塞问题如何解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Redis bigkeys命令会阻塞问题如何解决”文章能帮助大家解决问题。

一、 顺丰高级开发工程师在线执行了 Redis 危险命令导致某公司损失 400 万

Redis bigkeys命令会阻塞问题如何解决

一个命令损失数百万,这,需要赔偿吗?

代码不规范,同事两行泪,撸码需谨慎!

处于好奇考虑,我来测试一下,这到底是什么问题?

二、测试一下1000万数据的性能

1、编写脚本文件

写入1000万数据。

for((i=1;i<=10000000;i++)); do echo "set k$i 哪吒编程$i" >> /tmp/test1.txt;done;

通过/tmp/test1.txt查看一下是否写入成功。

Redis bigkeys命令会阻塞问题如何解决

2、写入Redis1000万数据

cat /tmp/test1.txt | redis-cli -a 111111 --pipe

Redis bigkeys命令会阻塞问题如何解决

3、通过keys * 查看1000万数据

Redis bigkeys命令会阻塞问题如何解决

4、通过配置文件禁止keys *的使用

在redis.conf文件中配置security:

  rename- command keys ""
  rename- command flushdb ""
  rename- command flushall ""

三、使用scan替代keys *

Redis Scan 命令用于迭代数据库中的数据库键。

SCAN 命令是一个基于游标的迭代器,每次被调用之后, 都会向用户返回一个新的游标, 用户在下次迭代时需要使用这个新游标作为 SCAN 命令的游标参数, 以此来延续之前的迭代过程。

SCAN 返回一个包含两个元素的数组, 第一个元素是用于进行下一次迭代的新游标, 而第二个元素则是一个数组, 这个数组中包含了所有被迭代的元素。如果新游标返回 0 表示迭代已结束。

scan语法:

SCAN cursor [MATCH pattern] [COUNT count]

Redis bigkeys命令会阻塞问题如何解决

四、拒绝bigkey

1、阿里云Redis开发规范

阿里云Redis开发规范中明确规定“拒绝bigkey(防止网卡流量、慢查询)”

String类型控制在10KB以内,hash、list、set、zset元素个数不要超过5000。

2、出现bigkey时如何删除?

  1. String类型的用del删除。

  2. 其它类型使用hscan、sscan、zscan方式渐进式删除,同时要避免bigkey过期时间自动删除问题,因为它会造成主线程阻塞。

Hash 删除: hscan+hdel

public void delBigHash(String host, int port, String password, String bigHashKey) {
    Jedis jedis = new Jedis(host, port);
    if (password != null && !"".equals(password)) {
        jedis.auth(password);
    }
    ScanParams scanParams = new ScanParams().count(100);
    String cursor = "0";
    do {
        ScanResult<Entry<String, String>> scanResult = jedis.hscan(bigHashKey, cursor, scanParams);
        List<Entry<String, String>> entryList = scanResult.getResult();
        if (entryList != null && !entryList.isEmpty()) {
            for (Entry<String, String> entry : entryList) {
                jedis.hdel(bigHashKey, entry.getKey());
            }
        }
        cursor = scanResult.getStringCursor();
    } while (!"0".equals(cursor));
    
    //删除 bigkey
    jedis.del(bigHashKey);
}

3、bigkey会造成哪些问题?

  1. 内存不均,集群迁移困难;

  2. 超时删除,阻塞线程;

  3. 网络流量阻塞;

4、如何发现bigkey?

(1)通过redis-cli --bigkeys查找。

Redis bigkeys命令会阻塞问题如何解决

(2)计算每个键值的字节数,通过memory usage key查找

Redis bigkeys命令会阻塞问题如何解决

关于“Redis bigkeys命令会阻塞问题如何解决”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注亿速云行业资讯频道,小编每天都会为大家更新不同的知识点。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI