百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

使用Redis实现发布订阅功能?实现数据实时更新事件监听?

mhr18 2024-11-14 16:17 103 浏览 0 评论

发布订阅模式,是一种在开发中常见的消息传递模式,经常被用来实现消息广播和实时通知功能。通过消息发布者发送消息,消息接收者也就是消息订阅者通过一个或者多个频道来接收消息发送者发送的消息,来实现消息的实时传递。

通过消息的发布订阅,可以实现消息发布者与订阅者之间的松耦合,这样可以提高系统的灵活性。通过发布订阅可以实现消息在发布方与订阅方之间的消息实时传递。下面我们就来看看最简单的通过Redis来实现消息的发布订阅。

为什么要选择Redis?

使用Redis来实现消息的发布订阅,对于一个中小型系统来讲是比较合理的安排,因为在我们做权限认证的,用户信息保存的时候,通常会使用Redis来进行数据的缓存或者是对用户登录信息的存储操作。为了实现用户信息的存储就会安装有Redis来进行数据持久化。

如果这个时候系统中需要再配合一个消息队列的话,无论是从开发成本还是从技术难度上都是不划算的。本来就是一个中小型的系统,为了实现消息实时通信,还需要去做安装消息中间件来实现发布订阅,就有点划不来了。

当然在一些大型的互联网系统中,因为有现成的消息中间件集群,并且对于实时消息发布都是有着严格的要求,那么这个时候我们就可以选择其他的消息中间件来实现这样的功能了。

从性能角度上来讲,Redis用来做消息的发布订阅表现也是比较好的,可以满足大部分场景下的需求。

Redis发布订阅原理

消息的发布操作

消息发布者可以通过PUBLISH命令将消息发送到指定的通道中,如下所示。

PUBLISH channel message

PUBLISH news "Hello, subscribers!"

消息订阅者

订阅者通过SUBSCRIBE命令订阅一个或多个频道,一旦订阅成功,它们将始终接收来自这些频道的消息。如下所示

SUBSCRIBE channel [channel ...]
SUBSCRIBE news

完成上述操作之后就可以完成消息的订阅了

整合SpringBoot具体实现操作

这里我们整合SpringBoot来实现消息的发布订阅功能。

第一步、引入依赖

因为要使用到RedisTemplate所以需要添加Spring Data Redis相关的依赖,当然我们也可以使用其他的客户端连接库,例如Jedis等。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

第二步、配置Redis的连接

在Spring Boot的application.yml配置文件中添加Redis连接的相关信息

# Spring配置
spring:
  # redis 配置
  redis:
    # 地址
    host: 192.168.1.200
    # 端口,默认为6379
    port: 6379
    # 数据库索引
    database: 9
    # 密码
    password: 1231232
    # 连接超时时间
    timeout: 10s
    lettuce:
      pool:
        # 连接池中的最小空闲连接
        min-idle: 0
        # 连接池中的最大空闲连接
        max-idle: 8
        # 连接池的最大数据库连接数
        max-active: 8
        # #连接池最大阻塞等待时间(使用负值表示没有限制)
        max-wait: -1ms

第三步、创建消息发布者和订阅者

消息发布者

@Component
public class RedisPublisher {

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    public void publish(String channel, String message) {
        redisTemplate.convertAndSend(channel, message);
    }
}

消息订阅者

@Component
public class RedisSubscriber implements MessageListener {

    @Override
    public void onMessage(Message message, byte[] pattern) {
        String channel = new String(message.getChannel());
        String msg = new String(message.getBody());
        System.out.println("Received message: " + msg + " from channel: " + channel);
    }
}

第四步、向容器中注入订阅者

@SpringBootApplication
public class YourApplication {

    public static void main(String[] args) {
        SpringApplication.run(YourApplication.class, args);
    }

    @Bean
    public RedisMessageListenerContainer redisContainer(MessageListener messageListener) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(redisConnectionFactory());
        container.addMessageListener(messageListener, new PatternTopic("send_message_channel"));
        return container;
    }

    @Bean
    public MessageListener messageListener() {
        return new RedisSubscriber();
    }
}

现在当你在应用中使用了Redis的发布者往制定的频道中发送消息的时候,那么消息订阅者就可以通过通道的Topic来接收到消息。

相关推荐

