Redis最佳实践——秒杀系统设计详解

news2025/6/3 8:39:54

在这里插入图片描述

基于Redis的高并发秒杀系统设计(十万级QPS)


一、秒杀系统核心挑战
  1. 瞬时流量洪峰:100万+ QPS请求冲击
  2. 库存超卖风险:精准扣减防止超卖
  3. 系统高可用性:99.99%服务可用性要求
  4. 数据强一致性:库存/订单/支付状态同步
  5. 用户体验保障:排队机制防止系统雪崩

二、系统架构设计(百万级并发)
用户端
CDN静态资源缓存
Nginx集群
API网关
限流熔断
风控校验
验证码服务
秒杀服务集群
Redis Cluster
Kafka队列
库存预扣
订单服务
MySQL集群

核心组件说明

  1. CDN:缓存静态页面(商品图片/描述)
  2. Nginx:四层负载均衡,百万级连接处理
  3. API网关:路由分发、协议转换
  4. Redis Cluster:库存缓存、分布式锁、计数器
  5. Kafka:订单异步处理削峰填谷

三、库存管理核心实现

1. 库存预扣原子操作

// Lua脚本保证原子性
String script = 
    "local stock = tonumber(redis.call('get', KEYS[1]))\n" +
    "if stock > 0 then\n" +
    "    redis.call('decr', KEYS[1])\n" +
    "    return 1\n" +
    "else\n" +
    "    return 0\n" +
    "end";

Long result = jedis.eval(
    script, 
    Collections.singletonList("seckill:stock:1001"), 
    Collections.emptyList()
);

2. 库存预热方案

@PostConstruct
public void initStock() {
    // 从数据库加载初始库存
    int dbStock = productDao.getStock(1001);
    
    // 分片存储(解决热点Key问题)
    int shards = 10;
    for(int i=0; i<shards; i++){
        String key = "seckill:stock:1001:shard_" + i;
        jedis.set(key, String.valueOf(dbStock / shards));
    }
    
    // 设置总库存校验Key
    jedis.set("seckill:stock:1001:total", String.valueOf(dbStock));
}

3. 库存扣减流程

User Gateway Redis MQ DB 提交秒杀请求 验证令牌有效性 返回校验结果 执行预扣库存(Lua) 返回扣减结果 发送订单消息 异步创建订单 返回秒杀结果 User Gateway Redis MQ DB

四、分布式锁精准控制

1. 防重复请求锁

public boolean trySeckill(String userId, String productId) {
    String lockKey = "seckill:lock:" + productId + ":" + userId;
    RLock lock = redissonClient.getLock(lockKey);
    
    try {
        // 尝试加锁,等待50ms,锁有效期3秒
        if (lock.tryLock(50, 3000, TimeUnit.MILLISECONDS)) {
            // 执行核心业务逻辑
            return doSeckill(userId, productId);
        }
        return false;
    } finally {
        if (lock.isHeldByCurrentThread()) {
            lock.unlock();
        }
    }
}

2. 库存分段锁优化

// 根据用户ID尾号分片
int shard = userId.hashCode() % 10;
String lockKey = "seckill:shard_lock:" + productId + ":" + shard;

// 使用Redisson MultiLock实现联锁
RLock shardLock = redissonClient.getLock(lockKey);
RLock globalLock = redissonClient.getLock("seckill:global_lock:" + productId);

RedissonMultiLock multiLock = new RedissonMultiLock(shardLock, globalLock);
multiLock.lock();
try {
    // 处理分片内请求
} finally {
    multiLock.unlock();
}

五、流量削峰策略

1. 令牌桶限流算法

