开发技术-批量删除redis数据的4种方法

先前项目组使用redis没有设置过期时间,导致redis数据越来越多,redis服务器内存撑不住了。

批量删除redis数据方法如下:

1.利用的是Linux的xargs命令

在redis服务器上,redis安装路径的bin目录下,执行命令

redis-cli -h 127.0.0.1 -p 6379 -a ‘123’ keys “test*”|xargs redis-cli -h 127.0.0.1 -p 6379 -a ‘123’ del

2.利用redis客户端

登录到redis客户端,选中需要删除的目录,右键,弹出delete namespace

3.利用lua

以上两种方法删除不了的,或者执行xargs命令报错的:

Warning: a NUL character occurred in the input. It cannot be passed through in the argument list. Did you mean to use the –null option?

可以使用lua脚本,redis有内置的lua解释器。

脚本内容(del.lua)

local key=KEYS[1]

local list=redis.call(“keys”, key);

for i,v in ipairs(list) do

redis.call(“del”, v);

end

将del.lua上传至redis的bin目录下,然后执行命令

redis-cli -h 127.0.0.1 -p 6379 –eval ./del.lua “test-

4.利用Java代码

以下代码由金宝独家提供

package com.example.demo;

import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.data.redis.core.Cursor;

import org.springframework.data.redis.core.RedisCallback;

import org.springframework.data.redis.core.RedisTemplate;

import org.springframework.data.redis.core.ScanOptions;

import org.springframework.data.redis.serializer.StringRedisSerializer;

import org.springframework.stereotype.Component;

@Component

public class BatchDelRedis {

@Autowired

RedisTemplate redisTemplate;

private String redisKeys = "key1,key2,key3";//也可以参数化配置,使用@value注解
Log log = LogFactory.getLog(this.getClass());

/**
 * 利用scan类每次迭代指定数目key然后一次一次删
 */
public void delRedisKey() {
    try {
        log.info("从redis查询开始" + System.currentTimeMillis());
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        String[] split = null;
        if (redisKeys.contains(",")) {
            split = redisKeys.split(",");
        } else {
            split = new String[]{redisKeys};
        }
        if (split.length > 0) {
            for (String key : split) {
                log.info("redisKey::::::>" + key);
                long start = System.currentTimeMillis();
                RedisCallback redisCallback = connection -> {
                    ScanOptions.ScanOptionsBuilder scanOptionsBuilder = ScanOptions.scanOptions();
                    scanOptionsBuilder.match(key);
                    scanOptionsBuilder.count(15000);
                    ScanOptions scanOptions = scanOptionsBuilder.build();
                    Cursor cursor = connection.scan(scanOptions);
                    long count = 0;
                    while (cursor.hasNext()) {
                        count += connection.del(cursor.next());     //count为所有删除成功次数的总和
                    }
                    return count;
                };
                Long count = (Long) redisTemplate.execute(redisCallback);
                long end = System.currentTimeMillis();
                log.info("被删除KEY" + key + "的数量为:" + count);
                log.info(String.format("总计耗时:【%s】秒", (end - start) / 1000));
            }
        }
        log.info("从redis删除结束" + System.currentTimeMillis());
    } catch (Exception e) {
        log.error("删除理赔查询异步落库消息异常");
    }
}

}

————————————————

版权声明:本文为CSDN博主「JustDI-CM」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/JustDI0209/article/details/118972665

本文来自网络,不代表协通编程立场,如若转载,请注明出处:https://net2asp.com/b861b0c695.html