当前位置: 首页 > news >正文

Redis 非缓存核心场景及实例说明

Redis 非缓存核心场景及实例说明

一、分布式锁

分布式锁用于解决分布式系统中多节点竞争同一资源的问题,确保操作原子性。Redis 实现分布式锁的核心思路是利用键的唯一性和原子命令,通常基于 Redisson 框架简化实现(底层依赖 Redis 命令)。

实例:电商秒杀场景中防止库存超卖。假设某商品库存为 100 件,多台应用服务器同时处理用户抢购请求,需通过分布式锁保证“查库存-扣库存”操作的原子性。

  1. 应用节点通过 Redisson 获取锁:RLock lock = redisson.getLock("seckill:lock:goodsId123"),底层会执行 SET seckill:lock:goodsId123 value NX PX 30000(NX 表示键不存在时才创建,PX 表示设置 30 秒过期时间,避免死锁)。
  2. 获取锁成功后,查询 Redis 中的商品库存:GET goods:stock:123,若库存 > 0,则执行扣库存操作:DECR goods:stock:123
  3. 操作完成后释放锁:lock.unlock(),底层会删除锁键。若节点意外宕机,锁键会因过期时间自动删除,避免长期占用锁资源。

二、限流

限流用于控制单位时间内接口的请求次数,防止系统因高并发过载。Redis 通常结合 Lua 脚本或 Redisson 实现,常见算法有令牌桶、漏桶等,Redisson 的 RRateLimiter 封装了限流逻辑,底层依赖 Redis 数据结构和 Lua 脚本保证原子性。

实例:API 接口限流,限制单个用户每分钟最多发起 60 次请求(即每秒 1 次)。

  1. 使用 Redisson 创建限流器:RRateLimiter limiter = redisson.getRateLimiter("api:limiter:userId456"),设置限流规则:limiter.trySetRate(RateType.PER_USER, 60, 1, RateIntervalUnit.MINUTES)(表示每个用户每分钟最多 60 次请求)。
  2. 每次用户发起请求前,调用 boolean allowed = limiter.tryAcquire(1)(尝试获取 1 个“令牌”)。若返回 true,则允许请求;若返回 false,则拒绝请求并返回“请求过于频繁”。
  3. 底层通过 Redis 的 zset 存储请求时间戳,结合 Lua 脚本计算单位时间内的请求次数,确保限流逻辑的原子性和准确性,避免多节点计数偏差。

三、消息队列

Redis 可通过 List、Pub/Sub、Stream 三种方式实现消息队列,其中 Stream 是 Redis 5.0 新增的专门用于消息队列的数据结构,支持持久化、ACK 机制、消费组等特性,解决了 List 和 Pub/Sub 的消息丢失、堆积问题。

实例:订单状态变更通知,当订单从“待支付”变为“已支付”时,需通知库存系统扣减库存、通知物流系统创建物流单。

  1. 生产者(订单系统)向 Stream 发送消息:XADD order:status:stream * orderId 789 status PAID* 表示由 Redis 生成唯一消息 ID,包含时间戳和序列号;orderIdstatus 是消息内容)。
  2. 消费者组(库存系统、物流系统)创建并订阅 Stream:先创建消费组 XGROUP CREATE order:status:stream group:stock 00 表示从最早的消息开始消费),再通过 XREADGROUP GROUP group:stock consumer:stock 0 COUNT 1 BLOCK 0 STREAMS order:status:stream > 阻塞读取消息(> 表示读取未被消费的消息)。
  3. 消费者处理完消息后,发送 ACK 确认:XACK order:status:stream group:stock 消息ID,标记消息已处理,避免重复消费。若消费者宕机,未 ACK 的消息会留在“挂起队列”,其他消费者可通过 XPENDING 查询并重新处理,保证消息不丢失。

四、延时队列

延时队列用于处理“延迟执行”的任务,如订单超时未支付自动取消、红包 24 小时未领取自动退还。Redis 实现延时队列的主流方式是 Redisson 的 RDelayedQueue,底层基于 zset 存储任务(以“任务执行时间戳”为分数),结合定时任务扫描到期任务。

