• Redis消息队列


            一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式。利用redis这两种场景的消息队列都能够实现。

    生产者消费者模式:生产者生产消息放到队列里,多个消费者同时监听队列,谁先抢到消息谁就会从队列中取走消息;即对于每个消息只能被最多一个消费者拥有;

    发布者订阅者模式:发布者生产消息放到队列里,多个监听队列的消费者都会收到同一份消息;即正常情况下每个消费者收到的消息应该都是一样的;

    对应的使用场景包括:A系统向队列中存放数据;B系统在队列中取数据;

    1、redis队列模式:可以实现B系统不在线状态下,A系统向队列中存数据,当B系统上线后,可以手动去取队列中的数据;

    2、redis订阅模式:可以实现A系统向队列中存数据,当B系统订阅了此队列并且在线时,可以自动监听此队列去取数据,但之前不在线时的数据无法获取;

    一、Producer/Consumer Mode

          该方法是借助redis的list结构实现的。Producer调用redis的lpush往特定key里塞入消息,Consumer调用brpop去不断监听该key。

    Producer:

    1 // producer code
    2 String key = "demo:mq:test";
    3 String msg = "hello world";
    4 redisDao.lpush(key, msg);

    Consumer:

    1 // consumer code
    2 String key = "demo:mq:test";
    3 while (true) {
    4 // block invoke
    5 List<String> msgs = redisDao.brpop(BLOCK_TIMEOUT, listKey);
    6 if (msgs == null) continue;
    7 String jobMsg = msgs.get(1);
    8 processMsg(jobMsg);
    9 }

    当有多个consumers的时候,它会按照brpop调用的顺序分派消息,并非随机。BLOCK_TIMEOUT不建议设成infinity(有些redis驱动也直接不支持inifinity),我们目前设成30(单位是秒)情况良好。

    二、Pub/Sub Mode

     Redis 从 2.0.0 版本开始支持 pub/sub 指令。详情参见:http://redis.io/topics/pubsub

     实现思想:Publisher调用redis的publish方法往特定的channel发送消息,Subscriber在初始化的时候要subscribe到该channel,一旦有消息就会立即接收。

     比较简单的demo可参见:http://shift-alt-ctrl.iteye.com/blog/1867454

    1、Redis消息的发布与订阅

         Redis的Subscribe命令可以让客户端订阅任意数量的频道,每当有新信息发送到被订阅的频道时, 信息就会被发送给所有订阅指定频道的客户端。作为例子,下图展示了频道channe11, 以及订阅这个频道的三个客户端:client2、client5和client1之间的关系:

        当有新消息通过 Publish命令发送给频道channe11时, 这个消息就会被发送给订阅它的三个客户端:

    订阅bar频道。格式:Subscribe name1 name2

    成功订阅回复,分别对应订阅类型、订阅频道、订阅数量。

    127.0.0.1:6379> SUBSCRIBE bar
    Reading messages... (press Ctrl-C to quit)
    1) "subscribe"
    2) "bar"
    3) (integer) 1

    重新启一发布者client,发送消息。格式:publish channelName Message

    #对有一个订阅者的频道发送信息
    127.0.0.1:6379> publish bar val (integer) 1
    #对没有订阅者的频道发送信息
    127.0.0.1:6379> publish bar "can any body hear me?"
    (integer) 0

    订阅client回复,分别对应消息类型,频道,消息。

    1) "message"
    2) "bar"
    3) "val"

     详情请参见:http://www.cnblogs.com/mushroom/p/4470006.html

                        http://redis.readthedocs.org/en/2.4/pub_sub.html

     2、键空间通知(Keyspace notifications)

       在订阅频道之前,设置set notify-keyspace-events KEA参数,然后再运行Subscribe name1 name2订阅频道。

       此时,当有某一指定键更新时会发送消息给订阅者

      请参见:http://redis.io/topics/notifications

                    http://blog.csdn.net/chaijunkun/article/details/27361453

  • 相关阅读:
    [原]openstack-kilo--issue(十一)Failed connect to 169.254.169.254:80; No route to host
    [转]pycharm active code
    [原]openstack-kilo--issue(九) heat stacks topology中图形无法正常显示
    [原]CentOS 7 网卡子接口的创建
    [转]Shell中read的常用方式
    [转]输出带颜色的shell
    第十七节:从状态机的角度async和await的实现原理(新)
    第十六节:时隔两年再谈异步及深度剖析async和await(新)
    第十一节:SQLServer事务写法、各种锁、事务隔离级别
    第十七节:SQL中的一些常用SQL积累(持续更新)
  • 原文地址:https://www.cnblogs.com/moonandstar08/p/5125752.html
Copyright © 2020-2023  润新知