首页 > 数据库 >redis的消息发布订阅实现

redis的消息发布订阅实现

时间:2023-06-12 16:33:29浏览次数:61  
标签:订阅 name redis 发布 消息 new public String



文章目录

  • 前言
  • 一、创建好springboot项目,引入核心依赖
  • 二、使用步骤
  • 1. 自定义一个消息接受类
  • 2.声名一个消息配置类
  • 3.编写一个测试类
  • 总结



前言

一般项目中都会使用redis作为缓存使用,加速用户体验,实现分布式锁等等,redis可以说为项目中的优化,关键技术实现立下了汗马功劳.今天带来它的另一个功能,实现简单的消息发布订阅~,也就是说如果是简单的消息队列,首先是不需要我们自己实现的,其次很简单的那种,也无需引入mq相关的东西;


一、创建好springboot项目,引入核心依赖

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-redis</artifactId>
            <version>1.4.7.RELEASE</version>
        </dependency>
         <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

二、使用步骤

1. 自定义一个消息接受类

代码如下(示例):

/**
 * @ClassName: MyReceiver
 */
@Component
@Slf4j
public class MyReceiver implements MessageListener {
    @Override
    public void onMessage(Message message, byte[] pattern) {
        log.info("接受消息的通道:{}",new String(message.getChannel()));
        log.info("接受到的消息:{}",new String(message.getBody()));
//        Student student = JSONUtil.toBean(new String(message.getBody()), Student.class);
//       log.info("年龄:{}",student.getAge());
    }
}

2.声名一个消息配置类

代码如下(示例):

/**
 * @ClassName: ListenerConfig
 */
@Component
public class ListenerConfig {

    @Autowired
    MyReceiver myReceiver;

    @Bean
    RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory, MessageListenerAdapter listenerAdapter) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        // 声名了两个接受消息的通道(主题)
        // 将myReceiver与消息通道绑定
        container.addMessageListener(listenerAdapter, new PatternTopic("redis_channel"));
        container.addMessageListener(listenerAdapter, new PatternTopic("redis_channel2"));
        return container;
    }

    //使用消息监听器容器注册Receiver,以便它将接收消息(监听onMessage方法)
    // 将上面的myReceiver注入到当前监听处理器中
    @Bean
    MessageListenerAdapter listenerAdapter() {
        return new MessageListenerAdapter(myReceiver, "onMessage");
    }
}

3.编写一个测试类

@SpringBootTest
class RedisTest {

    @Autowired
    StringRedisTemplate redisTemplate;

    @Autowired
    MyReceiver myReceiver;

    @Autowired
    ObjectMapper objectMapper;

    @Test
    void ss() throws JsonProcessingException {
        Student student = new Student();
        student.setAge(12);
        student.setId(11);
        redisTemplate.convertAndSend("redis_channel", JSONUtil.toJsonStr(student));
        redisTemplate.convertAndSend("redis_channel1", objectMapper.writeValueAsString("哈哈哈哈"));
        redisTemplate.convertAndSend("redis_channel2", objectMapper.writeValueAsString("嘻嘻嘻"));
    }

}

redis的消息发布订阅实现_spring

代码中用的通讯实体,注意实现 Serializable 序列化

/**
 * 学生类
 *
 * @author ming
 */
public class Student implements Serializable {

    private int id;

    private String name;

    private int age;

    //一个学生有多个电话号码
    List tels = new ArrayList();

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public List getTels() {
        return tels;
    }

    public void setTels(List tels) {
        this.tels = tels;
    }



    public static class Tel {

        private String name;

        private String tel;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getTel() {
            return tel;
        }

        public void setTel(String tel) {
            this.tel = tel;
        }


    }
}

总结

可以看到

  1. 实现了消息的发布,以及消息的订阅接受消息
  2. 我在测试类中 RedisTest 发布了三条消息,但是在 myReceiver仅仅接受到了两条消息,是因为我在 ListenerConfig 配置类中仅仅给myReceiver 绑定了两条消息通道的原因
  3. myReceiver的注释可以打开,可以接收到消息并且可以转换为实体,接受到消息后可以任意处理


