ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

Redis-高级篇

2021-07-18 09:34:37  阅读:177  来源: 互联网

标签:订阅 String Redis redis 高级 jedisPool public channel


发布订阅

  • 什么是发布订阅
    Redis发布订阅(pub/sub)是一种消息通讯模式:可以指定一个频道(key),发布者(pub)向频道发送消息,订阅者(sub)可以接受该频道的消息。

  • 客户端演示

先创建频道名redisWechat

redis 127.0.0.1:6379> SUBSCRIBE redisChat
Reading messages… (press Ctrl-C to quit)

  1. “subscribe”
  2. “redisChat”
  3. (integer) 1

重新开启个 redis 客户端,然后在同一个频道 redisChat 发布两次消息,订阅者就
能接收到消息。

redis 127.0.0.1:6379> PUBLISH redisChat “Redis is a great caching technique”
(integer) 1
redis 127.0.0.1:6379> PUBLISH redisChat “Learn redis by runoob.com”
(integer) 1

  1. “message”
  2. “redisChat”
  3. “Redis is a great caching technique”
  4. “message”
  5. “redisChat”
  6. “Learn redis by runoob.com”

在这里插入图片描述

  • Java Api演示

    • 引入依赖
      在这里插入图片描述

    • 代码


//发布者
public class Publisher extends Thread{

    private final JedisPool jedisPool;

    public Publisher(JedisPool jedisPool) {
        this.jedisPool = jedisPool;
    }


    @Override
    public void run() {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        Jedis jedis = jedisPool.getResource();//从连接池子中获取连接
        while (true){
            try {
                String input = reader.readLine();
                if (!"quit".equals(input)){
                    jedis.publish("mychannel",input);
                }else{
                    break;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
//订阅者
public class Subscriber extends JedisPubSub {

    @Override
    //收到消息会调用这个方法
    public void onMessage(String channel, String message) {
        System.out.println(String.format("receive one message from channel %s,message is %s",channel,message));
    }

    @Override
    //订阅频道时会调用
    public void onSubscribe(String channel, int subscribedChannels) {

        System.out.println(String.format("subscribe redis channel success, channel %s, subscribedChannels %d",
                channel, subscribedChannels));
    }

    @Override
    //取消订阅时会调用
    public void onUnsubscribe(String channel, int subscribedChannels) {
        System.out.println(String.format("unsubscribe redis channel, channel %s, subscribedChannels %d",
                channel, subscribedChannels));
    }
}

//订阅频道
public class SubThread extends Thread{

    private final JedisPool jedisPool;
    private final Subscriber subscriber = new Subscriber();
    private final String channel = "mychannel";

    public SubThread(JedisPool jedisPool) {
        super("SubThread");
        this.jedisPool = jedisPool;
    }

    @Override
    public void run() {
        System.out.println(String.format("subscribe redis, channel %s, thread will be blocked", channel));
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            //通过subscriber的api去订阅,入参是订阅者和频道名
            jedis.subscribe(subscriber, channel);
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println(String.format("subsrcibe channel error, %s", e));
        } finally {
            jedis.close();
        }
    }
}

//测试类
public class PubSubDemo {
    public static void main(String[] args) {
        // 连接redis服务端
        JedisPool jedisPool = new JedisPool(new JedisPoolConfig(), "119.23.69.255", 6379);

        SubThread subThread1 = new SubThread(jedisPool); //订阅者1
        subThread1.start();
        SubThread subThread2 = new SubThread(jedisPool); //订阅者2
        subThread2.start();
        Publisher publisher = new Publisher(jedisPool); //发布者
        publisher.start();

    }
}
  • 运行结果
    在这里插入图片描述
  • 使用场景

1 即时聊天
2 微博订阅,推送
3 异步处理等…

  • Redis发布订阅和rabbitmq的区别
    可靠性 :

redis: 如果发布一条消息,没有订阅者的话,这条消息就会丢失,不会存在内存中
rabbitmq: 如果发布一条消息,如果没有消费者消费该队列,那么这条消息就会一直存在队列中

消费者负载均衡

rabbitmq:队列可以被多个消费者同时监控消费,但是每一条消息只能被消费一次,由于rabbitmq的消费确 认机制,因此它能够根据消费者的消费能力而调整它的负载;
redis: 发布订阅模式,一个队列可以被多个消费者同时订阅,当有消息到达时,会将该消息依次发送给每个订 阅者;

队列监控

rabbitmq : 实现了后台监控平台,可以在该平台上看到所有创建的队列的详细情况,良好的后台管理平台可以 方便我们更好的使用;
redis : 没有所谓的监控平台

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

标签:订阅,String,Redis,redis,高级,jedisPool,public,channel
来源: https://blog.csdn.net/ccccc202/article/details/116571777

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有