网站建设分什么行业,wordpress影视站,微信小程序制作商,qq企业邮箱怎么注册文章目录 Redis 键空间通知一、keyspace介绍二、事件通知配置三、不同命令生成的事件四、客户端测试五、Springboot整合Redis键空间监听5.1 方式一5.2 方式二 Redis 键空间通知
一、keyspace介绍
keyspace#xff08;键空间通知#xff09;针对指定key发生的一切改动#… 文章目录 Redis 键空间通知一、keyspace介绍二、事件通知配置三、不同命令生成的事件四、客户端测试五、Springboot整合Redis键空间监听5.1 方式一5.2 方式二 Redis 键空间通知
一、keyspace介绍
keyspace键空间通知针对指定key发生的一切改动推送给订阅的客户端侧重于针对指定key的操作
键空间通知监听格式__keyspacedb__:key
二、事件通知配置
默认情况下键空间事件通知被禁用因为虽然不太明智但该功能会使用一些 CPU 功率。notify-keyspace-events有两种配置方式
通过redis.conf配置通过config set 启用通知重启失效
例config set notify-keyspace-events “KEA”将参数设置为空字符串会禁用通知。为了启用该功能使用由多个字符组成的非空字符串其中每个字符都有特殊含义
字符发送的通知K键空间通知所有通知以 __keyspacedb__ 为前缀E键事件通知所有通知以__keyeventdb__为前缀gdel、expire、rename 等类型无关的通用命令的通知$string命令的通知llist命令的通知sset命令的通知hhash命令的通知zzset命令的通知e驱逐(evict)事件每当有键因为 maxmemory 政策而被删除时发送A参数 g$lshzxe 的别名
至少K或E应该出现在字符串中否则无论字符串的其余部分如何都不会传递任何事件。
例如要仅启用列表的键空间事件配置参数必须设置为Kl等等。
您可以使用该字符串KEA来启用所有类型的通知
三、不同命令生成的事件
具体的看官方文档Redis 键空间通知这里举几个例子
DEL为每个已删除的键生成一个del事件。RENAME生成两个事件一个rename_from针对源键的事件一个rename_to针对目标键的事件。MOVE生成两个事件一个move_from针对源键的事件一个move_to针对目标键的事件。COPY生成一个copy_to事件。EXPIRE及其所有变体PEXPIRE、EXPIREAT、PEXPIREATexpire在使用正超时或未来时间戳调用时都会生成一个事件。请注意当使用过去的负超时值或时间戳调用这些命令时键将被删除并且仅del生成一个事件。…
四、客户端测试
Redis键空间监听的本质是通过订阅与键相关的消息通知来实现的。当一个Redis键空间的事件发生时Redis会将事件信息发送到相应的频道channel而订阅了该频道的客户端就会接收到这些消息通知。
1.打开redis客户端连接然后设置所有类型事件都通知
C:\Users\Lenovoredis-cli
127.0.0.1:6379 config set notify-keyspace-events KEA
OK
127.0.0.1:63792.订阅一个频道配置key为qqq:*就会触发通知
# PSUBSCRIBE命令用于订阅一个或多个符合指定模式的频道channel支持通配符模式
127.0.0.1:6379 PSUBSCRIBE __keyspace*__:qqq:*
Reading messages... (press Ctrl-C to quit)
1) psubscribe
2) __keyspace*__:qqq:*
3) (integer) 13.新开一个客户端
C:\Users\Lenovoredis-cli
127.0.0.1:6379 set qqq:111 222
OK
127.0.0.1:6379结果可以看到只要qqq:*的发生了变动就会触发通知 五、Springboot整合Redis键空间监听
5.1 方式一
1.引入依赖
dependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-redis/artifactIdversion2.5.4/version/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependency
/dependencies2.配置redis
server.port8080spring.redis.port6379
spring.redis.host127.0.0.13.配置监听器
Slf4j
Component
public class RedisListener implements MessageListener {Overridepublic void onMessage(Message message, byte[] pattern) {System.out.println(message.toString());String body new String(message.getBody());System.out.println(body);String channel new String(message.getChannel());System.out.println(channel);int index channel.indexOf(:);String key channel.substring(index 1); // 找到第一个冒号的位置,冒号后面就是keylog.info(redis key: {} , channel: {}, key, channel);}
}4.开启监听以及配置监听范围
Component
public class RedisContainer {AutowiredRedisListener redisListener;Autowiredprivate TaskExecutor redisListenerContainerTaskExecutor;private static final Topic TOPIC_ALL_KEYSPACE new PatternTopic(__keyspace*__:*);Beanpublic RedisMessageListenerContainer container(RedisConnectionFactory factory) {RedisMessageListenerContainer container new RedisMessageListenerContainer();container.setConnectionFactory(factory);// __keyspace*__:* 可以配置一个也可配置多个container.addMessageListener(redisListener, TOPIC_ALL_KEYSPACE);container.setTaskExecutor(redisListenerContainerTaskExecutor);return container;}
}5.测试
5.2 方式二
1.增加redisTemplate配置
Configuration
public class RedisConfig {Beanpublic RedisTemplateString, Object redisTemplate(RedisConnectionFactory connectionFactory) {// 创建RedisTemplate对象RedisTemplateString, Object template new RedisTemplate();// 设置连接工厂template.setConnectionFactory(connectionFactory);// 创建JSON序列化工具GenericJackson2JsonRedisSerializer jsonRedisSerializer new GenericJackson2JsonRedisSerializer();// 设置Key的序列化template.setKeySerializer(RedisSerializer.string());template.setHashKeySerializer(RedisSerializer.string());// 设置Value的序列化template.setValueSerializer(jsonRedisSerializer);template.setHashValueSerializer(jsonRedisSerializer);// 返回return template;}
}2.使用PostConstruct在项目启动时动态注入容器
Slf4j
Component
public class service {Autowiredprivate ApplicationContext applicationContext;Autowiredprivate TaskExecutor redisListenerContainerTaskExecutor;Autowiredprivate RedisTemplateString, Object redisTemplate;private static final Topic TOPIC_ALL_KEYSPACE new PatternTopic(__keyspace*__:*);PostConstructvoid init(){DefaultListableBeanFactory defaultListableBeanFactory (DefaultListableBeanFactory) applicationContext.getAutowireCapableBeanFactory();// 创建redis监听器MessageListener listener (message, pattern) - {System.out.println(message: message.toString());String body new String(message.getBody());System.out.println(body: body);String channel new String(message.getChannel());System.out.println(channel: channel);int index channel.indexOf(:);String key channel.substring(index 1); // 找到第一个冒号的位置,冒号后面就是keylog.info(redis key: {} , channel: {}, key, channel);};// 创建redis监听适配器MessageListenerAdapter listenerAdapter new MessageListenerAdapter(listener);// 创建redis消息监听容器RedisMessageListenerContainer container new RedisMessageListenerContainer();container.setConnectionFactory(redisTemplate.getConnectionFactory());container.addMessageListener(listenerAdapter, TOPIC_ALL_KEYSPACE);container.setTaskExecutor(redisListenerContainerTaskExecutor);// redis消息监听容器注入到spring中BeanDefinitionBuilder listenerBeanDefinitionBuilder BeanDefinitionBuilder.genericBeanDefinition(RedisMessageListenerContainer.class, () - container);defaultListableBeanFactory.registerBeanDefinition(redisMessageListenerContainer, listenerBeanDefinitionBuilder.getBeanDefinition());}
}3.结果一样