Redis 大key的几种删除方式

 更新时间:2025年03月26日 09:34:44   作者:csjane1079  
大key删除直接调用 del 命令删除key,容易造成请求被阻塞,本文主要介绍了Redis 大key的几种删除方式,具有一定的参考价值,感兴趣的可以了解一下

在前面的文章 Redis删除大key时为什么会阻塞中,有说到,不应该直接调用 del 命令删除key,容易造成请求被阻塞,那应该如何来处理呢?

这次从代码编写的角度来举例说明下。

在Redis中,有几个比较特殊的结构String,List、Hash、Set、ZSet, 从Redis删除大key时为什么会阻塞中文章可以知道,不能直接del (除了string),而应该使用 scan的方式,而每一个类型也都有自己的scan 方式。接下来以 Java Jedis 为例。

List

String key = "demo";
int length = jedis.llen("demo");
if (length > 1024) {
    int size = 100;
    int count = 0;
    do {
        //每次处理前100个
        // redis内部也会判断当前传递的索引有没有超过当前的list的长度
        // 可参阅 ltrimCommand
        jedis.ltrim(key, 0, size);
        count += size;
    }
        while (count < length);
}
jedis.del(key);

Set

String key = "demo";

long length = jedis.scard(key);
if (length > 1024) {
    //每次遍历100个
    ScanParams scanParams = new ScanParams().count(100);
    // 传递的游标
    java.lang.String cursor = "0";
    ScanResult<String> sscan;
    do {
        //传递 scan的参数
        sscan = jedis.sscan(key, cursor, scanParams);
        if (!CollectionUtils.isEmpty(sscan.getResult())) {
            // 遍历返回的结果,依次删除
            sscan.getResult().stream().forEach(member -> {
                jedis.srem(key, member);
            });
        }
        // 传入下次遍历的游标
        cursor = sscan.getCursor();
    } while (!sscan.isCompleteIteration());
}
jedis.del(key);

ZSet

String key = "demo";
// 获取zset的长度
long length = jedis.zcard(key);
if (length > 1024) {
    int size = SIZE;
    int count = 0;
    do {
        // 删除指定的集合
        jedis.zremrangeByRank(key, 0, size);
        count += size;
    }
    while (count < length);
}
jedis.del(key);

Hash

String key = "demo";
// 获取Hash的字段个数
long length = jedis.hlen(key);
if (length > THROLD) {
    ScanParams scanParams = new ScanParams();
    // 遍历大小
    scanParams.count(SIZE);
    // 匹配哪些字段
    scanParams.match("*");
    ScanResult<Map.Entry<String, String>> result;
    java.lang.String cursor = "0";
    do {
        // 遍历字段
        result = jedis.hscan(key, cursor, scanParams);
        if (!CollectionUtils.isEmpty(result.getResult())) {
            // 删除指定的字段
            result.getResult().stream().forEach(x -> {
                jedis.hdel(key, x.getKey());
            });
        }
        cursor = result.getCursor();
    } while (!result.isCompleteIteration());
}
jedis.del(key);

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

相关文章

  • Redis类型type与编码encoding原理及使用示例

    Redis类型type与编码encoding原理及使用示例

    这篇文章主要为大家介绍了Redis类型type与编码encoding原理及使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • redis restore 命令的用法实例详解

    redis restore 命令的用法实例详解

    Redis的RESTORE命令用于将DUMP生成的序列化数据恢复为键值,适用于数据迁移、备份恢复和跨实例同步,本文介绍redis restore 命令的用法,感兴趣的朋友一起看看吧
    2025-02-02
  • 深入浅析Redis 集群伸缩原理

    深入浅析Redis 集群伸缩原理

    Redis 集群提供了灵活的节点扩容和收缩方案。在不影响集群对外服务的情况下,可以为集群添加节点进行扩容,也可以下线部分节点进行缩容,接下来通过本文给大家分享Redis 集群伸缩原理,感兴趣的朋友一起看看吧
    2021-05-05
  • Redis命令使用技巧之Keys的相关操作

    Redis命令使用技巧之Keys的相关操作

    Redis KEYS命令用于搜索具有匹配模式的键。下面这篇文章主要给大家介绍了关于Redis命令使用技巧之Keys的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧
    2018-10-10
  • Windows下Redis的安装使用图解

    Windows下Redis的安装使用图解

    Redis是一个key-value存储系统。Redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部分场合可以对关系数据库起到很好的补充作用。这篇文章小编为大家分享了在Windows下进行安装和使用Redis的技巧。
    2015-09-09
  • Redis哨兵模式与主从架构对比分析

    Redis哨兵模式与主从架构对比分析

    Redis哨兵模式在主从架构基础上增强高可用性,通过自动故障切换和监控实现无人值守恢复,但部署复杂且无法突破单机内存限制,适用于读多写少、高可用需求的场景
    2025-08-08
  • Redis 内存碎片原因及清理

    Redis 内存碎片原因及清理

    内存碎片是指在内存分配的时候,产生的不能重复利用的空间,本文主要介绍了Redis 内存碎片原因及清理,具有一定的参考价值,感兴趣的可以了解一下
    2024-06-06
  • Redis常见数据类型List列表使用详解

    Redis常见数据类型List列表使用详解

    Redis的List是一种有序的字符串集合,支持两端高效插入和删除,适用于队列和栈,这篇文章主要介绍了Redis常见数据类型List列表使用的相关资料,需要的朋友可以参考下
    2024-12-12
  • 基于redis实现分布式锁的原理与方法

    基于redis实现分布式锁的原理与方法

    这篇文章主要给大家介绍了基于redis实现分布式锁的原理与方法,文中通过示例代码介绍的非常详细,对大家学习或者使用redis具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-06-06
  • redis过期回调功能实现示例

    redis过期回调功能实现示例

    Redis提供了一种过期回调的机制,可以在某个键过期时触发一个回调函数,本文就来介绍一下redis过期回调功能实现示例,感兴趣的可以了解一下
    2023-09-09

最新评论