发表于: 2018-06-10 20:34:09
1 812
今日完成
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中各个序列化类的区别。
评论