Redisson学习专栏(四):实战应用(分布式会话管理,延迟队列)

news2025/6/3 14:49:43

文章目录

  • 前言
  • 一、为什么需要分布式会话管理?
    • 1.1 使用 Redisson 实现 Session 共享
  • 二、订单超时未支付?用延迟队列精准处理
    • 2.1 RDelayedQueue 核心机制
    • 2.2 订单超时处理实战
  • 总结


前言

在现代分布式系统中,会话管理和延迟任务处理是两个核心需求。本文将深入探讨如何利用 Redisson 解决这两个问题,通过代码实战演示分布式会话共享和订单超时未支付的延迟任务处理。


一、为什么需要分布式会话管理?

在单机应用中,Session 存储在内存中。但在分布式环境下,请求可能被负载均衡到不同服务器,导致 Session 丢失。解决方案:将会话数据集中存储在 Redis 中,实现多服务共享。

1.1 使用 Redisson 实现 Session 共享

实现原理:
将会话数据存储在 Redis Hash 结构中,利用 Redisson 的分布式对象操作 API 实现透明化存取。
Maven 依赖:

<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson-spring-boot-starter</artifactId>
    <version>3.23.2</version>
</dependency>

配置 Redisson 客户端:

@Configuration
public class RedissonConfig {
    
    @Bean
    public RedissonClient redissonClient() {
        Config config = new Config();
        config.useSingleServer()
              .setAddress("redis://127.0.0.1:6379");
        return Redisson.create(config);
    }
}

会话管理服务:

@Service
public class SessionService {

    @Autowired
    private RedissonClient redissonClient;

    // 存储会话数据
    public void putSession(String sessionId, String key, Object value) {
        RMap<String, Object> sessionMap = redissonClient.getMap("session:" + sessionId);
        sessionMap.put(key, value);
        // 设置会话过期时间(30分钟)
        sessionMap.expire(30, TimeUnit.MINUTES);
    }

    // 获取会话数据
    public Object getSession(String sessionId, String key) {
        RMap<String, Object> sessionMap = redissonClient.getMap("session:" + sessionId);
        return sessionMap.get(key);
    }

    // 销毁会话
    public void invalidateSession(String sessionId) {
        redissonClient.getMap("session:" + sessionId).delete();
    }
}

Controller 中使用示例:

@RestController
public class AuthController {

    @Autowired
    private SessionService sessionService;

    @PostMapping("/login")
    public String login(@RequestBody User user, HttpServletRequest request) {
        // 验证用户逻辑...
        String sessionId = request.getSession().getId();
        sessionService.putSession(sessionId, "user", user);
        return "Login success! Session: " + sessionId;
    }

    @GetMapping("/profile")
    public User profile(HttpServletRequest request) {
        String sessionId = request.getSession().getId();
        return (User) sessionService.getSession(sessionId, "user");
    }
}

二、订单超时未支付?用延迟队列精准处理

电商场景中,订单创建后需在 30 分钟内支付,否则自动关闭。传统轮询数据库方案效率低下,Redisson 的 RDelayedQueue 是完美解决方案

2.1 RDelayedQueue 核心机制

RDelayedQueue 核心机制

2.2 订单超时处理实战

订单服务实现:

@Service
public class OrderService {

    @Autowired
    private RedissonClient redissonClient;
    
    // 创建订单并加入延迟队列
    public void createOrder(Order order) {
        // 1. 保存订单到数据库(状态:待支付)
        orderRepository.save(order);
        
        // 2. 加入延迟队列(30分钟超时)
        RBlockingQueue<String> blockingQueue = redissonClient.getBlockingQueue("ORDER_EXPIRE_QUEUE");
        RDelayedQueue<String> delayedQueue = redissonClient.getDelayedQueue(blockingQueue);
        delayedQueue.offer(order.getId(), 30, TimeUnit.MINUTES);
    }
    
    // 监听订单超时队列
    @PostConstruct
    public void startExpireListener() {
        new Thread(() -> {
            RBlockingQueue<String> blockingQueue = redissonClient.getBlockingQueue("ORDER_EXPIRE_QUEUE");
            while (true) {
                try {
                    String orderId = blockingQueue.take(); // 阻塞获取到期订单
                    handleExpiredOrder(orderId);
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                    break;
                }
            }
        }).start();
    }
    
