• 设为首页
  • 收藏本站
  • 积分充值
  • VIP赞助
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    福建二哥 门户 查看主题

    Redis 大key的几种删除方式

    发布者: 姬7089 | 发布时间: 2025-6-19 12:40| 查看数: 113| 评论数: 0|帖子模式

    在前面的文章 Redis删除大key时为什么会阻塞中,有说到,不应该直接调用 del 命令删除key,容易造成请求被阻塞,那应该如何来处理呢?
    这次从代码编写的角度来举例说明下。
    在Redis中,有几个比较特殊的结构String,List、Hash、Set、ZSet, 从Redis删除大key时为什么会阻塞中文章可以知道,不能直接del (除了string),而应该使用 scan的方式,而每一个类型也都有自己的scan 方式。接下来以 Java Jedis 为例。

    List
    1. String key = "demo";
    2. int length = jedis.llen("demo");
    3. if (length > 1024) {
    4.     int size = 100;
    5.     int count = 0;
    6.     do {
    7.         //每次处理前100个
    8.         // redis内部也会判断当前传递的索引有没有超过当前的list的长度
    9.         // 可参阅 ltrimCommand
    10.         jedis.ltrim(key, 0, size);
    11.         count += size;
    12.     }
    13.         while (count < length);
    14. }
    15. jedis.del(key);
    复制代码
    Set
    1. String key = "demo";

    2. long length = jedis.scard(key);
    3. if (length > 1024) {
    4.     //每次遍历100个
    5.     ScanParams scanParams = new ScanParams().count(100);
    6.     // 传递的游标
    7.     java.lang.String cursor = "0";
    8.     ScanResult<String> sscan;
    9.     do {
    10.         //传递 scan的参数
    11.         sscan = jedis.sscan(key, cursor, scanParams);
    12.         if (!CollectionUtils.isEmpty(sscan.getResult())) {
    13.             // 遍历返回的结果,依次删除
    14.             sscan.getResult().stream().forEach(member -> {
    15.                 jedis.srem(key, member);
    16.             });
    17.         }
    18.         // 传入下次遍历的游标
    19.         cursor = sscan.getCursor();
    20.     } while (!sscan.isCompleteIteration());
    21. }
    22. jedis.del(key);
    复制代码
    ZSet
    1. String key = "demo";
    2. // 获取zset的长度
    3. long length = jedis.zcard(key);
    4. if (length > 1024) {
    5.     int size = SIZE;
    6.     int count = 0;
    7.     do {
    8.         // 删除指定的集合
    9.         jedis.zremrangeByRank(key, 0, size);
    10.         count += size;
    11.     }
    12.     while (count < length);
    13. }
    14. jedis.del(key);
    复制代码
    Hash
    1. String key = "demo";
    2. // 获取Hash的字段个数
    3. long length = jedis.hlen(key);
    4. if (length > THROLD) {
    5.     ScanParams scanParams = new ScanParams();
    6.     // 遍历大小
    7.     scanParams.count(SIZE);
    8.     // 匹配哪些字段
    9.     scanParams.match("*");
    10.     ScanResult<Map.Entry<String, String>> result;
    11.     java.lang.String cursor = "0";
    12.     do {
    13.         // 遍历字段
    14.         result = jedis.hscan(key, cursor, scanParams);
    15.         if (!CollectionUtils.isEmpty(result.getResult())) {
    16.             // 删除指定的字段
    17.             result.getResult().stream().forEach(x -> {
    18.                 jedis.hdel(key, x.getKey());
    19.             });
    20.         }
    21.         cursor = result.getCursor();
    22.     } while (!result.isCompleteIteration());
    23. }
    24. jedis.del(key);
    复制代码
    到此这篇关于Redis 大key的几种删除方式的文章就介绍到这了,更多相关Redis 大key删除内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    来源:https://www.jb51.net/database/338428w8n.htm
    免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

    最新评论

    浏览过的版块

    QQ Archiver 手机版 小黑屋 福建二哥 ( 闽ICP备2022004717号|闽公网安备35052402000345号 )

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表