千家信息网

怎么用redis发布订阅方式实现简易的消息系统

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章主要讲解了"怎么用redis发布订阅方式实现简易的消息系统",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"怎么用redis发布订阅方式实现简易的
千家信息网最后更新 2026年11月02日怎么用redis发布订阅方式实现简易的消息系统

这篇文章主要讲解了"怎么用redis发布订阅方式实现简易的消息系统",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"怎么用redis发布订阅方式实现简易的消息系统"吧!

I. 基本使用

1. 配置

我们使用 SpringBoot 2.2.1.RELEASE来搭建项目环境,直接在pom.xml中添加 redis 依赖

    org.springframework.boot    spring-boot-starter-data-redis

如果我们的 redis 是默认配置,则可以不额外添加任何配置;也可以直接在application.yml配置中,如下

spring:  redis:    host: 127.0.0.1    port: 6379    password:

2. 使用姿势

redis 的发布/订阅,主要就是利用两个命令publish/subscribe; 在 SpringBoot 中使用发布订阅模式比较简单,借助 RedisTemplate 可以很方便的实现

a. 消息发布

@Servicepublic class PubSubBean {    @Autowired    private StringRedisTemplate redisTemplate;    public void publish(String key, String value) {        redisTemplate.execute(new RedisCallback() {            @Override            public Object doInRedis(RedisConnection redisConnection) throws DataAccessException {                redisConnection.publish(key.getBytes(), value.getBytes());                return null;            }        });    }}

b. 订阅消息

消息订阅这里,需要注意我们借助org.springframework.data.redis.connection.MessageListener来实现消费逻辑

public void subscribe(MessageListener messageListener, String key) {    redisTemplate.execute(new RedisCallback() {        @Override        public Object doInRedis(RedisConnection redisConnection) throws DataAccessException {            redisConnection.subscribe(messageListener, key.getBytes());            return null;        }    });}

c. 测试 case

写一个简单的测试 case,来验证一下上面的发布订阅,顺带理解一下这个MessageListener的使用姿势;我们创建一个简单的 WEB 工程,提供两个 rest 接口

@RestController@RequestMapping(path = "rest")public class DemoRest {    @Autowired    private PubSubBean pubSubBean;    // 发布消息    @GetMapping(path = "pub")    public String pubTest(String key, String value) {        pubSubBean.publish(key, value);        return "over";    }    // 新增消费者    @GetMapping(path = "sub")    public String subscribe(String key, String uuid) {        pubSubBean.subscribe(new MessageListener() {            @Override            public void onMessage(Message message, byte[] bytes) {                System.out.println(uuid + " ==> msg:" + message);            }        }, key);        return "over";    }}

我们先创建了两个消费者,然后发送消息时,两个都收到;再新增一个消费者,发送消息时,三个都能收到

3. 使用说明与应用场景

redis 的发布订阅,只适用于比较简单的场景,从上面的使用说明也能看出,它就是一个简单的发布订阅模型,支持 1 对 N,而且发送的消息,只有在线的消费者才能 get 到(至于不在线的,那就只能说遗憾了)而且对于 redis 而言,消息推出去之后就完事了,至于消费者能不能正常消费,那就不 care 了

划重点:

  • 只有在线的消费者能接收到消息

  • 对于消费者一个消息只能拿到一次

接下来的问题就来了,什么样的场景下可以使用 redis 的发布订阅呢?

基于内存的缓存失效

利用 reids + 内存做二级缓存,可以说是比较常见的方式了,借助基于内存的缓存,可以有效的提高系统的负载,但是问题也很明显,内存中缓存数据失效是个问题,特别是当一个应用部署多台服务器时,如果我希望同时失效所有服务器的某个内存缓存,使用 redis 的发布/订阅就是一个比较好的选择

SpringCloud Config 配置刷新

使用 SpringCloud Config 做配置中心的小伙伴可能会经常遇到这个问题,配置修改之后的动态刷新是个问题(当然官方是支持通过 mq 走 bus 总线来同步,也可以通过 spring boot admin 来强刷)

借助 redis 发布/订阅,实现配置动态刷新也是一个不错的备选方案(后面给出一个具体的实现 demo,如有兴趣请持续关注一灰灰 Blog)

redis key 失效订阅

我们在使用 redis 做缓存时,通常会设置一个过期时间,redis 提供了一个过期的事件,当然默认是不开启的;我们也是可以通过 subscribe 来订阅缓存失效的事件

修改配置,开启 key 失效事件

notify-keyspace-events Ex

重启 redis 之后,订阅失效事件即可

subscribe __keyevent@0__:expired

感谢各位的阅读,以上就是"怎么用redis发布订阅方式实现简易的消息系统"的内容了,经过本文的学习后,相信大家对怎么用redis发布订阅方式实现简易的消息系统这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

订阅 消息 消费 配置 消费者 缓存 问题 方式 系统 内存 简易 两个 事件 就是 场景 在线 学习 使用说明 内容 动态 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 南京欣网互联网络科技 上海睿民互联网科技有限公司 山东特亿宝互联网科技有限公司 苏州找大状互联网科技有限公司 美国互联网科技巨头监管 广州互联网络科技有限公司 互联网科技缩写 睿民互联网科技 亿人帮互联网科技 华脉科技工业互联网产品 西藏七维空间互联网科技有限公司 承德科技产业互联网发展 金融科技与互联网金融相同和不同 栖莱科技互联网股份有限公司 受益于互联网科技的高速发展 互联网科技革命什么开始 互联网与医疗科技 无锡工业互联网科技有限公司 抖集互联网科技技术咨询 承德科技产业互联网平台 喔噻互联网科技有限公司 互联网医疗科技 广州互联网络科技有限公司 深圳天众互联网科技公司 深圳艾佳互联网科技 安控科技rtu产品工业互联网 未来五年的互联网科技 安徽零酒互联网科技有限公司 互联网科技创新创业项目 华人运通互联网科技公司
0