    // 处理过期订单
    private void handleExpiredOrder(String orderId) {
        Order order = orderRepository.findById(orderId).orElse(null);
        if (order != null && "UNPAID".equals(order.getStatus())) {
            order.setStatus("CANCELED");
            order.setCancelReason("支付超时");
            orderRepository.save(order);
            System.out.println("订单超时关闭: " + orderId);
            
            // 释放库存等后续操作...
        }
    }
}

支付回调逻辑:

public void onPaymentSuccess(String orderId) {
    // 1. 更新订单状态为已支付
    Order order = orderRepository.findById(orderId).get();
    order.setStatus("PAID");
    orderRepository.save(order);
    
    // 2. 从延迟队列中移除(避免重复处理)
    RDelayedQueue<String> delayedQueue = redissonClient.getDelayedQueue(
        redissonClient.getBlockingQueue("ORDER_EXPIRE_QUEUE")
    );
    delayedQueue.remove(orderId); // 关键:支付成功则移除任务
}

总结

通过本文实战,我们实现了:

  1. 分布式会话管理:利用 RMap 存储会话数据,解决集群环境 Session 共享问题
  2. 精准延迟任务:基于 RDelayedQueue 实现订单超时自动关闭,替代低效轮询方案

Redisson 的强大之处在于将复杂的分布式问题抽象为简单的 API 调用。这两个方案可扩展到更多场景:

  • 会话管理 → 分布式权限系统
  • 延迟队列 → 定时通知、预约系统

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2395018.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java程序从服务器端到Lambda函数的迁移与优化

source&#xff1a;https://www.jfokus.se/jfokus24-preso/From-Serverful-to-Serverless-Java.pdf 从传统的服务器端Java应用&#xff0c;到如今的无服务器架构。这不仅仅是技术名词的改变&#xff0c;更是开发模式和运维理念的一次深刻变革。先快速回顾一下我们熟悉的“服务…

使用yocto搭建qemuarm64环境

环境 yocto下载 # 源码下载 git clone git://git.yoctoproject.org/poky git reset --hard b223b6d533a6d617134c1c5bec8ed31657dd1268 构建 # 编译镜像 export MACHINE"qemuarm64" . oe-init-build-env bitbake core-image-full-cmdline 运行 # 跑虚拟机 export …

Linux系统下安装配置 Nginx

Windows Nginx https://nginx.org/en/download.htmlLinux Nginx https://nginx.org/download/nginx-1.24.0.tar.gz解压 tar -zxvf tar -zxvf nginx-1.18.0.tar.gz #解压安装依赖&#xff08;如未安装&#xff09; yum groupinstall "Development Tools" -y yum…

LiveGBS作为下级平台GB28181国标级联2016|2022对接海康大华宇视华为政务公安内网等GB28181国标平台查看级联状态及会话

LiveGBS作为下级平台GB28181国标级联2016|2022对接海康大华宇视华为政务公安内网等GB28181国标平台查看级联状态及会话 1、GB/T28181级联概述2、搭建GB28181国标流媒体平台3、获取上级平台接入信息3.1、向下级提供信息3.2、上级国标平台添加下级域3.3、接入LiveGBS示例 4、配置…

Gartner《2025 年软件工程规划指南》报告学习心得

一、引言 软件工程领域正面临着前所未有的变革与挑战。随着生成式人工智能(GenAI)等新兴技术的涌现、市场环境的剧烈动荡以及企业对软件工程效能的更高追求,软件工程师们必须不断适应和拥抱变化,以提升自身竞争力并推动业务发展。Gartner 公司发布的《2025 年软件工程规划…

Java Class类文件结构

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…

quasar electron mode如何打包无边框桌面应用程序

预览 开源项目Tokei Kun 一款简洁的周年纪念app&#xff0c;现已发布APK&#xff08;安卓&#xff09;和 EXE&#xff08;Windows&#xff09; 项目仓库地址&#xff1a;Github Repo 应用下载链接&#xff1a;Github Releases Preparation for Electron quasar dev -m elect…

【HW系列】—Windows日志与Linux日志分析

文章目录 一、Windows日志1. Windows事件日志2. 核心日志类型3. 事件日志分析实战详细分析步骤 二、Linux日志1. 常见日志文件2. 关键日志解析3. 登录爆破检测方法日志分析核心要点 一、Windows日志 1. Windows事件日志 介绍&#xff1a;记录系统、应用程序及安全事件&#x…

VIN码识别解析接口如何用C#进行调用?

