开发技术-批量删除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("删除理赔查询异步落库消息异常"); } } }
上一篇:
通过多线程提高代码的执行效率例子