键空间通知可以让客户端实时监听Redis键和值的变化,比如删除、新增、修改重命名等
因为开启键空间通知功能需要消耗一些CPU,所以默认清空下该功能是关闭的,可以通过修改redis.conf文件,windows版本是redis.windows.conf文件,或者使用config set 命令来临时开启或关闭键空间通知功能,但使用命令的方式如果Redis重启了将会被还原。
notify-keyspace-events可以是以下任意组合
字符 | 发送的通知 |
---|---|
K | 键空间通知,所有通知以 __keyspace@ 为前缀 |
E | 键事件通知,所有通知以 __keyevent@ 为前缀 |
g | del、expire、rename 等类型无关的通用命令的通知 |
$ | string命令的通知 |
l | list命令的通知 |
s | set命令的通知 |
h | hash命令的通知 |
z | zset命令的通知 |
x | 过期事件:每当有过期键被删除时发送 |
e | 驱逐(evict)事件:每当有键因为 maxmemory 政策而被删除时发送 |
A | 参数 g$lshzxe 的别名 |
注:参数至少要有一个k或者E,否则不会有任何通知,将参数设为AKE表示所有类型的通知
所有命令只有在key真的被改动之后,才会产生通知,比如del key,如果这个key不存在那么就不会产生通知。
可以先临时更改notify-keyspace-events的选项
127.0.0.1:6379> config set notify-keyspace-events Ex
然后开始订阅
127.0.0.1:6379> psubscribe '__key*__:*'
psubscribe说明请参考psubscribe命令详解
回车之后我们可以看到如下东西
127.0.0.1:6379> psubscribe '__key*__:*'
Reading messages... (press Ctrl-C to quit) #按ctrl+c会退出redis-cli.exe
1) "psubscribe" #返回值的类型,显示订阅成功
2) "__key*__:*" #订阅的模式
3) (integer) 1 #目前已订阅成功的数量
然后我们再开一个客户端然后设置一个key
127.0.0.1:6379> set ab a
这边我们就会收到这样的内容
1) "pmessage" #返回值的类型
2) "__key*__:*" #订阅的模式
3) "__keyevent@0__:set" #订阅的通知类型
4) "ab" #key名
如果是Hash、list、set和zset的话会增加一个key空间通知
1) "pmessage" #返回值的类型
2) "__key*__:*" #订阅的模式
3) "__keyspace@0__:key" #键空间通知+key名
4) "hset" #通知类型
5) "pmessage" #返回值的类型
6) "__key*__:*" #订阅的模式
7) "__keyevent@0__:hset" #键事件通知+几库+通知类型
8) "key" #key名
如此可以得出,键空间通知是指针对hash、list、set和zset的时候才会产生,而针对String不会产生,所以想要订阅hash、list、set和zset的时候,配置一定要加上K选项。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
spring:
redis:
host: localhost #主机
port: 6379 #端口号
password: #密码
jedis:
pool:
max-active: 8
max-wait: -1
max-idle: 500
min-idle: 0
lettuce:
shutdown-timeout: 0
下面的topic是订阅set通知,如果还想要订阅其他的请再写一个类,并修改订阅的通知类型
import lombok.Data;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.data.redis.listener.PatternTopic;
import org.springframework.stereotype.Component;
@Component
@Data
public class RedisUpdateAndAddListener implements MessageListener {
//监听的主题
private final PatternTopic topic = new PatternTopic("__keyevent@*__:set");
@Override
public void onMessage(Message message, byte[] pattern){
String topic = new String(pattern);
String msg = new String(message.getBody());
System.out.println("收到key更新或修改,消息主题是:"+ topic+",消息内容是:"+msg);
}
}
@Autowired
private RedisUpdateAndAddListener redisUpdateAndAddListener;
@Bean
RedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory connectionFactory) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
//监听所有的key的set事件
container.addMessageListener(redisUpdateAndAddListener, redisUpdateAndAddListener.getTopic());
return container;
}
到此则已经完成了整合SpringBoot。