先前项目组使用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("删除理赔查询异步落库消息异常");
}
}
}