91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Redis必知必會——發布訂閱

發布時間:2020-06-30 11:26:20 來源:網絡 閱讀:452 作者:Java_老男孩 欄目:編程語言

銀行卡消費的時候,銀行往往會通過微信、短信或郵件通知用戶交易的詳細信息,這便是發布訂閱模式。
Redis必知必會——發布訂閱
我們可以使用下面的命令進行模擬

先打開一個客戶端1,輸入命令

SUBSCRIBE chat

表示客戶端1訂閱一個名為chat的渠道,之后打開客戶端2,輸入命令

publish chat "Hello World!"

Redis必知必會——發布訂閱
在Spring中,我們自定義接收消息的類,需要實現MessageListener接口,并實現接口定義的方法onMessage,代碼如下。

public class RedisMessageListener implements MessageListener {

    @SuppressWarnings("rawtypes")
    private RedisTemplate rt;

    @SuppressWarnings("rawtypes")
    public RedisTemplate getRt() {
        return rt;
    }

    @SuppressWarnings("rawtypes")
    public void setRt(RedisTemplate rt) {
        this.rt = rt;
    }

    @Override
    public void onMessage(Message message, byte[] pattern) {
        // 獲取消息
        byte[] body = message.getBody();
        // 使用值序列化器轉換
        String msgBody = (String)getRt().getValueSerializer().deserialize(body);
        System.out.println(msgBody);
        // 獲取channel
        byte[] channel = message.getChannel();
        // 使用字符串序列化器轉換
        String channelStr = (String)getRt().getStringSerializer().deserialize(channel);
        System.out.println(channelStr);
        // 渠道名稱轉換
        String bytesStr = new String(pattern);
        System.out.println(bytesStr);
    }

}

這里我們沒有使用注解,所以要去spring.xml中注冊bean

<!-- 實例化類 -->
<bean id="redisMsgListener" class="com.codeliu.transaction.RedisMessageListener">
    <property name="rt" ref="redisTemplate"></property>
</bean>

實例化監聽類之后還不行,還得給一個監聽容器,在Spring中對應的類為RedisMessageListenerContainer,它可以用來監聽Redis的發布訂閱消息。同樣在Spring.xml中進行配置

<!-- 配置監聽容器 -->
<bean id="topicContainer" class="org.springframework.data.redis.listener.RedisMessageListenerContainer" destroy-method="destroy">
    <!-- redis連接工廠 -->
    <property name="connectionFactory" ref="connectionFactory"></property>      
    <!-- 連接池,只有線程池生存,才能繼續監聽 -->
    <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="redisMsgListener">
                <!-- 監聽類 -->
                <bean class="org.springframework.data.redis.listener.ChannelTopic">
                    <constructor-arg value="chat"></constructor-arg>
                </bean>
            </entry>
        </map>
    </property>
</bean>

這里配置了線程池,這個線程池將會持續的生存以等待消息傳入,而這里配置了容器用id為redisMsgListener的Bean進行渠道chat的監聽。當消息通過渠道chat方法的時候,就會使用id為redisMsgListener的Bean處理消息。

下面進行測試

public static void main(String[] args) {
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
    RedisTemplate rt = applicationContext.getBean(RedisTemplate.class);
    String channel = "chat";
    // 向渠道chat發送消息
    rt.convertAndSend(channel, "Hello World!");
}

convertAndSend方法就是向指定的渠道發送消息。

輸出

Hello World!
chat
chat

本文的重點是你有沒有收獲與成長,其余的都不重要,希望讀者們能謹記這一點。同時我經過多年的收藏目前也算收集到了一套完整的學習資料,包括但不限于:分布式架構、高可擴展、高性能、高并發、Jvm性能調優、Spring,MyBatis,Nginx源碼分析,Redis,ActiveMQ、、Mycat、Netty、Kafka、Mysql、Zookeeper、Tomcat、Docker、Dubbo、Nginx等多個知識點高級進階干貨,希望對想成為架構師的朋友有一定的參考和幫助

需要更詳細架構師技能思維導圖和以下資料的可以加一下技術交流分享群:“708 701 457”免費獲取

Redis必知必會——發布訂閱
Redis必知必會——發布訂閱

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

金山区| 泾阳县| 龙岩市| 拉萨市| 南郑县| 新泰市| 承德县| 甘肃省| 思南县| 石家庄市| 桂阳县| 沁水县| 宜章县| 石屏县| 沁源县| 白山市| 沁阳市| 眉山市| 茂名市| 炎陵县| 南乐县| 石台县| 高淳县| 昆山市| 镇宁| 裕民县| 临沧市| 沂水县| 五台县| 都兰县| 长垣县| 武定县| 绍兴市| 井研县| 微博| 安庆市| 怀安县| 荆州市| 南部县| 滦平县| 通辽市|