Redis/订阅发布/Pipeline

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

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



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

Pipeline:


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

没有使用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();
            }
        }
    }
}

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


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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,168评论 19 139
  • redis-订阅与发布 Redis 通过 PUBLISH 、 SUBSCRIBE 等命令实现了订阅与发布模式, 这...
    全能程序猿阅读 5,869评论 0 4
  • 摘自http://xiaoh.me/2016/06/30/redis-advanced/ 排序 redis支持对l...
    鸵鸟要抬头阅读 66,587评论 1 3
  • 来源 RabbitMQ是用Erlang实现的一个高并发高可靠AMQP消息队列服务器。支持消息的持久化、事务、拥塞控...
    jiangmo阅读 10,426评论 2 34
  • 下载java 到java官网下载jdk 这里要记住区分64或者32位 网站自动下载的不知道什么原因我的就没下载正确...
    _士心_阅读 259评论 0 0