机制实现Redis中Java过期机制的研究(redisjava过期)
Redis在K-V存储系统中是比较流行的一种数据库,它支持灵活的atime和etime操作,有助于系统的运行维护。一般情况下,设置Key的时候,我们可以设置过期时间,当Key对应的value超过约定的过期时间,则value会自动清除,但这个过程是定时不断地执行的,这就让有些场景填不上,比如:当系统受到流量攻击,Key定时扫描过程会占据系统资源,尤其是在K-V数据量大的情况下,那么实现Redis中Java过期的机制应该如何呢?
首先,为Redis中的键设置永久的有效期。用客户端可以设置一个键有永久的有效期,只要客户端可以确保恰当地把有效期的相关值赋值给键,那么Redis就能保持有效。例如,可以在服务器端使用‘SETNX’指令,将一个带有永久有效期的值存储在准备将设置和获取键值对的服务器上,在每次获取键值对时,可检查有效期键是否存在,如果不存在则把它作为键和有效期设置进键值对中,以后要重新设置过期时间时,redis可以轻松地判断键是否过期:
// 设置键的永久有效期
String key = “key”; String expireTime = System.currentTimeMillis()
jedis.setnx(key, expireTime);
// 若需要重新设置过期时间if (jedis.get(key) != null) {
long expireTime = System.currentTimeMillis() + 60 * 1000; // 新的有效期 jedis.set(key, expireTime);
}if (System.currentTimeMillis() > jedis.get(key)) {
// 如果当前时间超出有效期,则将key进行删除 jedis.del(key);
}
也可以使用定时方式,使用java定时任务在客户端设置每隔一段时间定时删除失效的key-value数据,这种定时任务需要在redis中创建额外的索引数据,需要记录每个Key对应的过期时间和操作函数,过期时间满足要求则调用删除函数:
//设置键的定时有效期
String key = “key”;Long expireTime = System.currentTimeMillis() + 60 * 1000; //设置key的过期时间
jedis.hset("timer", key, expireTime);
// 使用定时任务定时删除过期Key-Value TimerTask timerTask = new TimerTask() {
public void run() { // 检查过期时间
Map result = jedis.hgetAll("timer");
for (Map.Entry entry : result.entrySet()) {
if(System.currentTimeMillis() > entry.getValue() ){ // 若当前时间超出有效期,则将key进行删除
jedis.del(entry.getKey()); }
} }
};Timer timer = new Timer();
timer.scheduleAtFixedRate(timerTask, 0, 60000);
以上两种方式都可以实现Redis中Java过期机制,具体选择哪一种过期失效机制,要根据实际的场景和数据量的多少来选择。