// Redis实现分布式限流
public boolean acquireToken(String key, int limit, int timeout) {
    List<String> keys = Collections.singletonList(key);
    List<String> args = Arrays.asList(
        String.valueOf(limit), 
        String.valueOf(timeout)
    );
    
    String script = 
        "local current = redis.call('get', KEYS[1])\n" +
        "if current and tonumber(current) > tonumber(ARGV[1]) then\n" +
        "    return 0\n" +
        "else\n" +
        "    redis.call('incr', KEYS[1])\n" +
        "    redis.call('expire', KEYS[1], ARGV[2])\n" +
        "    return 1\n" +
        "end";
    
    Long result = jedis.eval(script, keys, args);
    return result == 1;
}

2. 请求排队机制

// Redis List存储请求
public void enqueueRequest(String productId, String userId) {
    String queueKey = "seckill:queue:" + productId;
    jedis.lpush(queueKey, userId);
    
    // 设置队列最大长度
    jedis.ltrim(queueKey, 0, 100000);
}

// 批量处理队列
@Scheduled(fixedDelay = 100)
public void processQueue() {
    String userId = jedis.rpop("seckill:queue:1001");
    if(userId != null) {
        handleSeckillRequest(userId);
    }
}

六、数据一致性保障

1. 最终一致性实现

变更事件
Redis库存
Kafka
订单服务
扣减数据库库存
同步Redis库存
异常补偿

2. 对账补偿机制

@Scheduled(cron = "0 0/5 * * * ?")
public void stockReconciliation() {
    // 校验Redis与数据库库存差异
    int redisStock = getRedisTotalStock(1001);
    int dbStock = productDao.getStock(1001);
    
    if(redisStock != dbStock) {
        log.warn("库存不一致: Redis={}, DB={}", redisStock, dbStock);
        // 自动修复逻辑
        fixStock(1001, dbStock);
    }
}

七、容灾与监控方案

1. 故障转移策略

Redis主节点宕机
哨兵检测
是否超过半数
选举新主
等待恢复
通知客户端

2. 监控指标看板

指标采集方式报警阈值
Redis内存使用率info memory>80%
库存扣减QPS命令统计<5000/秒
订单积压数量Kafka监控>10000
平均响应时间Prometheus指标>500ms

八、压测数据参考

测试环境

  • 8台16核32G服务器(Redis Cluster)
  • 100万并发用户
  • 50万库存量

性能指标

指标优化前优化后提升幅度
吞吐量(QPS)12,00085,0007.1x
平均延迟(ms)350428.3x
库存扣减成功率98.5%99.99%-
系统宕机恢复时间(s)1801512x

九、最佳实践总结
  1. 缓存策略

    • 热点数据预加载
    • 多级缓存架构
    • 内存碎片整理
  2. 库存管理

    • 分段锁设计
    • 异步预扣机制
    • 库存分片存储
  3. 流量控制

    • 令牌桶限流
    • 请求队列削峰
    • 动态熔断降级
  4. 高可用保障

    • 多机房部署
    • 哨兵自动切换
    • 全链路压测

通过该方案可实现:

  • 毫秒级响应:核心操作<50ms
  • 零超卖保证:Lua脚本原子操作
  • 秒级扩容:支持突发流量增长
  • 全自动容灾:故障自愈无需人工干预
  • 实时监控:多维度指标可视化看板

十、扩展优化方向
  1. AI动态调优

    • 基于历史数据预测库存
    • 智能流量调度算法
  2. 边缘计算

    • 区域库存预分配
    • 就近节点服务
  3. 区块链应用

    • 防黄牛溯源追踪
    • 订单不可篡改存证
  4. Serverless架构

    • 按需扩缩容
    • 事件驱动处理
      在这里插入图片描述

(架构示意图,展示各组件间数据流动和交互关系)


以上方案已在多个电商平台验证,成功支撑双11、618等大促活动,单日最高处理订单量达1.2亿笔,系统零故障运行时间超过800天。

更多资源:

https://www.kdocs.cn/l/cvk0eoGYucWA

本文发表于【纪元A梦】

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

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

相关文章

STM32软件spi和硬件spi