标签:订阅,name,redis,发布,消息,new,public,String
From: https://blog.51cto.com/u_16158506/6463454

相关文章

  • redis三:key常用命令
    1.keys*显示所有keyexistsk1k2...有几个就显示几2.typekey显示key的类型 3.delkey删除指定的key4unlinkkey非阻塞删除,del原子的有可能阻塞5.expirekey秒为key设置过期时间ttlkey查看还有多少秒过去,-1永不过期,-2表示已过期 6. redis带着16个库,默认在......
  • Redis实现分页和多条件模糊查询方案
    简介: 本文将基于Redis提供条件查询+分页的技术解决方案。 导言Redis是一个高效的内存数据库,它支持包括String、List、Set、SortedSet和Hash等数据类型的存储,在Redis中通常根据数据的key查询其value值,Redis没有模糊条件查询,在面对一些需要分页、排序以及条件查询的场景时(如......
  • Java开发 - 让你少走弯路的Redis集群搭建
    前言前文中,我们已经对Redis的单节点哨兵的搭建方式做了演示和测试,相信大家已经了解了怎么操作,虽然是单节点,但基本已经满足了部分公司的日常需要,毕竟Redis集群不是什么项目都适用,用上了Redis,也未必需要使用哨兵,甚至集群。但今天,我们还是要把Redis哨兵集群的搭建方式给大家做个分享,万......
  • redis工具类
    packagecom.yashi.common.utils;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.data.redis.core.HashOperations;importorg.springframework.data.redis.core.ListOperations;importorg.springframework.data.redis.cor......
  • 如何使用redis实现高效的分页功能
    如何使用redis实现高效的分页功能一、分页的需求和挑战在很多场景下,我们需要对大量的数据进行分页展示,比如社交网络中的动态、电商平台中的商品列表、博客网站中的文章评论等。分页的目的是为了提高用户体验,让用户可以按照自己的喜好和需求来浏览数据,而不是一次性加载所有的数据......
  • redis集群异常修复
    概述分析redis在异常情况在的处理流程,redis集群在正常情况下自动主从切换,前提条件master在线多于一半的情况https://github.com/tair-opensource/RedisShake/wikihttp://www.redis.cn/commands/cluster-failover.html 环境:centos7.xredis-5.xredis-cluster(3master/3slave......
  • JuiceFS 社区版 v1.1- Beta 发布,新增五个实用功能
    我们很高兴地宣布JuiceFSv1.1-Beta版本正式发布啦!这是一个功能丰富的版本,带来了许多实用的新功能和改进。在这个版本中我们新增了以下功能:目录配额:为目录设置配额限制,控制其大小和文件数目录克隆:快速地复制目录及其内容,节省时间和空间一键恢复回收站文件:一次性地恢复某段时......
  • Redis集群-哨兵模式搭建(1主2从3哨兵节点)
    Redis集群-哨兵模式搭建(1主2从3哨兵节点)原创 北极星 运维记事 2023-04-2022:47 发表于四川收录于合集#redis8个主机规划类型IP地址端口号主192.168.77.1456379从1192.168.77.1466379从2192.168.77.1476379哨兵1192.168.77.14526379哨兵2......
  • qt6.5.0使用windeployqt发布程序提示Creating qt_ar_qm... Cannot open. : 拒绝访问
    报错内容如下图这是一个软件bug,qt社区的解决办法是,使用新版本6.5.1或6.6.0 ......
  • 通过redis学网络(2)-redis网络模型
    本系列主要是为了对redis的网络模型和集群原理进行学习,我会用golang实现一个reactor网络模型,并实现对redis协议的解析。系列源码已经上传githubhttps://github.com/HobbyBear/tinyredis/tree/chapter2redis网络模型在介绍redis网络模型前,我们先来看看redis的一条命令执行......