实例:订单超时未支付自动取消,设置订单创建后 30 分钟未支付则取消。

  1. 创建 Redisson 客户端并初始化延时队列:RBlockingQueue<String> blockingQueue = redisson.getBlockingQueue("order:delay:queue"); RDelayedQueue<String> delayedQueue = redisson.getDelayedQueue(blockingQueue);
  2. 订单创建时,将订单 ID 放入延时队列并设置延迟时间:delayedQueue.offer("orderId789", 30, TimeUnit.MINUTES)(表示 30 分钟后该订单 ID 会被放入阻塞队列)。
  3. 消费者(订单处理系统)启动线程,通过 String orderId = blockingQueue.take() 阻塞获取到期的订单 ID,然后执行取消逻辑(如更新订单状态为“已取消”、恢复商品库存)。
  4. 底层通过 zset 存储订单 ID 和到期时间戳,Redisson 后台线程定期扫描 zset,将分数(到期时间戳)小于当前时间的任务移动到阻塞队列,实现延时触发。同时,Redis 持久化机制(RDB/AOF)确保任务在 Redis 宕机后不丢失,重启后可继续执行。

文章转载自:

http://B7D6HzHQ.ywnjp.cn
http://kCBXvenm.ywnjp.cn
http://9ynV2VsK.ywnjp.cn
http://CnF6IEpg.ywnjp.cn
http://NJD77veP.ywnjp.cn
http://mJHZBeF4.ywnjp.cn
http://aYZNaVJQ.ywnjp.cn
http://LojY0ySs.ywnjp.cn
http://QgrYmBdR.ywnjp.cn
http://XtQI7Mll.ywnjp.cn
http://X0Ak0UpK.ywnjp.cn
http://VNdBwUyD.ywnjp.cn
http://VKxBxNtD.ywnjp.cn
http://y36TzeTD.ywnjp.cn
http://hpoXU0cI.ywnjp.cn
http://CTH8Oa20.ywnjp.cn
http://x7II7qp8.ywnjp.cn
http://rVstmTuH.ywnjp.cn
http://Zo2ZBHWW.ywnjp.cn
http://DHIMQRre.ywnjp.cn
http://OUA2vQ1k.ywnjp.cn
http://dRgtdXOH.ywnjp.cn
http://BsMQcbcw.ywnjp.cn
http://fBq2iYU0.ywnjp.cn
http://LgcDHP1B.ywnjp.cn
http://qSeugSAm.ywnjp.cn
http://scsqvowP.ywnjp.cn
http://7MrwWFO2.ywnjp.cn
http://BENqmO7B.ywnjp.cn
http://pamTX4Cn.ywnjp.cn
http://www.dtcms.com/a/372858.html

相关文章:

  • 食品罐头(铝罐)表面缺陷数据集:8k+图像,4类,yolo标注
  • 云计算系统安全
  • 微信群机器人-备份文件发送通知
  • Linux-条件变量
  • 6.python——字符串
  • 懒汉式——LazyMan(任务队列应用)
  • Nginx 实战系列(四)—— Nginx反向代理与负载均衡实战指南
  • Nginx 反向代理 + Tomcat 集群:负载均衡配置步骤与核心原理
  • 【Linux】匿名管道和进程池
  • PWA:打造媲美 Native Apps 的 Web 应用体验
  • # 小程序 Web 登录流程完整解析
  • 2025中国AI HR市场深度洞察:趋势、厂商与未来展望
  • 并发编程的守护者:信号量与日志策略模式解析
  • Flink Task线程处理模型:Mailbox
  • ActiveMQ classic ,artemis ,artemis console ,nms clients,cms client详解
  • 【论文阅读】Far3D: Expanding the Horizon for Surround-view 3D Object Detection
  • Three.js使用outlinePass描边后,描边颜色和背景叠加变淡
  • GPT系列--类GPT2源码剖析
  • 反编译分析C#闭包
  • DTO与POJO:核心差异与最佳实践
  • #C语言——刷题攻略:牛客编程入门训练(九):攻克 分支控制(三)、循环控制(一),轻松拿捏!
  • Android 中 自定义 RecyclerView 控件限制显示高度
  • Codesy中的UDP发送信息
  • Hadoop进程:深入理解分布式计算引擎的核心机制
  • SQL Server死锁排查实战指南
  • 自学嵌入式第三十八天:数据库
  • 【开题答辩全过程】以 基于springboot的酒店管理系统设计与实现为例,包含答辩的问题和答案
  • SpringBoot控制层接收参数处理、Logback日志入门和使用
  • Python快速入门专业版(十三):Python变量进阶:全局变量与局部变量(含global关键字用法)
  • 深度学习(二):神经元与神经网络