开发技术-批量删除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<Long> redisCallback = connection -> {
                        ScanOptions.ScanOptionsBuilder scanOptionsBuilder = ScanOptions.scanOptions();
                        scanOptionsBuilder.match(key);
                        scanOptionsBuilder.count(15000);
                        ScanOptions scanOptions = scanOptionsBuilder.build();
                        Cursor<byte[]> 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("删除理赔查询异步落库消息异常");
        }
    }
}

 


版权声明:本文为JustDI0209原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。