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和redission分布式锁原理及区别说明

    redis和redission分布式锁原理及区别说明

    文章对比了synchronized、乐观锁、Redis分布式锁及Redission锁的原理与区别,指出在集群环境下synchronized失效,乐观锁存在数据库性能瓶颈,而Redission通过watchdog自动续期和Lua原子操作解决Redis锁的超时问题,推荐其在高并发场景下的可靠性与易用性
    2025-08-08
  • Redis中原子性操作的的实现

    Redis中原子性操作的的实现

    本文主要介绍了Redis的原子性操作,包括其单线程模型和命令队列机制,原子性的边界,及通过事务和Lua脚本实现多命令的原子性,具有一定的参考价值,感兴趣的可以了解一下
    2025-11-11
  • Redis数据迁移RedisShake的实现方法

    Redis数据迁移RedisShake的实现方法

    本文主要介绍了Redis数据迁移RedisShake的实现方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • 解密Redis助力双11背后电商秒杀系统(推荐)

    解密Redis助力双11背后电商秒杀系统(推荐)

    这篇文章主要介绍了解密Redis助力双11背后电商秒杀系统,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • redis-cli -p 6379 info命令详解

    redis-cli -p 6379 info命令详解

    这篇文章主要介绍了redis-cli -p 6379 info命令详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Redis高并发问题的解决方法

    Redis高并发问题的解决方法

    这篇文章主要介绍了Redis高并发问题的解决办法,具有很好的参考价值,感兴趣的小伙伴们可以参考一下,具体如下:
    2018-05-05
  • Redis分片集群的实现示例

    Redis分片集群的实现示例

    本文介绍了搭建Redis分片集群,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-12-12
  • redis实现红锁的示例代码

    redis实现红锁的示例代码

    在分布式系统中,实现一个可靠的锁机制是非常重要的,本文主要介绍了redis实现红锁的示例代码,具有一定的参考价值,感兴趣的可以了解一下
    2025-04-04
  • Redis migrate数据迁移工具的使用教程

    Redis migrate数据迁移工具的使用教程

    这篇文章主要给大家介绍了关于Redis migrate数据迁移工具的使用教程,文中通过示例代码介绍的非常详细,对大家的学习或者使用Redis具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-08-08
  • Redis解决key冲突的问题解决

    Redis解决key冲突的问题解决

    本文主要介绍了Redis解决key冲突的问题解决,通过严格的key命名规范、RedisDB隔离、分布式并发控制和命名空间等手段,可以有效预防key冲突,感兴趣的可以了解一下
    2025-11-11

最新评论