redis常用技术--发布订阅

        发布订阅模式首先需要消息源,也就是要有消息发布出来,然后订阅者就可以收到这个消息进行处理了,观察者模式就是这个模式的典型应用了。如下图记账系统就是消息源,短信,邮件,微信模块就是订阅者了.
在这里插入图片描述
redis发布订阅的使用
1)订阅者订阅消息
2)发布者发布消息
3)订阅者获取消息
如下图:
在这里插入图片描述
在Java中的使用
1)消息监听类(订阅者)

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.data.redis.core.RedisTemplate;

public class RedisMessageListener implements MessageListener {
    @Autowired
    private RedisTemplate redisTemplate;

    @Override
    public void onMessage(Message message, byte[] bytes) {
        //获取消息
        byte[] body = message.getBody();
        //使用值序列化器转换
        String msgBody = (String) redisTemplate.getValueSerializer().deserialize(body);
        System.out.println(msgBody);
        //获取channel
        byte[] channel = message.getChannel();
        //使用字符串序列化器转换
        String channelStr = (String) redisTemplate.getStringSerializer().deserialize(channel);
        System.out.println(channelStr);
        //渠道名称转换
        String byteStr = new String(bytes);
        System.out.println(byteStr);
    }
}

2)xml文件配置

<bean id="redisMessageListener" class="com.musi.listener.RedisMessageListener"/>
    <bean id="topicContainer" class="org.springframework.data.redis.listener.RedisMessageListenerContainer" destroy-method="destroy">
        <!--Redis连接工厂-->
        <property name="connectionFactory" ref="connectionFactory"/>
        <!--连接池,这里只要线程池生存,才能继续监听-->
        <property name="taskExecutor">
            <bean class="org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler">
                <property name="poolSize" value="3"></property>
            </bean>
        </property>

        <!--消息监听Map-->
        <property name="messageListeners">
            <map>
                <!--配置监听者,key-ref和bean id定义一致-->
                <entry key-ref="redisMessageListener">
                    <bean class="org.springframework.data.redis.listener.ChannelTopic">
                        <constructor-arg value="chat"/>
                    </bean>
                </entry>
            </map>
        </property>
    </bean>

3)发布消息

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("application.xml");
RedisTemplate redisTemplate = applicationContext.getBean(RedisTemplate.class);
String channel = "chat";
redisTemplate.convertAndSend(channel,"I am lazy");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值