Springboot集成Redis实现发布订阅功能(Java Lettuce客户端)

redis 的 java实现 ——Lettuce 3.2、用genericJackson2JsonRedisSerializer实现。3.1、用Jackson2JsonRedisSerializer实现。方法1、properties文件配置。ttl :距离失效时间还剩XXX秒。哨兵操作(前提知识:主从模式)3、配置redis配置文件。1、 创建项目,添加依赖。 阅读详情

Redis 发布订阅架构

Redis的发布订阅机制包括三个部分,发布者,订阅者和Channel,这里的Channel类似于Kafka中的topic的概念。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3L20gwYJ-1625193593259)(nis/image-20210702095603264.png)]

发布者和订阅者都是Redis客户端,Channel则为Redis服务器端,可以理解为一种特殊的数据存储结构。发布者将消息发送到某个的频道,订阅了这个频道的订阅者就能接收到这条消息。

Redis的这种发布订阅机制与基于主题的发布订阅类似,Channel相当于主题。

使用Java Lettuce客户端实现Redis发布订阅

发布者

消息发布者的代码很简单,就定义一个普通的方法,指定要发布到的channel和要发布的消息即可。

package it.aspirin.learnredis.pub;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

/**
 * The type Publish service.
 */
@Service
public class PublishService {
    private final static Logger log = LoggerFactory.getLogger(PublishService.class);
    @Resource
    private StringRedisTemplate stringRedisTemplate;


    /**
     * Publish.
     *
     * @param topicName the topic name
     * @param message   the message
     */
    public void publish(String topicName, String message) {
        stringRedisTemplate.convertAndSend(topicName, message);
    }
}

订阅者

消息订阅者的代码同样简单。方法传入订阅到的消息,然后进行处理即可。注意这里并没有指定订阅者订阅的通道是什么。

package it.aspirin.learnredis.listener;

import org.springframework.stereotype.Service;

/**
 * The type Test listener.
 */
@Service
public class TestListener {

    /**
     * Receive message.
     *
     * @param msg the msg
     */
    public void receiveMessage(String msg){
        System.out.println(" subscribe msg = " + msg);

    }

    /**
     * Receive message 2.
     *
     * @param msg the msg
     */
    public void receiveMessage2(String msg){
        System.out.println(" subscribe msg2 = " + msg);

    }
}

配置

在订阅者的代码中并没有指定要订阅的channel。那必定在其他地方指定了,否则订阅者就不知道要消费哪个channel的数据了。

	/**
     * Container redis message listener container.
     *
     * @param connectionFactory the connection factory
     * @param listenerAdapter1  the listener adapter 1
     * @param listenerAdapter   the listener adapter
     * @return the redis message listener container
     */
    @Bean
    public RedisMessageListenerContainer container(LettuceConnectionFactory connectionFactory,
                                                   //这里可以指定多个MessageListenerAdapter,MessageListenerAdapter名字要与下面定义的bean的方法名字一致,否则会注入不进来
                                                   MessageListenerAdapter listenerAdapter1,
                                                   MessageListenerAdapter listenerAdapter){
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        //这里将channel的订阅者添加到container中,并指定要消费的channel
        container.addMessageListener(listenerAdapter1,new PatternTopic("TEST_TOPIC"));
        container.addMessageListener(listenerAdapter,new PatternTopic("TEST_TOPIC"));
        return container;
    }

    /**
     * 绑定消息监听者和接收监听的方法,必须要注入这个监听器,不然会报错
     * 这里的listenerAdapter1要与上面container中定义的名字一致
     * @param sub the sub
     * @return the message listener adapter
     */
    @Bean
    public MessageListenerAdapter listenerAdapter1(TestListener sub){
        //这个地方 是给messageListenerAdapter 传入一个消息接受的处理器,利用反射的方法调用TestListener中的“receiveMessage”方法
        return new MessageListenerAdapter(sub,"receiveMessage");
    }

    /**
     * Listener adapter message listener adapter.
     * 这里的listenerAdapter要与上面container中定义的名字一致
     * @param sub the sub
     * @return the message listener adapter
     */
    @Bean
    public MessageListenerAdapter listenerAdapter(TestListener sub){
        //这里通过反射的放射调用TestListener中的receiveMessage2方法
        return new MessageListenerAdapter(sub,"receiveMessage2");
    }

