共分为两类:一类是键空间通知 另一类是键事件通知
数据库通知是redis在2.8之后新增的功能,让客户端可以已发布/订阅模式来获取数据库中键的变化以及某事件的发生
开启后能接收到的类型只有两种:keyspace和keyevent
前者为事件的具体操作,后者为事件影响的键名
项目中配置了redis.conf,redisListenerConfig之后
编写个 RedisKeyExpirationListenerServer 类继 KeyExpirationEventMessageListener
然后实现他的doRegister方法和onMessage方法
主要就是doRegister里面你进行订阅的topic是啥
- 想要订阅键空间就是 __keyspace,具体哪个键就后面@再加上键的key,如user,key a,key b等等。
- 想要订阅键事件就是__keyevent,具体哪个事件就后面@再加上事件的操作,如del ,set ,expire等
我的需求是当设置的某个键过期的时候,我这边能接收到这个事件,所以这里我接收的是keyevent@0__:expired这个topic
@Override
protected void doRegister(RedisMessageListenerContainer listenerContainer) {
String topic = "__keyevent@"+database+"__:expired";
log.info("配置监听哪个频道:"+topic);
PatternTopic patternTopic = new PatternTopic(topic);
// 频道可以是多,多个传list
listenerContainer.addMessageListener(this,patternTopic);
}
@Override
public void onMessage(Message message, byte[] pattern) {
// 用户做自己的业务处理即可,注意message.toString()可以获取失效的key
String expiredKey = message.toString();
log.info("失效的key"+expiredKey);
if(expiredKey.contains(RedisContact.SERVERNAME)){
deal(expiredKey);
}