当前位置: 代码网 > it编程>数据库>Redis > Redis 大key的几种删除方式

Redis 大key的几种删除方式

2025年03月26日 Redis 我要评论
在前面的文章 redis删除大key时为什么会阻塞中,有说到,不应该直接调用 del 命令删除key,容易造成请求被阻塞,那应该如何来处理呢?这次从代码编写的角度来举例说明下。在redis中,有几个比

在前面的文章 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删除内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网! 

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com