Redis发布订阅的缺点

  • 消息无法持久化,存在丢失风险,即消息一经发布,即使没有任何订阅方处理,该条消息就会丢失
  • 没有类似ACK的机制,即发布方不会确保订阅方成功接收
  • 广播机制,下游消费能力取决于消费方本身。广播机制无法通过添加多个消费方增强消费能力,因为这和发布/订阅模型本身的目的是不符的.广播机制的目的是一个一个发布者被多个订阅进行不同的处理

以上三个缺点可以说都是非常致命的,因此在考虑使用Redis发布订阅功能的时候一定要非常慎重。

Redis发布/订阅应用场景

由于Redis发布/订阅模型存在的缺陷,所以使用前需要考虑如下几点:

  • 对于消息处理可靠性要求不强
  • 消费能力无需通过增加消费方进行增强
Java21 + SpringBoot3整合Redis,使用Lettuce连接池,推荐连接池参数配置,封装Redis操作 近日心血来潮想做一个开源项目,目标是做一款可以适配多端、功能完备的模板工程,包含后台管理系统和前台系统,开发者基于此项目进行裁剪和扩展来完成自己的功能开发。本项目为前后端分离开发,后端基于Java21和开发,后端使用JWT等技术栈,前端提供了vueangularreactuniapp微信小程序等多种脚手架工程。本文主要介绍在项目中如何整合Redis,JDK版本是Java21。Redis。 阅读详情

相关推荐

6、Redis Lettuce实战(含Spring Boot)

在【Redis Jedis实战(含Spring Boot)】基础上做如下修改: 1、子pom.xml 去掉 <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </dependency> 和 <exclusions...

java爱分享 1321

Redis学习笔记之配置文件、发布和订阅、整合于SpringBoot、新数据类型(总体第二篇)

上一篇中已经学习到我们的redis的安装,和基本的数据类型,接下来学习文件配置等一系列内容。学习视频资源地址 1、Redis6配置文件 (1)数据单位 配置大小单位,开头定义了一些基本的度量单位,只支持bytes,不支持bit,大小些不敏感。 (2)配置远程访问 注掉bind 第二步是这里的:protected-mode 改为no (3)tcp-backlog (4)timeout 默认为0【你远程连接你的redis,很多时间没有操作,需要你重新连接才可以,如果设置为0就用不超时,如果设置

热爱编写程序的药学在读书 1017

FeynRules的上手使用3--运行

