1. 背景
项目组使用 Redis 太过奔放,许多 key 并没有设置过期时间,导致 Redis 服务器内存压力过大,需要成批次的为 key 设置过期时间。
2. 方法
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.ScanParams;
import redis.clients.jedis.ScanResult;
import java.util.HashSet;
import java.util.Set;
@Component
public class BatchSetRedisKeyExpire {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
private static final String REDIS_HOST = "localhost"; //redis IP
private static final int REDIS_PORT = 6379;
private static final String REDIS_PASSWORD = "password";
public void deal(String keyPrefix) {
Jedis jedis = new Jedis(REDIS_HOST, REDIS_PORT);
jedis.auth(REDIS_PASSWORD); // 如果有密码就设置
jedis.select(6); // Redis库号
try {
String cursor = "0"; // 游标从0开始
ScanParams scanParams = new ScanParams()
.match(keyPrefix + "*") // 模糊匹配
.count(1000); // 每次读取1000条
Set<String> keys = new HashSet<>();
do {
// 使用 SCAN 命令遍历 key
ScanResult<String> scanResult = jedis.scan(cursor, scanParams);
keys.addAll(scanResult.getResult());
cursor = scanResult.getStringCursor();
} while (!cursor.equals("0"));
for (String key : keys) {
// 遍历key并设置过期时间,单位 秒
jedis.expire(key, 3600);
}
logger.info("匹配到key的数量:" + keys.size());
}catch (Exception e) {
e.printStackTrace();
}finally {
jedis.close();
}
}
}
(图网,侵删)