一文读懂Prometheus架构监控(prometheus监控哪些指标)

介绍Prometheus是一个系统监控和警报工具包。它是用Go编写的,由Soundcloud构建,并于2016年作为继Kubernetes之后的第二个托管项目加入云原生计算基金会(C...

Spring Boot 3.x 新特性详解:从基础到高级实战

1.SpringBoot3.x简介与核心特性1.1SpringBoot3.x新特性概览SpringBoot3.x是建立在SpringFramework6.0基础上的重大版...

「技术分享」猪八戒基于Quartz分布式调度平台实践

点击原文:【技术分享】猪八戒基于Quartz分布式调度平台实践点击关注“八戒技术团队”,阅读更多技术干货1.背景介绍1.1业务场景调度任务是我们日常开发中非常经典的一个场景,我们时常会需要用到一些不...

14. 常用框架与工具(使用的框架)

本章深入解析Go生态中的核心开发框架与工具链,结合性能调优与工程化实践,提供高效开发方案。14.1Web框架(Gin,Echo)14.1.1Gin高性能实践//中间件链优化router:=...

SpringBoot整合MyBatis-Plus:从入门到精通

一、MyBatis-Plus基础介绍1.1MyBatis-Plus核心概念MyBatis-Plus(简称MP)是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提...

Seata源码—5.全局事务的创建与返回处理

大纲1.Seata开启分布式事务的流程总结2.Seata生成全局事务ID的雪花算法源码3.生成xid以及对全局事务会话进行持久化的源码4.全局事务会话数据持久化的实现源码5.SeataServer创...

Java开发200+个学习知识路线-史上最全(框架篇)

1.Spring框架深入SpringIOC容器:BeanFactory与ApplicationContextBean生命周期:实例化、属性填充、初始化、销毁依赖注入方式:构造器注入、Setter注...

OpenResty 入门指南:从基础到动态路由实战

一、引言1.1OpenResty简介OpenResty是一款基于Nginx的高性能Web平台,通过集成Lua脚本和丰富的模块,将Nginx从静态反向代理转变为可动态编程的应用平台...

你还在为 Spring Boot3 分布式锁实现发愁?一文教你轻松搞定!

作为互联网大厂后端开发人员,在项目开发过程中,你有没有遇到过这样的问题:多个服务实例同时访问共享资源,导致数据不一致、业务逻辑混乱?没错,这就是分布式环境下常见的并发问题,而分布式锁就是解决这类问题的...

近2万字详解JAVA NIO2文件操作,过瘾

原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处。从classpath中读取过文件的人,都知道需要写一些读取流的方法,很是繁琐。最近使用IDEA在打出.这个符号的时候,一行代...

学习MVC之租房网站(十二)-缓存和静态页面

在上一篇<学习MVC之租房网站(十一)-定时任务和云存储>学习了Quartz的使用、发邮件,并将通过UEditor上传的图片保存到云存储。在项目的最后,再学习优化网站性能的一些技术:缓存和...

Linux系统下运行c++程序(linux怎么运行c++文件)

引言为什么要在Linux下写程序?需要更多关于Linux下c++开发的资料请后台私信【架构】获取分享资料包括:C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,fastdf...

2022正确的java学习顺序(文末送java福利)

对于刚学习java的人来说,可能最大的问题是不知道学习方向,每天学了什么第二天就忘了,而课堂的讲解也是很片面的。今天我结合我的学习路线为大家讲解下最基础的学习路线,真心希望能帮到迷茫的小伙伴。(有很多...

一个 3 年 Java 程序员 5 家大厂的面试总结(已拿Offer)

前言15年毕业到现在也近三年了,最近面试了阿里集团(菜鸟网络,蚂蚁金服),网易,滴滴,点我达,最终收到点我达,网易offer,蚂蚁金服二面挂掉,菜鸟网络一个月了还在流程中...最终有幸去了网易。但是要...

多商户商城系统开发全流程解析(多商户商城源码免费下载)

在数字化商业浪潮中,多商户商城系统成为众多企业拓展电商业务的关键选择。这类系统允许众多商家在同一平台销售商品,不仅丰富了商品种类,还为消费者带来更多样的购物体验。不过,开发一个多商户商城系统是个复杂的...

取消回复欢迎 发表评论: