Java集成Redis key过期通知

为什么要使用过期通知呢?
捕获Redis中过期的Key,解锁新姿势。比如有个用户会员的模块,那么可以在redis添加一个用户会员的有效时Key,然后在Java项目中捕获,处理相关的逻辑。

一、开启Redis Key过期通知的配置

这个配置需要手动开启,Redis默认是关闭的。Redis有两种方式开启该配置:
1.修改配置文件
打开Redis目录下的redis.conf,找到notify-keyspace-events “” ,改成notify-keyspace-events Ex。这里一定要改正确了!
redis.conf配置文件下
通过上面的注释就可以发现,下方的配置是关于过期key通知的。
2.在redis-cli中更改配置

打开redis-cli.exe config set notify-keyspace-events Ex

二、修改好配置后在redis-cli.exe中测试是否可以监听过期key

1.打开一个redis-cli.exe,输入命令:

127.0.0.1:6379> PSUBSCRIBE __keyevent@0__:expired
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "__keyevent@0__:expired"
3) (integer) 1

2.再打开一个redis-cli.exe,创建一个过期的key

127.0.0.1:6379> setex t_key 2 t_value
OK
127.0.0.1:6379>

如果在监听过期key中的redis-cli里多了过期的key,那么意味着配置正确。

127.0.0.1:6379> PSUBSCRIBE __keyevent@0__:expired
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "__keyevent@0__:expired"
3) (integer) 1
1) "pmessage"
2) "__keyevent@0__:expired"
3) "__keyevent@0__:expired"
4) "t_key"

如果没有这个"t_key",就要回头看看redis.conf是否配置正确。配置文件中ctrl+f,是否能找到notify-keyspace-events Ex。如果有还没成功,检查配置文件中是否有多余的notify-keyspace-events “”,有则删掉。

三、在java项目中编写一个监听类


/**
 * @author wangwei
 * @date 2020/2/21 - 11:20
 */
@Slf4j
public class KeyExpiredListener extends KeyExpirationEventMessageListener {

    public KeyExpiredListener (RedisMessageListenerContainer listenerContainer) {
        super(listenerContainer);
    }

    @Override
    public void onMessage(Message message, byte[] pattern) {
    	// 获得过期的key
        String keyName = message.toString();
        switch (nameSpace) {
            case "user":
                // TODO 这里处理逻辑
                log.info(keyName);
        }
    }
}

这里要继承KeyExpirationEventMessageListener 类,然后重写其中的onMessage方法,形参中的message便是是过期的key的Message对象。

到这还没有结束,还需要配置连接的redis属性!

四、编写一个配置类,配置redis

@Configuration
public class RedisConfig {
    @Autowired
    private RedisConnectionFactory redisConnectionFactory;

    @Bean
    public RedisMessageListenerContainer redisMessageListenerContainer() {
        RedisMessageListenerContainer redisMessageListenerContainer = new RedisMessageListenerContainer();
        redisMessageListenerContainer.setConnectionFactory(redisConnectionFactory);
        return redisMessageListenerContainer;
    }
    @Bean
    public KeyExpiredListener keyExpiredListener() {
        return new KeyExpiredListener(this.redisMessageListenerContainer());
    }

第一个@Bean是创建一个新的Redis消息监听容器,然后指定Redis连接。第二个@Bean是给我们写的监听类指定一个Redis消息监听容器,即第一个@Bean的内容。

最后再检查配置文件中是否配置了Redis的属性。

spring:
  redis:
    host: localhost
    port: 6379

到此,Java集成Redis key过期通知就完成啦,是不是很简单呀?如有问题欢迎大牛指点~~

发布了1 篇原创文章 · 获赞 2 · 访问量 21

猜你喜欢

转载自blog.csdn.net/weixin_44006267/article/details/104406826