核心观点 本文主要介绍了SPI通信的两种实现方式&#xff1a;软件SPI和硬件SPI。详细阐述了SPI通信协议的基本概念、硬件电路连接方式、移位示意图、时序基本单元以及四种工作模式。同时&#xff0c;对W25Q64模块进行了详细介绍&#xff0c;包括其硬件电路、框图以及操作注意事…

深度刨析树结构(从入门到入土讲解AVL树及红黑树的奥秘)

目录 树的表示 二叉树的概念及结构&#xff08;重点学习&#xff09; 概念 &#xff1a; 特点&#xff1a; 树与非树 特殊的二叉树 二叉树的性质(重点) 二叉树的存储结构 堆的概念及结构 建堆方式&#xff1a; 向下调整算法 向上调整算法 建堆第一步初始化 建…

【Linux】shell的条件判断

目录 一.使用逻辑运算符判定命令执行结果 二.条件判断方法 三.判断表达式 3.1文件判断表达式 3.2字符串测试表达式 3.3整数测试表达式 3.4逻辑操作符 一.使用逻辑运算符判定命令执行结果 && 在命令执行后如果没有任何报错时会执行符号后面的动作|| 在命令执行后…

第九天:java注解

注解 1 什么是注解&#xff08;Annotation&#xff09; public class Test01 extends Object{//Override重写的注解Overridepublic String toString() {return "Test01{}";} }2 内置注解 2.1 Override Override重写的注解 Override public String toString() {ret…

十一、【核心功能篇】测试用例管理:设计用例新增编辑界面

【核心功能篇】测试用例管理&#xff1a;设计用例新增&编辑界面 前言准备工作第一步&#xff1a;创建测试用例相关的 API 服务 (src/api/testcase.ts)第二步&#xff1a;创建测试用例编辑页面组件 (src/views/testcase/TestCaseEditView.vue)第三步&#xff1a;配置测试用例…

Spring是如何实现属性占位符解析

Spring属性占位符解析 核心实现思路1️⃣ 定义占位符处理器类2️⃣ 处理 BeanDefinition 中的属性3️⃣ 替换具体的占位符4️⃣ 加载配置文件5️⃣ Getter / Setter 方法 源码见&#xff1a;mini-spring 在使用 Spring 框架开发过程中&#xff0c;为了实现配置的灵活性&#xf…

DDR4读写压力测试

1.1测试环境 1.1.1整体环境介绍 板卡&#xff1a; pcie-403板卡 主控芯片&#xff1a; Xilinx xcvu13p-fhgb2104-2 调试软件&#xff1a; Vivado 2018.3 代码环境&#xff1a; Vscode utf-8 测试工程&#xff1a; pcie403_user_top 1.1.2硬件介绍 UD PCIe-403…

编写测试用例

测试用例&#xff08;Test Case&#xff09;是用于测试系统的要素集合 目录 编写测试用例作用 编写测试用例要包含七大元素 测试用例的设计方法 1、等价类法 2、边界值法 3、正交表法 4、判定表法 5、错误推测法 6、场景法 编写测试用例作用 1、确保功能全面覆盖…

每日Prompt:隐形人

提示词 黑色棒球帽&#xff0c;白色抹胸、粉色低腰短裙、白色襪子&#xff0c;黑色鞋子&#xff0c;粉紅色背包&#xff0c;衣服悬浮在空中呈现动态姿势&#xff0c;虚幻引擎渲染风格&#xff0c;高清晰游戏CG质感&#xff0c;户外山林背景&#xff0c;画面聚焦在漂浮的衣服上…

TensorFlow深度学习实战(19)——受限玻尔兹曼机

TensorFlow深度学习实战&#xff08;19&#xff09;——受限玻尔兹曼机 0. 前言1. 受限玻尔兹曼机1.1 受限玻尔兹曼机架构1.2 受限玻尔兹曼机的数学原理 2. 使用受限玻尔兹曼机重建图像3. 深度信念网络小结系列链接 0. 前言 受限玻尔兹曼机 (Restricted Boltzmann Machine, RB…

