Redis学习笔记(四):发布订阅

API

  1. publish

    发布命令,publish channel message

    PUBLISH sohu "hello world!"
    

    返回值是订阅者的数量。

  2. subscribe

    订阅命令

    SUBSCRIBE sohu
    

    此时处于监听状态,一旦有新的消息发布,可以收到并展示。

  3. unsubscribe

    取消订阅,其实在退出当前客户端时就自动取消订阅了。

    UNSUBSCRIBE [channel [channel ...]]
    

    退订一个或多个频道,如果执行时没有给定任何频道,那么退订所有频道。

  4. psubscribe

    订阅与给定模式相匹配的所有频道

    #PSUBSCRIBE pattern [pattern ...]
    PSUBSCRIBE s*
    
  5. punsubscribe

    退订指定的模式

    #PUNSUBSCRIBE pattern [pattern ...]
    PUNSUBSCRIBE s*
    
  6. PUBSUB

      # 列出至少有一个订阅者的频道
      PUBSUB CHANNELS
      # NUMSUB [channel-1 .. channel-N] 
      # 列出给定频道(sohu)的订阅者数量
      PUBSUB NUMSUB sohu
      # 列出所有通过模式匹配方式的订阅者数量,没有参数
      PUBSUB NUMPAT
    

    注意,模式匹配和指定频道的匹配是分开统计的,虽然PSUBSCRIBE s*也能订阅到sohu,但是PUBSUB NUMSUB sohu并不能统计到。同样的,PUBSUB NUMPAT不能统计SUBSCRIBE sohu的数量。

Jedis演示

public class RedisSub extends JedisPubSub {

    public static void main(String[] args) throws InterruptedException {
        RedisSub redisSub = new RedisSub();
        JedisPool jedisPool = new JedisPool();
        Runnable runnable = () -> jedisPool.getResource().subscribe(redisSub, "programmer");
        new Thread(runnable).start();
        TimeUnit.SECONDS.sleep(1);
        jedisPool.getResource().publish("programmer", "a");
        TimeUnit.SECONDS.sleep(1);
        jedisPool.getResource().publish("programmer", "b");
        TimeUnit.SECONDS.sleep(4);
        redisSub.unsubscribe("programmer");
    }

    @Override
    public void onMessage(String channel, String message) {
        System.out.println("收到来自" + channel + "频道的消息" + message);
    }

    @Override
    public void onUnsubscribe(String channel, int subscribedChannels) {
        System.out.println("退订来自" + channel + "频道的消息");
    }
}

输出如下:

收到来自programmer频道的消息a
收到来自programmer频道的消息b
退订来自programmer频道的消息

Springboot集成

参考spring boot集成redis的基本配置配置Gradle依赖及连接池.

发布

直接使用RedisTemplate::convertAndSend发布.

订阅

Springboot中使用发布订阅模式比较简单,只需要继承MessageListenerAdapter,通过RedisMessageListenerContainer绑定指定的一个或多个Topic(ChannelTopic或者PatternTopic)后,重写onMessage方法来自定义业务操作.最终将组件注入到容器中即可发挥作用.非常容易扩展.

这里以自定义的总监听(RedisCommonMsgListener)和登录监听(RedisUserMsgListener)为例.

RedisCommonMsgListener:

@Slf4j
@Component
public class RedisCommonMsgListener extends MessageListenerAdapter {
    @Autowired
    public RedisCommonMsgListener(RedisMessageListenerContainer messageListenerContainer) {
        messageListenerContainer.addMessageListener(this, new PatternTopic("*"));
    }

    @Override
    public void onMessage(Message message, byte[] pattern) {
        log.info("接收到Redis的消息:{}", new String(message.getBody()));
    }
}

RedisUserMsgListener:

@Slf4j
@Component
public class RedisUserMsgListener extends MessageListenerAdapter {

    @Autowired
    public RedisUserMsgListener(RedisMessageListenerContainer messageListenerContainer) {
        LinkedList<Topic> topics = new LinkedList<Topic>() {{
            add(new ChannelTopic("swb:user:login"));
            add(new ChannelTopic("swb:user:logout"));
        }};
        messageListenerContainer.addMessageListener(this, topics);
    }

    @Override
    public void onMessage(Message message, byte[] pattern) {
        String name = new String(message.getBody());
        String topic = new String(pattern);
        String option = null;
        if ("swb:user:login".equals(topic)) {
            option = "登录";
        }
        if ("swb:user:logout".equals(topic)) {
            option = "退出";
        }
        log.info("user[{}]{}了系统.", name, option);
    }
}

参考

Redis实战——Redis的pub/Sub(订阅与发布)在java中的实现

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值