Redis/订阅发布/Pipeline

订阅发布:
SUBSCRIBE channel [channel ...]:订阅给定的一个或多个频道的信息,接收到的信息分别对应消息类型,频道,消息。先订阅才能接收到消息,无法收到未订阅前发出的消息,这点和MQ的Topic一样。
PUBLISH channel message:发布消息。

Redis/订阅发布/Pipeline_第1张图片

Redis/订阅发布/Pipeline_第2张图片
Redis/订阅发布/Pipeline_第3张图片

PSUBSCRIBE pattern [pattern ...]:订阅一个或多个符合给定模式的频道。


Redis/订阅发布/Pipeline_第4张图片
Redis/订阅发布/Pipeline_第5张图片

PUBSUB channels [pattern] :返回当前服务器被订阅的所有频道。
PUBSUB numsub [channel-1 channel-2 ...channel-n]:接受任意多个频道作为输入参数,返回这些频道的订阅者数量。

Pipeline:

Redis/订阅发布/Pipeline_第6张图片

除了可以利用mget,mset 之类的单条命令处理多个key之外,我们还可以利用pipeline的方式从client打包多条命令一起发出,而redis服务端会处理完多条命令后会将多条命令的处理结果打包到一起返回给客户端。

没有使用Pipeline通信过程 使用Pipeline通信过程
Redis/订阅发布/Pipeline_第7张图片
Redis/订阅发布/Pipeline_第8张图片

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

Redis/订阅发布/Pipeline_第9张图片

使用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

要点:
订阅发布:先订阅才能接收到消息,无法收到未订阅前发出的消息,这点和MQ的Topic一样。
Pipline:1次网络,n次命令。Pipeline中的子命令是非原子性的。


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

你可能感兴趣的:(Redis/订阅发布/Pipeline)