解决Redis集群条件下键空间通知服务器接收不到消息的问题
键空间通知介绍
键空间通知使得客户端可以通过订阅频道或模式, 来接收那些以某种方式改动了 Redis 数据集的事件。
可以通过对redis的redis.conf文件中配置notify-keyspace-events参数可以指定服务器发送哪种类型的通知。下面对于一些参数的描述。默认情况下此功能是关闭的。
![3a8f1103ed282c903d83ffd0c7afab35.png](https://i-blog.csdnimg.cn/blog_migrate/54285373e6112f78dbbcc25811f92bf9.jpeg)
所以当你配置文件中配置为AKE时就表示发送所有类型的通知。
在程序中接入
使用SpringData可以轻松的实现对于redis键空间通知的接收操作。只需要作如下配置即可
所使用的jar包
'org.springframework.boot:spring-boot-starter-data-redis'
配置监听器
@Configuration
@ConditionalOnExpression("!'${spring.redis.host:}'.isEmpty()")
public static class RedisStandAloneAutoConfiguration {
@Bean
public RedisMessageListenerContainer customizeRedisListenerContainer(
RedisConnectionFactory redisConnectionFactory,MessageListener messageListener) {
RedisMessageListenerContainer redisMessageListenerContainer = new RedisMessageListenerContainer();
redisMessageListenerContainer.setConnectionFactory(redisConnectionFactory);
redisMessageListenerContainer.addMessageListener(messageListener,new PatternTopic("__keyspace@0__:*"));
return redisMessageListenerContainer;
}
}
其中PatternTopic构造器里面填写的是你所要监听哪一个通道。
例如在redis中执行set blog buxuewushu。我配置文件中配置的AKE所以所有消息都会发送,他就会发送两条信息。
PUBLISH __keyspace@0__:blog setPUBLISH __keyevent@0__:set blog
所以我在上面配置的监听规则__keyspace@0__:*就是监听0号库发送的所有space信息都会接收到。
配置处理器
上面我们配置了监听Redis的哪条通道,现在我们需要配置接收到了信息以后如何处理的事情。所以此时我们需要在程序中写处理器
@Slf4j
@Component
public class KeyExpiredEventMessageListener implements MessageListener {
@Override
public void onMessage(Message message, byte[] pattern) {
log.info("监听失效的redisKey:{},值是:{}