机制解析Redis Java的过期机制.(redisjava过期)
Redis 使用简单的机制来支持对数据过期处理,并且所有的这些机制都不会牺牲性能或者降低性能。让我们看一下Redis Java的过期机制有哪些。
Redis Java有两种过期机制,分别是KEY驱动的定时删除和VALUE驱动的定时删除。
对 KEY 驱动的定时删除来说,程序会把需要定时删除的KEY存储在Redis集合中,并指定删除的时间。每次运行任务时,Redis服务器会根据设定的时间来遍历集合中的KEY,并将它们删除。
下面是一个使用KEY驱动的定时删除的示例代码:
//设置一个要定时删除的key
Jedis jedis = new Jedis("localhost", 6379);jedis.setex("myKey", 3600, "myValue");
//定义一个任务,每次运行时查询是否有已经设定了过期时间的keyclass ExpireTask implements Runnable {
@Override public void run() {
Jedis jedis = new Jedis("localhost", 6379); while(true) {
//查询所有已设定过期时间的key Set keys = jedis.keys("*");
for (String key : keys) {
if (jedis.ttl(key) == -1) { //如果过期时间小于0,说明key未设置过期时间,可以忽略
continue; }
long ttl = jedis.ttl(key);
if (ttl //如果过期时间等于0,说明key已经过期,可以执行删除
jedis.del(key);
} }
//休眠10秒,等待下一次任务 Thread.sleep(10000);
} }
}
对于VALUE驱动的定时删除机制来说,和KEY驱动不同,它不用存储定时删除的Key。而是在放入Key-Value时,就把定时删除的信息放入Value中,然后每次任务运行时,做一些计算操作,来判断哪些Key需要过期。
以下是使用VALUE驱动的定时删除的示例代码:
//设置一个要定时删除的key
Jedis jedis = new Jedis("localhost", 6379);
//定义需要存储的value,并设定一个过期时间MyValue value = new MyValue();
value.setExpireTime(System.currentTimeMillis() + 3600*1000);
jedis.set("myKey", value);
//定义一个任务,每次运行时遍历所有key,检查value中是否有过期时间,如果有,则删除keyclass ExpireTask implements Runnable {
@Override public void run() {
Jedis jedis = new Jedis("localhost", 6379); while(true) {
//查询所有key Set keys = jedis.keys("*");
for (String key : keys) {
MyValue myValue = jedis.get(key); //检查value中是否设置了过期时间
if (myValue.getExpireTime() == null) {
//如果过期时间为null,说明key未设置过期时间,可以忽略 continue;
}
long expireTime = myValue.getExpireTime(); long currentTime = System.currentTimeMillis();
if (expireTime //如果过期时间大于当前时间,说明key已经过期,可以执行删除
jedis.del(key);
} }
//休眠10秒,等待下一次任务 Thread.sleep(10000);
} }
}
以上就是Redis Java的过期机制。Redis通过简单的机制,可以很好地支持数据过期处理,而且不会牺牲系统性能。上述两种过期机制,程序员可以根据自己的需求进行选择,来实现Redis的数据过期处理。