精华内容
下载资源
问答
  • redis发布订阅模式

    2021-03-06 19:49:34
    一 前言虽然有消息队列,我们还是要了解一下redis发布订阅模式哟!!!!!二发布订阅模式PUBLISH 命令向通道发送信息,此客户端称为publisher 发布者;SUBSCRIBE 向命令通道订阅信息,此客户端称为subscriber 订阅...

    一 前言

    虽然有消息队列,我们还是要了解一下redis发布订阅模式哟!!!!!

    二发布订阅模式

    651969fa2abdbeccf20e994f3bba29a0.pngPUBLISH 命令向通道发送信息,此客户端称为publisher 发布者;

    SUBSCRIBE 向命令通道订阅信息,此客户端称为subscriber 订阅者;

    redis 中 发布订阅模块的名字叫着 PubSub,也就是 PublisherSubscriber;

    一个发布者向一个通道发送消息,订阅者可以向多个通道订阅消息;当发布者向通道发布消息后,如果有订阅者订阅该通道,订阅者就会收到消息;这有点像电台,我收听了一个电台的频道,当频道发送消息后,我就能收到消息;

    三PUBSub模块命令subscribe: 订阅一个或者多个频道;

    unsubscribe: 退订一个或者多个频道;

    publish: 向通道发送消息;

    psubscribe: 订阅给定模式相匹配的所有频道;

    punsubscribe: 退订 给定模式所有的频道,若未指定模式,退订所有频道;

    具体的命令使用方式 可以使用 help 命令 ;示例如下:

    help subscribe

    四客户端实现

    通过指令SUBSCRIBE订阅一个频道,如果频道不存在时则新建一个频道;此时此客户端就是订阅者127.0.0.1:6379> subscribe zszxz

    Reading messages... (press Ctrl-C to quit)

    1) "subscribe"

    2) "zszxz"

    3) (integer) 1

    通过指令publish向通道发送一个消息;此时客户端就是发布者127.0.0.1:6379> publish zszxz "l miss you"

    (integer) 1

    127.0.0.1:6379>

    我们再看看 客户端就收到消息了127.0.0.1:6379> subscribe zszxz

    Reading messages... (press Ctrl-C to quit)

    1) "subscribe"

    2) "zszxz"

    3) (integer) 1

    1) "message"

    2) "zszxz"

    3) "l miss you"

    五java 实现

    定义2个订阅者用于订阅频道的消息,在使用jedis 时 需要 继承 JedisPubSub 类, 并重写 onMessage 方法; 订阅者可以在该方法里面进行消息的业务逻辑处理;

    订阅者 1/\*\*

    \* @Author lsc

    \*

    订阅者1号

    \*/

    @Component

    public class Sub1 extends JedisPubSub {

    @Override

    public void onMessage(String channel, String message) {

    System.out.println("sub1 channel is :"+ channel+ " mesage is :"+message);

    }

    }

    订阅者2/\*\*

    \* @Author lsc

    \*

    订阅者2号

    \*/

    @Component

    public class Sub2 extends JedisPubSub {

    @Override

    public void onMessage(String channel, String message) {

    System.out.println("sub2 channel is :"+ channel+ " mesage is :"+message);

    }

    }

    发布者/\*\*

    \* @Author lsc

    \*

    \*/

    @Component

    public class Pub {

    public void publishMessage(Jedis jedis, String channel, String msg) {

    jedis.publish(channel,msg);

    }

    }

    测试类、

    注意redis 的 发布订阅模式 是阻塞模式 ,一个订阅者需要 重新起一个线程;@Autowired

    Pub pub;

    @Autowired

    JedisUtil jedisUtil;

    @Autowired

    Sub1 sub1;

    @Autowired

    Sub1 sub2;

    @Test

    public void test(){

    new Thread(()\-> {

    while (true){

    jedisUtil.getJedis().subscribe(sub1,"zszxz");

    try {

    TimeUnit.SECONDS.sleep(1);

    } catch (InterruptedException e) {

    e.printStackTrace();

    }

    }

    //jedisUtil.getJedis().subscribe(sub2,"zszxz");

    }).start();

    pub.publishMessage(jedisUtil.getJedis(),"zszxz","l miss you");

    }

    六 缺点PubSub 的生产者来一个消息会直接传递给消费者。如果没有消费者,消息会直接丢弃。如果有多个消费者,一个消费者突然挂掉,生产者会继续发送消息,另外的消费者可以持续收到消息。但是挂掉的消费者重新连上后,断连期间的消息会彻底丢失;

    如果 Redis 停机重启,PubSub 的消息是不会持久化

    求关注

    展开全文
  • Redis发布订阅模式

    2021-04-27 14:55:21
    Redis提供了基于“发布/订阅模式的消息机制,在这种模式下,消息发布者和订阅者不进行直接通信,发布者向指定频道(channel)中发布消息,订阅该频道的客户端都可以接收该消息。

    Redis发布订阅模式

    Redis提供了基于“发布/订阅”模式的消息机制,在这种模式下,消息发布者和订阅者不进行直接通信,发布者向指定频道(channel)中发布消息,订阅该频道的客户端都可以接收该消息。

    在这里插入图片描述

    Redis中提供若干命令支持发布订阅功能:

    • 发布消息给指定频道: publish channel message

    • 从一个或多个频道中订阅消息:subscribe channel [channel …]

    • 取消订阅指定的频道:unsubscribe [channel [channel …]]

    • 按照模式订阅频道:psubscribe pattern [pattern …]

    • 按照模式取消订阅频道:punsubscribe [pattern [pattern …]]

    • 查阅订阅的频道:

      查看活跃频道:pubsub channels [pattern]
      查看频道订阅数:pubsub numsub [channel …]
      查看模式订阅数:pubsub numpat

    测试发布订阅:
    客户端在执行订阅命令后进入订阅状态,只能接受subscribe、psubscribe、unsubscribe、punsubscribe四个命令。新开启的订阅客户端无法收到频道之前的消息。
    在这里插入图片描述
    测试查询订阅:
    在这里插入图片描述

    使用场景:聊天室、公告牌、服务之间利用信息解耦等

    展开全文
  • 总结 Redis: 轻量级,低延迟,高...rabbitmq是一个专门的AMQP协议队列,他的优势就在于提供可靠的队列服务,并且可做到异步,而redis主要是用于缓存的,redis发布订阅模块,可用于实现及时性,且可靠性低的功能,

    总结

    Redis: 轻量级,低延迟,高并发,低可靠性,redis是一种基于键值对(key-value)数据库。

    Redis:主要是用于缓存的,Redis的发布订阅模块,可用于实现及时性,且可靠性低的功能。

    Redis主要的特性:读写速度快,键值对的数据结构服务器,丰富的功能,简单稳定,持久化,主从复制,高可用和分布式转移,客户端语言多。可以用于小型项目的消息队列。

    RabbitMQ:重量级,高可靠,异步,不保证实时;
     

    RabbitMQ是一个专门的AMQP协议队列,他的优势就在于提供可靠的队列服务,并且可做到异步,可以用于大型项目的消息队列

                                                                            Redis与RabbitMQ实时性对比

            对比项                        Redis                                RabbitMQ
            持久性Redis的持久化是针对于整个Redis缓存的内容,它有RDB和AOF两种持久化方式,Redis持久化方式,后续更新,可以将整个Redis实例持久化到磁盘,以此来做数据备份,防止异常情况下导致数据丢失。队列,消息都可以选择性持久化,持久化粒度更小,更灵活。
          队列监控Redis没有监控平台RabbitMQ实现了后台监控平台,可以在该平台上看到所有创建的队列的详细情况,良好的后台管理平台可以方面我们更好的使用。
          负载均衡Redis发布订阅模式,一个队列可以被多个消费者同时订阅,当有消息到达时,会将该消息依次发送给每个订阅者。RabbitMQ队列可以被多个消费者同时监控消费,但是每一条消息只能被消费一次,由于RabbitMQ的消费确认机制,因此它能够根据消费者的消费能力而调整它的负载。
          实时性实时性高,Redis作为高效的缓存服务器,所有数据都存在在服务器中,所以它具有更高的实时性。无,因为RabbitMQ会把未接收的消息放入通道中,或者放入交换机中,直到消费者前来消费这条消息。
          可靠性没有相应的机制保证消息的可靠消费,如果发布者发布一条消息,而没有对应的订阅者的话,这条消息将丢失,不会存在内存中。具有消息消费确认机制,如果发布一条消息,还没有消费者消费该队列,那么这条消息将一直存放在队列中,直到有消费者消费了该条消息,以此可以保证消息的可靠消费。

    本文有些内容摘录:

    将redis发布订阅模式用做消息队列和rabbitmq的区别_听砜_51CTO博客

                                                                                                                                                                 特此声明!!!!!!!

    展开全文
  • Java实现Redis发布订阅消息通信模式 环境 阿里云ECS CentOS Linux release 8.1.1911 (Core) Redis server v=6.0.9 java version "12.0.1" 2019-04-16 IntelliJ IDEA 2020.2.3 (Ultimate Edition) 实现代码 Main ...

    Java实现Redis发布订阅消息通信模式

    环境

    阿里云ECS
    CentOS Linux release 8.1.1911 (Core)
    Redis server v=6.0.9
    java version "12.0.1" 2019-04-16
    IntelliJ IDEA 2020.2.3 (Ultimate Edition)
    

    实现代码

    Main

    src/com/demo/redis/Main.java

    其中,<hostname>为Redis数据库主机名(IP地址),本机为127.0.0.1<password>为Redis登录密码,Redis数据库默认端口为6379

    package com.demo.redis;
    
    import redis.clients.jedis.Jedis;
    
    public class Main {
        private static final String HOST_NAME = "<hostname>";
        private static final String PASSWORD = "<password>";
        private static final int PORT = 6379;// default port
    
        public static void main(String[] args) {
            Jedis subscriberJedis = new Jedis(HOST_NAME, PORT);
            subscriberJedis.auth(PASSWORD);
            Jedis publisherJedis = new Jedis(HOST_NAME, PORT);
            publisherJedis.auth(PASSWORD);
    
    
            String channel = "channel";
    
            SubscriberThread subscriberThread = new SubscriberThread(subscriberJedis, channel);
            PublisherThread publisherThread = new PublisherThread(publisherJedis, channel);
    
            subscriberThread.start();
            publisherThread.start();
        }
    }
    
    

    Subscriber

    src/com/demo/redis/Subscriber.java

    package com.demo.redis;
    
    import redis.clients.jedis.JedisPubSub;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    public class Subscriber extends JedisPubSub {
        @Override
        public void onMessage(String channel, String message) {
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            System.out.printf("%s: from channel \"%s\", message: %s\n", simpleDateFormat.format(new Date()), channel, message);
        }
    
        @Override
        public void onSubscribe(String channel, int subscribedChannels) {
            System.out.printf("Subscribe channel %s succeed, subscribed channels %d\n", channel, subscribedChannels);
        }
    
        @Override
        public void onUnsubscribe(String channel, int subscribedChannels) {
            System.out.printf("Unsubscribe %s succeed, subscribedChannels %d\n", channel, subscribedChannels);
        }
    }
    

    PublisherThread

    src/com/demo/redis/PublisherThread.java

    package com.demo.redis;
    
    import redis.clients.jedis.Jedis;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    public class PublisherThread extends Thread {
        private Jedis jedis;
        private String channel;
    
        PublisherThread(Jedis jedis, String channel) {
            this.jedis = jedis;
            this.channel = channel;
        }
    
        @Override
        public void run() {
            try {
                while (true) {
                    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
    
                    jedis.publish(channel, bufferedReader.readLine());
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    

    SubscriberThread

    src/com/demo/redis/SubscriberThread.java

    package com.demo.redis;
    
    import redis.clients.jedis.Jedis;
    
    public class SubscriberThread extends Thread {
    
        private Jedis jedis;
        private String channel;
    
        public SubscriberThread(Jedis jedis, String channel) {
            this.jedis = jedis;
            this.channel = channel;
        }
    
        @Override
        public void run() {
            Subscriber subscriber = new Subscriber();
            jedis.subscribe(subscriber, channel);
        }
    }
    

    测试结果

    最后

    • 由于博主水平有限,不免有疏漏之处,欢迎读者随时批评指正,以免造成不必要的误解!
    展开全文
  • redis 发布订阅模式

    2021-05-26 13:22:29
    开两个客户端,一个客户端接收(消费者),一个客户端发布(生产者) 订阅端: 发布端: 第二个终端输入 publish channel1 hello 同时第一个终端会接到这个消息,发布订阅模式就成功了
  • Redis 中有个 pubsub_channels 字典 ,里面保存了所有频道和订阅的关系。 struct redisServer{ dict *pubsub_channels; }; [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eSWKAEBc-...
  • 发布消息 # -*- coding: utf-8 -*- import redis redis_con = redis.Redis(host='127.0.0.1') redis_con.publish(channel='test', message='hi-1') 订阅消息 # -*- coding: utf-8 -*- import redis redis_con...
  • 前言Redis相信对于各位开发者的朋友来说都不会陌生,特别是后端的朋友会经常性的用到Redis来进行数据缓存等操作,今日我们就来聊聊Redis发布(Pub)与订阅(Sub)模式的在SpringBoot下如何使用,并谈谈相关的应用场景...
  • spring: redis: host: localhost port: 6379 password: root 发布者配置 @Configuration public class PublisherConfig { @Bean public RedisTemplate redisMessageTemplate(RedisConnectionFactory ...
  • 1.输出缓冲机制 redis缓存保护机制: ...这种模式下,通常不会导致Redis服务器输出缓冲区的堆积膨胀 对于slave客户端来说,大小限制是256M,持续性限制是当客户端缓冲区大小持续60秒超过64M,则关闭客户端连接 对
  • Redis系列 Redis系列——第一章 Redis配置...Redis系列——第四章 Redis发布订阅模式 Redis系列——第五章 Redis持久化策略RDB与AOF Redis系列——第六章 Redis主从同步 Redis系列——第七章 Redis开启哨兵模式 ...
  • 7_Redis 发布订阅模式

    2021-02-04 13:45:16
    Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。 Redis 客户端可以订阅任意数量的频道。 客户端订阅频道: 新消息通过 PUBLISH 命令发送给频道 channel1: # 1)客户端...
  • 发布订阅-应用场景 Pub/Sub 从字面上理解就是发布(Publish)与订阅(Subscribe),在Redis中,你可以设定对某一个key值进行消息发布及消息订阅,当一个key值上进行了消息发布后,所有订阅它的客户端都会收到相应的...
  • 一:Redis发布订阅 Redis可以像MQ一样发布消息和订阅消息,只不过这种发布订阅是广播模式,即每个订阅者都会收到相同的消息。 二:集成 pom.xml <dependency> <groupId>org.springframework.boot<...
  • 昨天搭建了Redis Cluster 集群环境,今天就来拿它玩一玩Redis 发布/订阅模式吧 很喜欢一句话:”八小时内谋生活,八小时外谋发展“。 共勉.???? 地点:????不知道 作者:L SpringBoot 整合Redis集群配置 实现发布/...
  • 采用技术:springboot、websocket、redis发布订阅 需求 实现服务端多节点的情况下,主动推送消息到客户端 WebSokcet WebSocket介绍: WeSocket是一种协议,与Http是一个等级的,并且也是基于TCP协议,可以理解为...
  • Redis不仅可作为缓存服务器,还可用作消息队列。它的列表类型天生支持用作消息队列。如下图所示:队列主要是为了保证队列中的数据不会被重复消费,消费队列数据一般有主动消费何自动消费,主动消费及利用程序去队列...
  • redis不仅是一个非常强大的非关系型数据库,它同时还拥有消息中间件的pub/sub功能,在spring boot中进行如下设置就可以使用redis的pub/sub功能: 1.创建redis监听的设置类 @Configuration public class ...
  • 什么是Redis发布订阅 Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。 Redis有哪两种发布/订阅模式 Redis有两种发布/订阅模式: 基于频道(Channel)的发布/订阅 基于模式...
  • 这篇记录一下redis发布订阅模式的简单使用,各位看到此博客的小伙伴,如有不对的地方请及时通过私信我或者评论此博客的方式指出,以免误人子弟。多谢! 一、了解下发布订阅模式 借用菜鸟教程上的描述,Redis
  • Redis发布/订阅主要用到 subscribe、unsubscribe 和 publish 三个命令,在这个实现中,发送者(发送信息的客户端)不是将信息直接发送给特定的接收者(接收信息的客户端),而是将信息发送给频道(channel),然后由频道将...
  • 1、redis客户端实现发布订阅 1.1 启动端口,发布hello world 1.2 启动另一个客户端,订阅 1.3 常用指令 1.4按模式规则订阅和取消订阅 2、应用场景 2.1 测试实践:微信班级群 class:20170101 1、redis客户端...
  • Redis发布订阅模型发布订阅模型redis实现源码实现订阅发布其他应用场景缺点 对一些数据量比较少,而又符合发布订阅模型的业务,我们可以尝试使用redis进行实现,而无需一上来就使用消息队列这么重的工具。 发布订阅...
  • 一般来说,消息队列有两种场景,一种是发布订阅模式,一种是生产者消费者模式。 生产者消费者模式: 就像我们用微信和好友(群聊除外)聊天一样,微信就是这个队列,我们可以和很多个好友聊天,但是每条消息...
  • redis 发布订阅

    2020-12-28 21:31:59
    举例1:qq群的公告,单个发布者,多个收听者发布/订阅 实验发布订阅的命令PUBLISH channel msg将信息 message 发送到指定的频道 channelSUBSCRIBE channel [channel ...]订阅频道,可以同时订阅多个频道UNSUBSC...
  • 前言 ...Redis有两种方式可支持我们实现MQ功能,1、使用列表(List)相关命令特性;2、使用publish、subscribe命令特性; 这里我是采取列表相关命令实现。 使用列表(List)相关命令的特性实现 压入数据(发
  • redis发布订阅模式

    2021-07-22 09:54:57
    redis自带的发布订阅模式,可以通过client和server通过channel或者模式进行自动匹配,一方发布,所有订阅方均可以拿到 redis命令:subscribe publish psubscribe client1通过subscribechannel订阅频道 例如:...
  • 在项目中用到了redis作为...同时在更高层面上,Redis还支持"发布/订阅"的消息模式,可以基于此构建一个聊天系统。一、redis的列表类型天生支持用作消息队列。(类似于MQ的队列模型--任何时候都可以消费,一条消息只能...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 33,308
精华内容 13,323
关键字:

redis发布订阅模式

redis 订阅