redis集群的key事件通知不像普通的订阅发布消息,普通的订阅发布,在任何一个节点订阅通道,都可以收到消息,但是集群的key事件通知只在key所在的主从节点发出通知,只能通过订阅这个key所在的主从节点收到消息;
实验:
构建一个redis集群:
由6个redis服务端构成的redis三主三从集群,9001主9005从,9002主9006从,9003主9004从;
然后,分别用6个客户端以集群模式连接9001至9006,并分别使用 PSUBSCRIBE * 批量订阅所有通道:
然后再用一个客户端以集群模式连接reids集群,发布一个消息:PUBLISH A helloworld,其他6个客户端都可以收到消息:
然后设置集群的key事件,(可以使用./redis-cli -a 密码 --cluster call 192.168.1.66:9001 config set notify-keyspace-events "KE\$"直接给集群所有服务端设置)
使用客户端设置一个string类型的键值,例如:set a a
可以看到分配到9003上了,从是9004,也只有这两个集群节点有收到事件通知:
再用客户端设置一个:set b b
b是保存在9001上,从是9005:
客户端设置一个:set c c
c保存在9002上:
没有很好的解决方法,只能看使用的redis连接工具框架支持到什么程度了,之前用的jedis也没有优化这方面,Lettuce倒是优化了,记得可以使用StatefulRedisClusterPubSubConnection类的setNodeMessagePropagation(true)方法传递,python的redis库好像也没有优化;
框架不支持这种消息传递的,只能通过集群获得每个节点,然后每个节点都订阅一下keyspace事件,然后收到消息肯定是主从都会收到,需要根据需求,根据节点的类型是主节点还是从节点进行选择处理那些节点的消息;