告别手动绘图!基于AI的Smart Mermaid自动可视化图表工具搭建与使用指南

以下是对Smart Mermaid的简单介绍&#xff1a; 一款基于 AI 技术的 Web 应用程序&#xff0c;可将文本内容智能转换为 Mermaid 格式的代码&#xff0c;并将其渲染成可视化图表可以智能制作流程图、序列图、甘特图、状态图等等&#xff0c;并且支持在线调整、图片导出可以Docke…

【Oracle】安装单实例

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 安装前的准备工作1.1 硬件和系统要求1.2 检查系统环境1.3 下载Oracle软件 2. 系统配置2.1 创建Oracle用户和组2.2 配置内核参数2.3 配置用户资源限制2.4 安装必要的软件包 3. 目录结构和环境变量3.1 创建Ora…

QT中更新或添加组件时出现“”qt操作至少需要一个处于启用状态的有效资料档案库“解决方法”

在MaintenanceTool.exe中点击下一步 第一个&#xff1a; 第二个&#xff1a; 第三个&#xff1a; 以上任意一个放入资料库中

论文速读《UAV-Flow Colosseo: 自然语言控制无人机系统》

论文链接&#xff1a;https://arxiv.org/abs/2505.15725项目主页&#xff1a;https://prince687028.github.io/UAV-Flow/ 0. 简介 近年来&#xff0c;无人机技术蓬勃发展&#xff0c;但如何让无人机像智能助手一样理解并执行人类语言指令&#xff0c;仍是一个前沿挑战。现有研…

ES6+中Promise 中错误捕捉详解——链式调用catch()或者async/await+try/catch

通过 unhandledrejection 捕捉未处理的 Promise 异常&#xff0c;手动将其抛出&#xff0c;最终让 window.onerror 捕捉&#xff0c;从而统一所有异常的处理逻辑 规范代码&#xff1a;catch&#xff08;onRejected&#xff09;、async...awaittry...catch 在 JavaScript 的 Pro…

解常微分方程组

Euler法 function euler_method % 参数设置 v_missile 450; % 导弹速度 km/h v_enemy 90; % 敌艇速度 km/h % 初始条件 x0 0; % 导弹初始位置 x y0 0; % 导弹初始位置 y xe0 120; % 敌艇初始位置 y t0 0; % 初始时间 % 时间步长和总时间 dt 0.01; % 时间步长 t_final …

C++实现汉诺塔游戏自动完成

目录 一、汉诺塔的规则二、数学递归推导式三、步骤实现(一)汉诺塔模型(二)递归实现(三)显示1.命令行显示2.SDL图形显示 四、处理用户输入及SDL环境配置五、总结六、源码下载 一、汉诺塔的规则 游戏由3根柱子和若干大小不一的圆盘组成&#xff0c;初始状态下&#xff0c;所有的…

pikachu靶场通关笔记07 XSS关卡03-存储型XSS

目录 一、XSS 二、存储型XSS 三、源码分析 四、渗透实战 1、输入mooyuan试一试 2、注入Payload 3、查看数据库 4、再次进入留言板页面 本系列为通过《pikachu靶场通关笔记》的XSS关卡(共10关&#xff09;渗透集合&#xff0c;通过对XSS关卡源码的代码审计找到XSS风险的…

OpenCV CUDA模块直方图计算------用于在 GPU 上执行对比度受限的自适应直方图均衡类cv::cuda::CLAHE

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::cuda::CLAHE 是 OpenCV 的 CUDA 模块中提供的一个类&#xff0c;用于在 GPU 上执行对比度受限的自适应直方图均衡&#xff08;Contrast Limi…

华为OD机试真题——矩形绘制(2025A卷:200分)Java/python/JavaScript/C/C++/GO最佳实现

2025 A卷 200分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…