java实现删除redis千万级数据的大key

2024-08-27 00:58

本文主要是介绍java实现删除redis千万级数据的大key,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

redis删除千万级大key问题处理-20171017

 

1、问题描述

redis数据存储了几千万的数据的key,使用del无法删除,占用大量redis内存,且会导致redis切机
 

2、问题分析

redis使用del每秒可清理100w~几百万个值,假如是几千万的大数据量的key时,会导致redis阻塞10秒以上,sentinel会检测redis状态判断redis故障,而进行切换,应用程序也会在这期间连不上redis而崩溃,所以需分批处理,别因删除数据而阻塞redis,从而导致程序故障。
 

3、问题处理

redis v2.8以上推出了scan命令,以时间复杂度为O(1)的方式,遍历包含n个元素的大key,避免使用单个O(n)的大key命令,导致redis阻塞,java实现代码为:

public boolean delLargeHashKey(String key, int scanCount) throws Exception{
        boolean broken = false;
        Jedis jedis = pool.getSentineJedis();
        try{
        if (jedis!=null)
        {
                ScanParams scanParameters = new ScanParams();

                                         //一次获取500条,可自定义条数
                scanParameters.count(scanCount);
                String cursor = "";
                while ((!cursor.equals("0")) || (cursor == "0")){
                
                //使用hscan命令获取500条数据,使用cursor游标记录位置,下次循环使用
                ScanResult<Map.Entry<String, String>> hscanResult=jedis.hscan(key, cursor, scanParameters);
                cursor = hscanResult.getStringCursor();// 返回0 说明遍历完成
                List<Map.Entry<String, String>> scanResult = hscanResult.getResult();
                long t1 = System.currentTimeMillis();
                for(int m = 0;m < scanResult.size();m++){  
                    Map.Entry<String, String> mapentry  = scanResult.get(m);
                    //System.out.println("key: "+mapentry.getKey()+"  value: "+mapentry.getValue());
                    jedis.hdel(key, mapentry.getKey());
                    }
                long t2 = System.currentTimeMillis();
                System.out.println("删除"+scanResult.size()+"条数据,耗时: "+(t2-t1)+"毫秒,cursor:"+cursor);
                }
                return true;
        }
        return false;
    }catch (JedisException e) {
        broken = pool.handleJedisException(e);
        if (broken) {
            pool.closeResource(jedis, broken);
        }
        throw e;
    } finally {
        if (!broken && jedis != null) {
            pool.sentinel_close(jedis);
        }
    }
    }
已经在使用中,删除大key无任何异常,且速度很快

如果您觉得我的文章给了您帮助,请为我买一杯饮料吧!以下是我的支付宝,意思一下我将非常感激!

这篇关于java实现删除redis千万级数据的大key的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1110179

相关文章

Spring LDAP目录服务的使用示例

《SpringLDAP目录服务的使用示例》本文主要介绍了SpringLDAP目录服务的使用示例... 目录引言一、Spring LDAP基础二、LdapTemplate详解三、LDAP对象映射四、基本LDAP操作4.1 查询操作4.2 添加操作4.3 修改操作4.4 删除操作五、认证与授权六、高级特性与最佳

Spring Shell 命令行实现交互式Shell应用开发

《SpringShell命令行实现交互式Shell应用开发》本文主要介绍了SpringShell命令行实现交互式Shell应用开发,能够帮助开发者快速构建功能丰富的命令行应用程序,具有一定的参考价... 目录引言一、Spring Shell概述二、创建命令类三、命令参数处理四、命令分组与帮助系统五、自定义S

SpringBatch数据写入实现

《SpringBatch数据写入实现》SpringBatch通过ItemWriter接口及其丰富的实现,提供了强大的数据写入能力,本文主要介绍了SpringBatch数据写入实现,具有一定的参考价值,... 目录python引言一、ItemWriter核心概念二、数据库写入实现三、文件写入实现四、多目标写入

Android Studio 配置国内镜像源的实现步骤

《AndroidStudio配置国内镜像源的实现步骤》本文主要介绍了AndroidStudio配置国内镜像源的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、修改 hosts,解决 SDK 下载失败的问题二、修改 gradle 地址,解决 gradle

SpringSecurity JWT基于令牌的无状态认证实现

《SpringSecurityJWT基于令牌的无状态认证实现》SpringSecurity中实现基于JWT的无状态认证是一种常见的做法,本文就来介绍一下SpringSecurityJWT基于令牌的无... 目录引言一、JWT基本原理与结构二、Spring Security JWT依赖配置三、JWT令牌生成与

Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码

《Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码》:本文主要介绍Java中日期时间转换的多种方法,包括将Date转换为LocalD... 目录一、Date转LocalDateTime二、Date转LocalDate三、LocalDateTim

如何配置Spring Boot中的Jackson序列化

《如何配置SpringBoot中的Jackson序列化》在开发基于SpringBoot的应用程序时,Jackson是默认的JSON序列化和反序列化工具,本文将详细介绍如何在SpringBoot中配置... 目录配置Spring Boot中的Jackson序列化1. 为什么需要自定义Jackson配置?2.

Java中使用Hutool进行AES加密解密的方法举例

《Java中使用Hutool进行AES加密解密的方法举例》AES是一种对称加密,所谓对称加密就是加密与解密使用的秘钥是一个,下面:本文主要介绍Java中使用Hutool进行AES加密解密的相关资料... 目录前言一、Hutool简介与引入1.1 Hutool简介1.2 引入Hutool二、AES加密解密基础

Redis在windows环境下如何启动

《Redis在windows环境下如何启动》:本文主要介绍Redis在windows环境下如何启动的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Redis在Windows环境下启动1.在redis的安装目录下2.输入·redis-server.exe

使用Python将JSON,XML和YAML数据写入Excel文件

《使用Python将JSON,XML和YAML数据写入Excel文件》JSON、XML和YAML作为主流结构化数据格式,因其层次化表达能力和跨平台兼容性,已成为系统间数据交换的通用载体,本文将介绍如何... 目录如何使用python写入数据到Excel工作表用Python导入jsON数据到Excel工作表用