FeynRules的运行 接上两篇,在我们正确的设定模型参数和拉氏量之后,就可以运行FeynRules来推导费曼规则。 装载文件 首先需要设定FeynRules文件所在位置,并装载FeynRules模块: $FeynRulesPath = SetDirectory[ ] << FeynRules` 接下来是装载写好的模型文件: LoadModel[ < file.fr >, < file2.fr >, … ] 模型文件后缀为".fr",可以分几块构成。模型描述可以写在

cool_bot的博客 1074

【入门篇】1.4 redis 客户端 之 Lettuce 详解

Lettuce是一个高级Redis客户端,用于线程安全的同步、异步和反应式访问。它支持高级的Redis特性,如Sentinel、集群、流水线、自动重新连接和redis数据模型等。Lettuce是完全非阻塞的,基于Netty事件驱动的通信层,其方法将返回具有可观察的类型,可在流或异步编程环境中使用。连接池是一个预先创建并存储数据库连接的容器,应用程序在需要与数据库交互时,可以从连接池中获取已经建立的连接。使用完毕后,将该连接归还给连接池,而不是关闭它。

日拱一卒无有尽,功不唐捐终入海 9535

详解Numpy中的transpose方法

最近在学Numpy碰到了关于数组转置和换轴的概念,尤其是对tanspose方法有些疑惑,尤其是多维,查了不少资料,终于搞懂了。 Numpy数组的轴(axis) 所谓的**轴(axis)**可以理解为数组的维度。 具体而言,二维数组就是有两个维度,如果从空间上看,它就是一个平面,由x轴和y轴构成,而与此相对应的,该二维数组就有两个轴,x轴对应0轴,y轴对应1轴。 同理,三维数组有三个维度,空间上...

BlankGrid的博客 936

b站视频链接快速获取

快速获取b站视频数据

qq_45889931的博客 7699

基于Spring Boot2.x使用Redis(Lettuce)详细教程---Redis 发布订阅 (八)

8.1 应用场景 一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式。利用redis这两种场景的消息队列都能够实现。 定义: 生产者消费者模式:生产者生产消息放到队列里,多个消费者同时监听队列,谁先抢到消息谁就会从队列中取走消息;即对于每个消息只能被最多一个消费者拥有。 ​ 发布者订阅者模式:发布者生产消息放到队列里,多个监听队列的消费者都会收到同一份消息...

jetty_welcome的博客 1710

利用Python实现纬度加权平均(即NCL中的wgt_areaave)

当处理全球数据的时候,最常见的分析就是全球、北半球平均了,这时候一定要注意要根据纬度等信息进行加权,求加权平均,要不然结果肯定会不准。但是对于Python中,常规的计算包里面是没有的,或许现在有其他包可以实现,也可以告诉我~。

记录基于python语言处理气象问题的一些代码,包括不限于气象数据读取、机器学习和深度学习建模。 5743

Redis进阶——发布订阅详解

什么是发布订阅? Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。 Redis 的 subscribe 命令可以让客户端订阅任意数量的频道, 每当有新信息发送到被订阅的频道时, 信息就会被发送给所有订阅指定频道的客户端。 ☛ 下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— client2 、 client5 和 client1 之间的关系: ☛ 当有新消息通过 publish命令发送给频道.

祝我飞黄腾达 3万+

2026软件测试面试题全解析:从用例设计到接口自动化与性能实战

在软件测试岗位的招聘考察中,面试官越来越看重候选人解决实际问题的工程能力,而不仅仅是背诵概念。从最基础的测试用例设计出发,覆盖功能测试、接口测试、自动化测试、性能测试、数据库与Redis一致性等核心知识体系,是应对中高级岗位面试的关键路径。理解Postman抓包、Python脚本、Pytest框架、JMeter压测指标背后的原理,能帮助测试人员构建完整的质量保障思维。当AI辅助测试成为行业新趋势时,掌握数据校验链路与风险识别意识,更能体现资深测试工程师的竞争力。本文围绕2026年高频软件测试面试题,梳理了从

weixin_28676289的博客 244

79-Halcon-- visualize_object_model_3d 函数功能(交互式3D可视化)

该算子是连接3D数据与决策者的关键可视化桥梁,通过其独特的交互能力和高质量的渲染效果,将复杂的3D信息转化为直观的可视内容,大幅提升工程决策效率和质量。操作符,不仅能在窗口中渲染3D对象,还支持多种交互操作,适用于调试、展示和交互分析场景。本解析将全面探讨其参数功能及工业级应用方案。+几何类型: PointCloud/ TriMesh/CAD。+法线属性: [NX,NY,NZ]+附加数据: Attributes。是Halcon中功能强大的。+顶点属性: [X,Y,Z]+颜色属性: [R,G,B]

weixin_45590420的博客 1205

SpringBoot整合redis+lettuce

Spring Boot提供了与Redis的集成框架,可以使用Lettuce作为Redis客户端来进行整合。

Venus's Blog 2万+

【VisDrone数据集】YOLOX训练VisDrone数据集步骤与结果

YOLOX训练VisDrone数据集步骤与结果。

Gorgeous_wxd 2233

闲谈Redis客户端Lettuce

简介 Lettuce是一个高性能基于Java编写的Redis驱动框架,底层集成了Project Reactor提供天然的反应式编程,通信框架集成了Netty使用了非阻塞IO,5.x版本之后融合了JDK1.8的异步编程特性,在保证高性能的同时提供了十分丰富易用的API。 引入 maven <dependency> <groupId>io.lettuce</groupId> <artifactId>lettuce-core</art

1590

yolov7目标追踪:基于自定义数据集完成检测

目标追踪包含两个阶段:(1)基于自定义数据集,训练yolo目标检测模型;(2)基于检测模型,将实时检测结果传递到StrongSORT追踪算法中,该算法在OSNet基础上结合运动和外观信息,可以跟踪yolo模型检测到的任何物体。

📷 图像处理践行者 | 传统算法 · 深度学习 · 多模态 | 分享实战经验与技术洞见,探索从像素到智能的无限可能。 2306

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

利用redis实现缓存、发布订阅、分布式锁功能

通过实际例子演示如何使用spring boot,redis实现缓存、发布订阅、分布式锁功能

qiaotl的博客 2396

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Redis高级客户端Lettuce详解

前提 Lettuce是一个Redis的Java驱动包,初识她的时候是使用RedisTemplate的时候遇到点问题Debug到底层的一些源码,发现spring-data-redis的驱动包在某个版本之后替换为Lettuce。Lettuce翻译为生菜,没错,就是吃的那种生菜,所以它的Logo长这样: 既然能被Spring生态所认可,Lettuce想必有过人之处,于是笔者花时间阅读她的官方...

weixin_30567225的博客 2618

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

如何用SpringBoot整合Redis(详细讲解~)

springboot在现在的版本中操作Redis数据库用到了lettuce,而不是Jedis,如何使用springboot这个技术框架来整合redis呢?

知识记录 3万+

SpringBoot 第九篇:整合 Lettuce Redis

本文介绍了SpringBoot整合高性能Redis客户端Lettuce的完整实现方案。主要内容包括:1)Lettuce作为非阻塞Redis客户端的优势;2)SpringBoot环境配置与RedisTemplate初始化;3)RedisUtil工具类封装常用操作;4)业务层缓存集成示例;5)高级特性如集群、哨兵和发布订阅的实现;6)性能优化方案包括连接池配置、序列化优化及缓存问题解决方案;7)监控运维实现健康检查和自定义指标。通过完整代码示例展示了从基础配置到高级应用的实现过程,为开发高性能Redis应用提供

油墨香^-^的博客 1012

详解Redis之Lettuce实战

Lettuce 客户端的通信框架集成了 Netty 的非阻塞 IO 操作,客户端资源的设置与 Lettuce 的性能、并发和事件处理紧密相关,如果不是特别熟悉客户端参数配置,不建议在没有经验的前提下凭直觉修改默认值,保持默认配置就行。Lettuce 连接设计的时候,就是线程安全的,所以一个连接可以被多个线程共享,同时 lettuce 连接默认是自动重连的,使用单连接基本可以满足业务需求,大多数情况下不需要配置连接池,多连接并不会给操作带来性能上的提升。,如果没有响应式编程经验可以先自行了解一下,访问地址。

PJ码匠人 1190

Redis:原理速成+项目实战——Redis的Java客户端

Redis:原理速成+项目实战——Redis的Java客户端

m0_52380556的博客 1336

Redis的java客户端

SpringData是Spring中数据操作的模块,包含对各种数据库的集成,其中对Redis的集成模块就叫做SpringDataRedis。为了在反序列化时知道对象的类型,JSON序列化器会将类的class类型写入json结果中,存入Redis,会带来额外的内存开销。支持基于JDK、JSON、字符串、Spring对象的数据序列化及反序列化。尽管]SON的序列化方式可以满足我们的需求,但依然存在一些问题,如图。提供了对不同Redis客户端的整合 (Lettuce和jedis)支持Redis的发布订阅模型。

2302_76909185的博客 674

Redis之Java客户端【Jedis,Spring Data Redis】

​ 在Redis官网中提供了各种语言的客户端,地址:/docs/clients/,不过我是学Java的,那这里就给大家介绍javad的客户端。 ​

一切总会归于平淡 1668

一文带你彻底搞懂Redis实现消息的订阅发布

频道的发布订阅实现原理Redis将所有频道的订阅关系都保存在服务器状态的 pubsub_channels 字典,字典的键是某个被订阅的频道,而对应值则是一个链表,链表里记录了所有订阅这个频道的客户端。2)该频道暂无订阅者该频道在 pubsub_channels 字典中不存在订阅者链表,**首先在字典中为频道创建一个键**,并将这个键的值设置为空链表,然后将客户端添加到链表,成为链表的第一个元素。是长连接,但并不可靠,订阅的时候就代表建立了一个长连接,客户端的订阅者想要接收消息,肯定也会维护长连接。

weixin_44837153的博客 1838

SpringBoot2.x使用redis(Lettuce)和RedisTemplate

为什么使用Lettuce: Spring-data-redis提供了在spring应用中通过简单的配置访问redis服务,对reids底层开发包(Jedis, JRedis, and RJC)进行了高度封装 RedisTemplate提供了redis各种操作、异常处理及序列化,支持发布订阅,并对spring 3.1 cache进行了实现。 特征https://spring.io/projects/spring-data-redis 连接包是跨多个Redis驱动程序(Lettuce和Jedis.

qq_39038793的博客 3513
上一篇: Springboot xxx.properties配置文件配置list属性(2021-07-01)
下一篇: Springboot深度集成Redis
iFence
博客等级 码龄9年 8051粉丝 111原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值