Redis(十)订阅和发布(sub/pub)以及Java实现代码
发布日期:2021-05-14 13:57:31 浏览次数:17 分类:精选文章

本文共 2801 字,大约阅读时间需要 9 分钟。

Redis 发布与订阅命令详解

随着消息队列技术在现代应用中的广泛应用,Redis 的订阅发布功能成为了开发者获取高效数据通知的重要工具。本文将详细介绍 Redis 中的发布订阅命令,并提供实际案例说明。

Publish 命令

发布的核心命令是 publish,用于向指定频道推送消息。命令格式如下:

PUBSUB pattern [channel] [message]

例如:

PUBSUB "mychan" "hello world"

关键点说明:

  • channel:指定要推送的频道。
  • message:要发送的消息内容。

此外,可以选择不指定 channel,默认使用已经订阅的频道。

Subscribe 命令

订阅命令用于监听特定频道的消息,主要有以下类型:

  • 单个频道订阅
  • SUBSCRIBE channel
    1. 多个频道订阅
    2. SUBSCRIBE chan1,chan2,chan3
      1. 模式订阅(支持通配符,* 表示任意前缀):
      2. PSUBSCRIBE pattern channel

        关键点说明:

        • 单个频道订阅会自动订阅该频道并等待消息发 sending。
        • 模式订阅可以根据特定规则筛选频道。

        Unsubscribe 命令

        取消订阅的命令方式有以下几种:

      3. 取消单个频道订阅
      4. UNSUBSCRIBE channel
        1. 取消多个频道订阅
        2. UNSUBSCRIBE chan1,chan2
          1. 取消所有订阅
          2. UNSUBSCRIBE *

            注意事项:

            • 当使用 * 时,需谨慎操作,以防误删所有订阅。

            常见订阅模式示例

            • 全匹配通配符:
            PSUBSCRIBE it*  # 匹配所有以 `it` 开头的频道
            • 多级通配符:
            PSUBSCRIBE news.* it.*  # 匹配所有以 `news.` 和 `it.` 开头的频道

            Java 实现示例

            在实际开发中,集成 Redis 的订阅发布功能需自定义发布者和订阅者类。以下是一个简化的 Java 实现:

            // Publisher 类
            public class Publisher implements Runnable {
            private final JedisPool jedisPool;
            Publisher(JedisPool jedisPool) {
            this.jedisPool = jedisPool;
            }
            @Override
            public void run() {
            try {
            Jedis jedis = jedisPool.getResource();
            Scanner scanner = new Scanner(System.in);
            while (true) {
            String input = scanner.nextLine();
            if (!"quit".equals(input)) {
            jedis.publish("broadcast_channel", input);
            } else {
            break;
            }
            }
            } catch (IOException e) {
            e.printStackTrace();
            }
            }
            }
            // Subscriber 类
            public class Subscriber extends JedisPubSub {
            @Override
            public void onMessage(String channel, String message) {
            System.out.println("收到消息:" + channel + ":" + message);
            }
            // 其他回调方法保持默认
            }

            测试与验证

            配置好 Redis 环境后,可以运行以下代码测试订阅发布功能:

            // 测试发布者
            public class Doit {
            public static void main(String[] args) throws InterruptedException {
            Doit.PublishTest pt = new Doit.PublishTest();
            pt.run();
            }
            }
            class PublishTest {
            private final Jedis jedis = new Jedis("localhost");
            void run() {
            try {
            new Thread(() -> {
            // 发布消息
            for (; ; ) {
            String input = jedis荡();
            if (!" quit ".trim().equals(input)) {
            jedis.publish("broadcast_channel", input);
            }
            }
            }).start();
            // substrate 接收消息
            jedisевые subscribe(ain,, "broadcast_channel")();
            while (true) {
            System.in.read();
            }
            } catch (Exception e) {
            e.printStackTrace();
            }
            }
            }

            注意事项

          3. 发布和订阅的 latency:消息发布与订阅之间可能存在延迟,需根据具体使用场景进行优化。

          4. 消息持久性:根据需求设置消息的持久性,使用 PERSIST 公式。

          5. 频道管理:合理管理频道数量,避免过度订阅导致性能问题。

          6. 通过以上内容,开发者可以充分理解和掌握 Redis 的订阅发布功能,灵活应对不同场景下的数据通知需求。

    上一篇:Redis(九)Redis的过期时间操作以及部分常用命令
    下一篇:Redis(七)Redis的持久化存储RDB和AOF

    发表评论

    最新留言

    逛到本站,mark一下
    [***.202.152.39]2025年04月30日 09时05分35秒