观察者模式
这种创建一个消息中心, 所有消息发布者发布消息到中心, 中心把消息通知到各订阅者的设计模式在GUI程序的事件模型中使用比较多。
而放在WEB应用中,主要用来解决流程计时, 以及代替轻量级的实时队列的功能(如计数的逻辑的异步)。
Channel
频道, 每一个订阅者可根据频道选择自己喜欢的信息,一个订阅者可能对多个频道有兴趣。 但一个消息发布者不宜把消息发布到多个频道中, 至于说为什么不宜发布到多个频道中, 我这暂时很难拿出一个合理的数学证明。 不过有个很简单的逻辑, 如果一个订阅者订阅了多个频道, 一个消息又发到了多个频道, 那么一个订阅者就可会收到重复的消息,即使消息中心应该处理这个重复的消息, 但明显处理逻辑增加了,遍历订阅者的次数也增加了。 具体分析依赖于实现。
=== Keyspace Notifications
其官网这样描述
Keyspace notifications allows clients to subscribe to Pub/Sub channels in order to receive events affecting the Redis data set in some way.
Examples of the events that is possible to receive are the following:
All the commands affecting a given key.
All the keys receiving an LPUSH operation.
All the keys expiring in the database 0.
Events are delivered using the normal Pub/Sub layer of Redis, so clients implementing Pub/Sub are able to use this feature without modifications.
Redis 是一个键值对的系统, 其数据变化会产生事件, 具体内容可参考 http://redis.io/topics/notifications
这里我想用来做流程计时, 所以关心的是 EXPIRE 事件。 Keyspace notifications
消耗CPU,默认是关闭的,所以需要在配置文件中声明, 下面是可控粒度。
K Keyspace events, published with keyspace@<db> prefix.
E Keyevent events, published with keyevent@<db> prefix.
g Generic commands (non-type specific) like DEL, EXPIRE, RENAME, ...
$ String commands
l List commands
s Set commands
h Hash commands
z Sorted set commands
x Expired events (events generated every time a key expires)
e Evicted events (events generated when a key is evicted for maxmemory)
A Alias for g$lshzxe, so that the "AKE" string means all the events.
Spring Data Redis
其配置可参考 http://docs.spring.io/spring-data/redis/docs/1.7.1.RELEASE/reference/html/#redis:pubsub:subscribe 没什么可说的, 但需要注意的是, 需要使用org.springframework.data.redis.listener.PatternTopic
来使得订阅者订阅多个频道。
其它
这里实现的观察者模式比较简单, 但事实上,我们也暂时不用去考虑观察者的冲突,时效,处理时间与堆积,处理优先的问题。
网友评论