发表于: 2018-06-10 20:34:09

1 809


今日完成

1、了解在spring中使用Redis的pub/Sub,即订阅与发布。“订阅者(如客户端)以事件订阅的方式表达出它有兴趣接收的一个事件或一类事件;发布者(如服务器)可将订阅者感兴趣的事件随时通知相关订阅者。”两边都是Redis客户端,发布者将消息发布到频道之中,订阅者订阅了这个频道则会接收到相同的消息。个人理解是发布者将消息发布到Redis缓存之中,订阅者订阅的时候会给服务端一个信号,然后服务器将存储在缓存中的信息发过去。应用于消息推送、及时聊天?

Redis配置文件

<!--消息的订阅与发布-->
<!--序列化方式-->
<bean id="redisSerializer" class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/>
<!--注册消息监听器适配器,MessageListenerAdapter会把接收到的消息做一个类型转换,然后利用反射把它交给真正的目标处理器-->
<!--所以在定义的时候需要指定这个类-->
<!--调用此类处理消息的时候,如果没有通过defaultListenerMethod指定方法,则会默认调用handleMessage方法-->
<bean id="messageListener" class="org.springframework.data.redis.listener.adapter.MessageListenerAdapter"
     p:delegate-ref="messageDelegateListenerImpl" p:serializer-ref="redisSerializer"/>
<redis:listener-container>
   <redis:listener ref="messageDelegateListenerImpl" serializer="redisSerializer" method="handleMessage" topic="cctv"/>
</redis:listener-container>
<!--订阅者-->
<!--注册监听器-->
<bean id="redisMessageListenerContainer" class="org.springframework.data.redis.listener.RedisMessageListenerContainer">
   <property name="connectionFactory" ref="connectionFactory"/>
   <property name="messageListeners">
       <map>
           <entry key-ref="messageListener">
               <bean class="org.springframework.data.redis.listener.ChannelTopic" c:_0-ref="cctv"/>
           </entry>
       </map>
   </property>
</bean>

需要两个类分别用于发布消息和订阅消息

订阅者,如果方法名字不是handleMessage,则需在MessageListenerAdapter中指定defaultListenerMethod属性。

@Component
public class MessageDelegateListenerImpl implements MessageDelegateListener {
private Logger logger = Logger.getLogger(MessageDelegateListener.class);
   @Override
   public void handleMessage(Serializable message) {
if(null == message){
logger.info("null message!");
       } else {
logger.info(message);
       }
}
}

发布者

@Component
public class RedisDaoImpl implements RedisDao {
@Autowired
   private RedisTemplate redisTemplate;
   @Override
   public void sendMessage(String channel, Serializable message) {
redisTemplate.convertAndSend(channel, message);
   }
}

还没有测试是否有用。还不太理解如何在web项目中使用Redis的发布与订阅怎么去使用。

2、学习org.springframework.data.redis.serializer中三种序列化类型的区别。

(1)JdkSerializationRedisSerializer。使用JdkSerializationRedisSerializer序列化的时候,被序列化的对象必须实现Serialazable接口,不然会报错。并且在Redis中存储的时候除了存有属性之外还有其他的东西,总长度长,大概是json数据的5倍,会消耗很多Redis的内存,不容易阅读,如下图。优点是反序列化的时候不需要类的信息。

(2)JacksonJsonRedisSerializer。它不仅可以将对象序列化,而且可以在Redis中保存对应json对象,容易看懂,并且存储的数据量小,速度快。使用的时候不需要对象实现Serialazable接口,但是需要配合Jackson来使用,并且反序列化的时候需要提供类的信息,即.class文件(使用GenericJackson2JsonRedisSerializer会自动存储类的全限定名)。

(3)StringRedisSerializer,序列化一般的字符串数据的时候,可以用此类。

所以最好将序列化的类分为两种,所有的key使用StringRedisSerializer;所有的value使用GenericJackson2Json-RedisSerializer。RedisTemplate配置如下

<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
   <property name="connectionFactory" ref="connectionFactory" />
   <property name="keySerializer">
       <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
   </property>
   <property name="valueSerializer">
       <bean class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer"/>
   </property>

(4)在Redis中存储的值

明天计划

学习Redis消息的订阅与发布。

遇到的问题

收获

了解了Redis消息的订阅与发布;

学习Redis中各个序列化类的区别。


返回列表 返回列表
评论

    分享到