关于Redis bigkeys命令会阻塞问题的解决

 更新时间:2023年03月29日 16:16:02   作者:哪 吒  
这篇文章主要介绍了关于Redis bigkeys命令会阻塞问题的解决,今天分享一次Redis引发的线上事故,避免再次踩雷,实现快速入门,需要的朋友可以参考下

前言

今天分享一次Redis引发的线上事故,避免再次踩雷,实现快速入门,丰富个人简历,提高面试level,给自己增加一点谈资,秒变面试小达人,BAT不是梦。

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

在这里插入图片描述

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

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

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

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

1、编写脚本文件

写入1000万数据。

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

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

在这里插入图片描述

2、写入Redis1000万数据

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

在这里插入图片描述

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

在这里插入图片描述

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]

在这里插入图片描述

四、拒绝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查找。

在这里插入图片描述

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

在这里插入图片描述

到此这篇关于关于Redis bigkeys命令会阻塞问题的解决的文章就介绍到这了,更多相关Redis bigkeys命令阻塞内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • redis中的bitmap你了解吗

    redis中的bitmap你了解吗

    这篇文章主要为大家详细介绍了redis中的bitmap,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • 一篇吃透Redis缓存穿透、雪崩、击穿问题

    一篇吃透Redis缓存穿透、雪崩、击穿问题

    这篇文主要介绍了Redis缓存穿透,缓存雪崩,缓存击穿的问题解决方法,文中有详细的图文介绍,对大家了解Redis有一定的帮助,需要的朋友可以参考下
    2023-05-05
  • 基于Redis位图实现用户签到功能

    基于Redis位图实现用户签到功能

    这篇文章主要介绍了基于Redis位图实现用户签到功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-05-05
  • Redis 实现“附近的人”功能

    Redis 实现“附近的人”功能

    Redis基于geohash和有序集合提供了地理位置相关功能。这篇文章主要介绍了Redis 实现“附近的人”功能,需要的朋友可以参考下
    2019-11-11
  • Redis主从架构和高可用性实现过程

    Redis主从架构和高可用性实现过程

    本文详细介绍了使用Redis主从架构和Linux虚拟服务器(LVS)实现高可用性的方法,并回顾了最近完成的Redis集群迁移部署过程,主从架构通过复制数据来提高性能和数据冗余,而LVS用于实现负载均衡和故障切换,感兴趣的朋友跟随小编一起看看吧
    2024-09-09
  • Redis实现全局唯一Id的使用示例

    Redis实现全局唯一Id的使用示例

    全局唯一ID有多个方法可供选择,其中一种是使用Redis,本文就来介绍一下Redis实现全局唯一Id的使用示例,具有一定的参考价值,感兴趣的可以了解一下
    2023-12-12
  • Redis消息队列、阻塞队列、延时队列的实现

    Redis消息队列、阻塞队列、延时队列的实现

    Redis是一种常用的内存数据库,它提供了丰富的功能,通常用于数据缓存和分布式队列,本文主要介绍了Redis消息队列、阻塞队列、延时队列的实现,感兴趣的可以了解一下
    2023-11-11
  • 详细分析Redis集群故障

    详细分析Redis集群故障

    这篇文章主要介绍了详细分析Redis集群故障的相关内容,具有一定的参考价值,这里分享给大家,供需要的朋友参考。
    2017-10-10
  • Redis并发问题解决方案

    Redis并发问题解决方案

    在当前的互联网环境中,高并发业务场景十分常见,本文就来介绍一下Redis并发问题解决方案,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11
  • 浅谈Redis哨兵模式高可用解决方案

    浅谈Redis哨兵模式高可用解决方案

    Redis高可用有两种模式:哨兵模式和集群模式,本文基于哨兵模式搭建一主两从三哨兵Redis高可用服务,感兴趣的可以了解一下
    2022-03-03

最新评论