Redis 大Key的删除的实现策略

 更新时间:2025年07月25日 11:03:48   作者:喜欢代码的新之助  
在Redis中,删除大key是一项需要谨慎处理的操作,本文主要介绍了Redis 大Key的删除的实现策略,具有一定的参考价值,感兴趣的可以了解一下

1 定义

Redis大Key其实不是指的是Key,而是指Key对应的Value。

Redis的String类型,最大可以存512MB的值,List、Hash、Set、ZSet等,可以存储232个元素(大约42亿多点),那么多大的Key算大Key呢?

一般来说,我们String需要控制在10KB以下,而集合类型的控制元素个数在5000个以下。

2 如何导致的大Key

一种,比如社交类的场景,如粉丝数增多,另外一种,可能由于报表等常年累月的积累,有可能导致大Key。

我们知道,由于Redis工作线程是单线程的,大Key删除会导致网络浏览阻塞、超时等一系列问题,那么我们就应该去防止大KEY的产生

3 如何检测大Key

一般来说,有两种方法:

  • 使用--bigkeys:扫描所有的键,给出每种数据结构Top 1 bigkey
[root@localhost ~]# redis-cli -a Redis密码 --bigkeys
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.

# Scanning the entire keyspace to find biggest keys as well as
# average sizes per key type.  You can use -i 0.1 to sleep 0.1 sec
# per 100 SCAN commands (not usually needed).

[00.00%] Biggest string found so far '"k5889"' with 5 bytes
[00.00%] Biggest string found so far '"k607267"' with 7 bytes
[00.00%] Biggest string found so far '"k1802564"' with 8 bytes
[50.00%] Sampled 1000000 keys so far
[100.00%] Sampled 2000000 keys so far

-------- summary -------

Sampled 2000000 keys in the keyspace!
Total key length in bytes is 14888896 (avg len 7.44)

Biggest string found '"k1802564"' has 8 bytes

0 lists with 0 items (00.00% of keys, avg size 0.00)
0 hashs with 0 fields (00.00% of keys, avg size 0.00)
2000000 strings with 14888896 bytes (100.00% of keys, avg size 7.44)
0 streams with 0 entries (00.00% of keys, avg size 0.00)
0 sets with 0 members (00.00% of keys, avg size 0.00)
0 zsets with 0 members (00.00% of keys, avg size 0.00)
  • 使用Memery Usage:获取一个键的所占内存
127.0.0.1:6379> MEMORY USAGE k10000
(integer) 64

4 大Key的删除

4.1 String类型

String类型一般用Del即可,如果过于庞大可以使用Unlink

4.2 Hash类型

使用hscan每次获取少量field-value,再使用hdel删除每个field

public void delBigHash(String bigHashKey) {
    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 (CollectionUtils.isNotEmpty(entryList)) {
            for (Entry<String, String> entry : entryList) {
                jedis.hdel(bigHashKey, entry.getKey());
            }
        }
        cursor = scanResult.getCursor();
    } while (!"0".equals(cursor));
    jedis.del(bigHashKey);
}

4.3 List类型

使用ltrim渐进式逐步删除,直到全部删除完成

public void delBigList(String bigListKey){
    long llen = jedis.llen(bigListKey);
    int counter = 0;
    int left = 100;
    while (counter < llen) {
        jedis.ltrim(bigListKey, left, llen);
        counter += left;
    }
    jedis.del(bigListKey);
}

4.4 Set类型

使用sscan每次获取部分元素,再使用srem命令删除每个元素

public void delBigSet(String bigSetKey){
    ScanParams scanParams = new ScanParams().count(100);
    String cursor = "0";
    do {
        ScanResult<String> scanResult = jedis.sscan(bigSetKey, cursor, scanParams);
        List<String> memberList = scanResult.getResult();
        if (CollectionUtils.isNotEmpty(memberList)) {
            for (String member : memberList) {
                jedis.srem(bigSetKey, member);
            }
        }
        cursor = scanResult.getCursor();
    } while (!"0".equals(cursor));
    jedis.del(bigSetKey);
}

4.5 ZSet类型

使用zscan每次获取部分元素,再使用ZREMRANGEBYRANK命令删除每个元素

public void delBigZSet(String bigZSetKey){
    ScanParams scanParams = new ScanParams().count(100);
    String cursor = "0";
    do {
        ScanResult<Tuple> scanResult = jedis.zscan(bigZSetKey, cursor, scanParams);
        List<Tuple> tupleList = scanResult.getResult();
        if (CollectionUtils.isNotEmpty(tupleList)) {
            for (Tuple tuple : tupleList) {
                jedis.zrem(bigZSetKey, tuple.getElement());
            }
        }
        cursor = scanResult.getCursor();
    } while (!"0".equals(cursor));
    jedis.del(bigZSetKey);
}

到此这篇关于Redis 大Key的删除的实现策略的文章就介绍到这了,更多相关Redis 大Key删除内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅析Redis中String数据类型及其底层编码

    浅析Redis中String数据类型及其底层编码

    这篇文章主要介绍 Redis 中 String 数据类型及其底层编码,文中有详细的代码示例,对大家的工作及学习有一定的帮助,需要的朋友可以参考下
    2023-05-05
  • redis实现计数器-防止刷单方法介绍

    redis实现计数器-防止刷单方法介绍

    本文主要向大家介绍了redis实现计数器防止刷单的方法和有关代码,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • 解决redis服务启动失败的问题

    解决redis服务启动失败的问题

    今天小编就为大家分享一篇解决redis服务启动失败的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • redis复制有可能碰到的问题汇总

    redis复制有可能碰到的问题汇总

    这篇文章主要介绍了redis复制有可能碰到的问题汇总,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • Redis做预定库存缓存功能设计使用

    Redis做预定库存缓存功能设计使用

    这篇文章主要为大家介绍了Redis做预定库存缓存功能设计使用,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-04-04
  • Redis大key多key拆分实现方法解析

    Redis大key多key拆分实现方法解析

    这篇文章主要介绍了Redis大key多key拆分实现方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • 基于Redis的分布式锁的简单实现方法

    基于Redis的分布式锁的简单实现方法

    这篇文章主要介绍了基于Redis的分布式锁的简单实现方法,Redis官方给出两种思路,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-10-10
  • 小白也能看懂的Redis遍历键和数据库管理详解

    小白也能看懂的Redis遍历键和数据库管理详解

    这篇文章主要为大家介绍了小白也能看懂的Redis遍历键和数据库管理详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • Redis如何解决BigKey

    Redis如何解决BigKey

    在Redis的使用过程中,我们经常会遇到BigKey, BigKey的大值会导致Redis内存中产生大量不连续的碎片,降低内存利用效率,本文主要介绍了Redis如何解决BigKey,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • Redis数据一致性问题的三种解决方案

    Redis数据一致性问题的三种解决方案

    Redis(Remote Dictionary Server ),是一个高性能的基于Key-Value结构存储的NoSQL开源数据库,大部分公司采用Redis来实现分布式缓存,用来提高数据查询效率,本文就给大家介绍三种Redis数据一致性问题的解决方案,需要的朋友可以参考下
    2023-07-07

最新评论