一、什么是VIN码识别解析接口&#xff1f; VIN码不仅是车辆的“身份证”&#xff0c;更是连接制造、销售、维修、保险、金融等多个环节的数字纽带。而VIN码查询API&#xff0c;正是打通这一链条的关键工具。 无论是汽车电商平台、二手车商、维修厂&#xff0c;还是保险公司、金…

动态规划之网格图模型(一)

文章目录 动态规划之网格图模型&#xff08;一&#xff09;LeetCode 64. 最小路径和思路Golang 代码 LeetCode 62. 不同路径思路Golang 代码 LeetCode 63. 不同路径 II思路Golang 代码 LeetCode 120. 三角形最小路径和思路Golang 代码 LeetCode 3393. 统计异或值为给定值的路径…

PCB设计实践(三十)地平面完整性

在高速数字电路和混合信号系统设计中&#xff0c;地平面完整性是决定PCB性能的核心要素之一。本文将从电磁场理论、信号完整性、电源分配系统等多个维度深入剖析地平面设计的关键要点&#xff0c;并提出系统性解决方案。 一、地平面完整性的电磁理论基础 电流回流路径分析 在PC…

使用ray扩展python应用之流式处理应用

流式处理就是数据一来&#xff0c;咱们就得赶紧处理&#xff0c;不能攒批再算。这里的实时不是指瞬间完成&#xff0c;而是要在数据产生的那一刻&#xff0c;或者非常接近那个时间点&#xff0c;就做出响应。这种处理方式&#xff0c;我们称之为流式处理。 流式处理的应用场景…

IP证书的作用与申请全解析:从安全验证到部署实践

在网络安全领域&#xff0c;IP证书&#xff08;IP SSL证书&#xff09;作为传统域名SSL证书的补充方案&#xff0c;专为公网IP地址提供HTTPS加密与身份验证服务。本文将从技术原理、应用场景、申请流程及部署要点四个维度&#xff0c;系统解析IP证书的核心价值与操作指南。 一…

【Linux系列】Linux/Unix 系统中的 CPU 使用率

博客目录 多核处理器时代的 CPU 使用率计算为什么要这样设计&#xff1f; 解读实际案例&#xff1a;268.76%的 CPU 使用率性能分析的意义 相关工具与监控实践1. top 命令2. htop 命令3. mpstat 命令4. sar 命令 实际应用场景容量规划性能调优故障诊断 深入理解&#xff1a;CPU …

C++语法系列之模板进阶

前言 本次会介绍一下非类型模板参数、模板的特化(特例化)和模板的可变参数&#xff0c;不是最开始学的模板 一、非类型模板参数 字面意思,比如&#xff1a; template<size_t N 10> 或者 template<class T,size_t N 10>比如&#xff1a;静态栈就可以用到&#…

基于图神经网络的自然语言处理:融合LangGraph与大型概念模型的情感分析实践

在企业数字化转型进程中&#xff0c;非结构化文本数据的处理与分析已成为核心技术挑战。传统自然语言处理方法在处理客户反馈、社交媒体内容和内部文档等复杂数据集时&#xff0c;往往难以有效捕获文本间的深层语义关联和结构化关系。大型概念模型&#xff08;Large Concept Mo…

R 语言科研绘图 --- 热力图-汇总

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…

解决访问网站提示“405 很抱歉,由于您访问的URL有可能对网站造成安全威胁,您的访问被阻断”问题

一、问题描述 本来前几天都可以正常访问的网站&#xff0c;但是今天当我们访问网站的时候会显示“405 很抱歉&#xff0c;由于您访问的URL有可能对网站造成安全威胁&#xff0c;您的访问被阻断。您的请求ID是&#xff1a;XXXX”&#xff0c;而不能正常的访问网站&#xff0c;如…

机器学习中的关键术语及其含义

神经元及神经网络 机器学习中的神经网络是一种模仿生物神经网络的结构和功能的数学模型或计算模型。它是指按照一定的规则将多个神经元连接起来的网络。 神经网络是一种运算模型&#xff0c;由大量的节点&#xff08;或称神经元&#xff09;之间相互联接构成。每个节点代表一…

网络编程1_网络编程引入

为什么需要网络编程&#xff1f; 用户再在浏览器中&#xff0c;打开在线视频资源等等&#xff0c;实质上说通过网络&#xff0c;获取到从网络上传输过来的一个资源。 与打开本地的文件类似&#xff0c;只是这个文件的来源是网络。相比本地资源来说&#xff0c;网络提供了更为…