Redis/訂閱發(fā)布/Pipeline

訂閱發(fā)布:
SUBSCRIBE channel [channel ...]:訂閱給定的一個或多個頻道的信息,接收到的信息分別對應(yīng)消息類型,頻道,消息。先訂閱才能接收到消息,無法收到未訂閱前發(fā)出的消息,這點和MQ的Topic一樣。
PUBLISH channel message:發(fā)布消息。

PSUBSCRIBE pattern [pattern ...]:訂閱一個或多個符合給定模式的頻道。



PUBSUB channels [pattern] :返回當(dāng)前服務(wù)器被訂閱的所有頻道。
PUBSUB numsub [channel-1 channel-2 ...channel-n]:接受任意多個頻道作為輸入?yún)?shù),返回這些頻道的訂閱者數(shù)量。

Pipeline:


除了可以利用mget,mset 之類的單條命令處理多個key之外,我們還可以利用pipeline的方式從client打包多條命令一起發(fā)出,而redis服務(wù)端會處理完多條命令后會將多條命令的處理結(jié)果打包到一起返回給客戶端。

沒有使用Pipeline通信過程 使用Pipeline通信過程

注意:Pipeline中的子命令是非原子性的


使用Jedis的例子:

package com.jd.redis.client;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Pipeline;
public class PipelineTest {
    publicstaticvoid main(String[] args) {     
        int count = 1000;

        long start = System.currentTimeMillis();
        withoutPipeline(count);
        long end = System.currentTimeMillis();
        System.out.println("withoutPipeline: " + (end-start));

        start = System.currentTimeMillis();
        usePipeline(count);
        end = System.currentTimeMillis();
        System.out.println("usePipeline: " + (end-start));
    }

    private static void withoutPipeline(int count){
        Jedis jr = null;
        try {
            jr = new Jedis("10.10.224.44", 6379);
            for(int i =0; i<count; i++){
                jr.incr("testKey1");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        finally{
            if(jr!=null){
                jr.disconnect();
            }
        }
    }

    private static void usePipeline(int count){
        Jedis jr = null;
        try {
            jr = new Jedis("10.10.224.44", 6379);
            Pipeline pl = jr.pipelined();
            for(int i =0; i<count; i++){
                 pl.incr("testKey2");
            }
            pl.sync();
        } catch (Exception e) {
            e.printStackTrace();
        }
        finally{
            if(jr!=null){
                jr.disconnect();
            }
        }
    }
}

要點:
訂閱發(fā)布:先訂閱才能接收到消息,無法收到未訂閱前發(fā)出的消息,這點和MQ的Topic一樣。
Pipline:1次網(wǎng)絡(luò),n次命令。Pipeline中的子命令是非原子性的。


參考:http://www.cnblogs.com/happyday56/p/4142761.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,993評論 19 139
  • redis-訂閱與發(fā)布 Redis 通過 PUBLISH 、 SUBSCRIBE 等命令實現(xiàn)了訂閱與發(fā)布模式, 這...
    全能程序猿閱讀 5,864評論 0 4
  • 摘自http://xiaoh.me/2016/06/30/redis-advanced/ 排序 redis支持對l...
    鴕鳥要抬頭閱讀 66,566評論 1 3
  • 來源 RabbitMQ是用Erlang實現(xiàn)的一個高并發(fā)高可靠AMQP消息隊列服務(wù)器。支持消息的持久化、事務(wù)、擁塞控...
    jiangmo閱讀 10,409評論 2 34
  • 下載java 到j(luò)ava官網(wǎng)下載jdk 這里要記住區(qū)分64或者32位 網(wǎng)站自動下載的不知道什么原因我的就沒下載正確...
    _士心_閱讀 257評論 0 0