Redis 触发器
监听 Redis 中Key超时失效的事件
Redis中的key可以设置生存时间,当该key超时失效时会触发一个事件
“过期事件通过Redis的订阅与发布功能(pub/sub)来进行分发。”
首先需要修改Redis 的配置文件,将 notify-keyspace-events 的值改为 Ex
1.监听程序
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.JedisPubSub;
/**
* 监听器,监听redis中键到期自动删除事件,(键需要设置过期时间)
*
* 需要在redis配置文件中设置 notify-keyspace-events 的值为 Ex
*/
public class RedisTimerListener extends JedisPubSub {
//获取jedis连接
Jedis jedis ;
public void init(){
JedisPool jedisPool = new JedisPool(new JedisPoolConfig(),"127.0.0.1",6379,0,"redis",0);
jedis = jedisPool.getResource();
}
/**
* 监听器被加载时执行该方法
*/
@Override
public void onPSubscribe(String pattern, int subscribedChannels) {
init();
System.out.println("onPSubscribe "
+ pattern + " " + subscribedChannels);
}
/**
* 键到期自动删除时触发该方法
*/
@Override
public void onPMessage(String pattern, String channel, String message) {
init();
System.out.println(jedis.get(message));
System.out.println("onPMessage pattern "
+ pattern + " " + channel + " " + message);
}
}
2.订阅者
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
/**
* 订阅者
*/
public class RedisSubscribe {
public static void main(String[] args) {
JedisPool jedisPool = new JedisPool(new JedisPoolConfig(),"127.0.0.1",6379,0,"redis",0);
Jedis jedis = jedisPool.getResource();
//订阅信息
jedis.psubscribe(new RedisTimerListener(), "__keyevent@0__:expired");
}
}
3.测试类
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
/**
* 测试类
*/
public class RedisTimerTest {
public static void main(String[] args) {
JedisPool jedisPool = new JedisPool(new JedisPoolConfig(),"127.0.0.1",6379,0,"redis",0);
Jedis jedis = jedisPool.getResource();
//将键放入redis,并设置生存时间 5s
jedis.set("shorderid_12", "a12");
jedis.expire("shorderid_12", 5);
//删除键 (手动删除键时不触发事件)
jedis.del("shorderid_12");
jedis.set("shorderid_14", "a14");
jedis.expire("shorderid_14", 7);
// jedis.del("shorderid_14");
}
}
注意:
过期监听的管道默认是__keyevent@0__:expired,艾特后面的0表示第几号是数据库,(0-15)