求推荐好的网站建设平台,优秀的营销案例ppt,为什么做的网站搜不出来的,wordpress命令安装目录结构一、发布和订阅机制 当一个客户端通过 PUBLISH 命令向订阅者发送信息的时候#xff0c;我们称这个客户端为发布者(publisher)。 而当一个客户端使用 SUBSCRIBE 或者 PSUBSCRIBE 命令接收信息的时候#xff0c;我们称这个客户端为订阅者(subscriber)。 为了解耦发布者(publish…一、发布和订阅机制 当一个客户端通过 PUBLISH 命令向订阅者发送信息的时候我们称这个客户端为发布者(publisher)。 而当一个客户端使用 SUBSCRIBE 或者 PSUBSCRIBE 命令接收信息的时候我们称这个客户端为订阅者(subscriber)。 为了解耦发布者(publisher)和订阅者(subscriber)之间的关系Redis 使用了 channel (频道)作为两者的中介 —— 发布者将信息直接发布给 channel 而 channel 负责将信息发送给适当的订阅者发布者和订阅者之间没有相互关系也不知道对方的存在 注意Redis的Pub Sub功能或许是暂时不支持持久化意思就是消息在管道中是即发即失的Subscriber端一收到消息消息即从管道中删除。所以如果是对消息的准确性要求比较高或者是有持久化的需求Redis就不是那么合适了期待以后的版本加入持久化功能。 二、Pub/Sub的作用 其实从Pub/Sub的机制来看它更像是一个广播系统多个Subscriber可以订阅多个Channel多个Publisher可以往多个Channel中发布消息。可以这么简单的理解 Subscriber收音机只不过这个收音机可以收到多个频道并以队列方式显示 Publisher电台电台可以往不同的FM频道中发消息 Channel不同频率的FM频道 所以根据这个理解那么我觉得有几种用法是比较可取的 1.一个Publisher多个Subscriber 如下图所示可以作为消息队列或者消息管道。 主要应用通知、公告。 2.多个Publisher一个Subscriber 可以将PubSub做成独立的HTTP接口各应用程序作为Publisher向Channel中发送消息Subscriber端收到消息后执行相应的业务逻辑比如写数据库显示等等。 主要应用排行榜、投票、计数。 3多个Publisher多个Subscriber 图就不上了故名思议就是可以向不同的Channel中发送消息由不同的Subscriber接收。 主要应用群聊、聊天。 可参考Spring data redis主页的开源项目retwisj。 Github地址https://github.com/spring-projects/spring-data-keyvalue-examples/tree/master/retwisj 从上述几种用法来看根据不同的限制条件限制Publisher、Subscriber和Channel的数量可以实现不同的功能其实完全可以把Pub/Sub理解为Socket编程用Socket也可以实现上述功能但是Redis提供了相应的封装和底层实现不管是安全性、健壮性的等各方面都有不错的表现以及未来的一些拓展个人觉得Redis是个不错的选择。 三、Demo演示 因为我的上一篇博客Spring Data Redis简介以及项目DemoRedisTemplate和 Serializer详解已经演示了Spring Data Redis的基本配置和使用所以这里就只贴上Pub/Sub的重要代码读者可以阅读上篇博客或者下载源码。 Pub/Sub配置(XMl) 1 !-- SDR Pub/Sub配置 --2 !-- SubServiceImpl是实现了MessageListener接口的类MessageListener接口中定义了onMessage方法也就是接收消息的方法每当Channel中有消息onMessage方法会被自动调用 --3 bean idmessageListener classcom.chr.service.impl.SubServiceImpl4 /bean5 6 !-- 可以有多个messageListener每个messageListener必须注册到RedisMessageListenerContainer中读者可参阅API文档 --7 bean idmessageContainer8 classorg.springframework.data.redis.listener.RedisMessageListenerContainer9 destroy-methoddestroy
10 property nameconnectionFactory refconnectionFactory /
11 !--property nametaskExecutor bean classorg.springframework.scheduling.concurrent.ThreadPoolTaskScheduler
12 property namepoolSize value3/property /bean /property
13 此处可以定义Executor参阅java.util.concurrent.Executor--
14 property namemessageListeners
15 map
16 entry key-refmessageListener
17 ref beanchannelTopic /
18 /entry
19 /map
20 /property
21 /bean
22
23 !-- Channel设置 --
24 bean idchannelTopic classorg.springframework.data.redis.listener.ChannelTopic
25 constructor-arg valueuser:topic /
26 /bean 在代码中可以看到subServiceImpl实现类被手动注册到配置文件中这样可能会使代码混乱并且会带来一些问题比如需要使用注解自动注入rankService但是因为Spring配置中XML的优先级大于Annotation所以subServiceImpl中的rankService不能被Autowired。 那么解决办法有两种 1.在配置文件中messageLisener bean前加入 !-- 类扫描器 --context:component-scan base-packagecom.songod.service / 这样Spring会先扫描Annotation创建rankService bean之后再注入messageLisener。 2.在messageContainer bean中只注入connectionFactory不注入messageLisener和channelTopic。 之后在Controller中手动注入调用addMessageListener(MessageListener listener, Topic topic)方法手动注入但是注意只能注入一次可以设置Flag判断。 PubServiceImpl 1 Service2 public class PubServiceImpl implements PubService {3 Resource(namestringRedisTemplate)4 private StringRedisTemplate stringRedisTemplate;5 6 private String channelTopic user:topic;7 8 /*发布消息到Channel*/9 public void Publisher(String message) {
10 stringRedisTemplate.convertAndSend(channelTopic, message);
11 }
12 } 我这里用的是StringRedisTemplate,读者可以使用RedisTemplate设置其它序列化方式可以看我的上一篇博客。 SubServiceImpl public class SubServiceImpl implements SubService {Autowiredprivate ChannelTopic channelTopic;private MessageList messageList new MessageList();public void onMessage(Message message, byte[] pattern) {System.out.println(message.toString() channelTopic.getTopic());messageList.add(message.toString());}public MessageList getMessageList() {return messageList;}
} 主要是onMessage方法,可以在此方法中将message传入其它业务逻辑中进行处理。 四、Demo运行 Publish: Subscrib 五、项目源码 redis-web-pubsub http://www.cnblogs.com/edwinchen/p/3836239.html