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

用 Redis 的 List 存储库存队列,并通过 LPOP 原子性出队来保证并发安全案例

Jedis 作为 Redis 客户端库(简单易用),实现一个模拟秒杀库存扣减的案例。

Java 代码示例

import redis.clients.jedis.Jedis;public class RedisStockQueue {private static final String STOCK_KEY = "product:1001:stock";public static void main(String[] args) {// 连接 RedisJedis jedis = new Jedis("127.0.0.1", 6379);jedis.auth("your_password"); // 如果有密码// 初始化库存队列(假设库存 5 件)initStock(jedis, 5);// 模拟多个用户并发抢购for (int i = 1; i <= 10; i++) {String userId = "user_" + i;new Thread(() -> {String result = buyProduct(jedis, userId);System.out.println(userId + " -> " + result);}).start();}jedis.close();}/*** 初始化库存队列*/private static void initStock(Jedis jedis, int stockCount) {jedis.del(STOCK_KEY); // 清空旧库存for (int i = 1; i <= stockCount; i++) {jedis.rpush(STOCK_KEY, "stock_" + i);}System.out.println("库存初始化完成,数量:" + stockCount);}/*** 用户抢购商品*/private static String buyProduct(Jedis jedis, String userId) {// LPOP 原子性出队String stockItem = jedis.lpop(STOCK_KEY);if (stockItem != null) {return "抢购成功,获得库存:" + stockItem;} else {return "抢购失败,库存已空";}}
}

代码说明

  1. 库存初始化

    • 用 RPUSH 将库存数据压入 Redis List,例如 stock_1stock_2...
    • List 的顺序可以代表库存的唯一标识。
  2. 抢购逻辑

    • 用 LPOP 从队列头部取出一个库存项。
    • LPOP 是 Redis 的原子操作,即使多个线程同时执行,也不会出现超卖。
  3. 并发安全

    • Redis 的单线程模型保证了 LPOP 的原子性,不需要额外加锁。

运行效果示例

假设库存是 5 件,10 个用户同时抢购,输出可能是:

库存初始化完成,数量:5
user_1 -> 抢购成功,获得库存:stock_1
user_3 -> 抢购成功,获得库存:stock_2
user_5 -> 抢购成功,获得库存:stock_3
user_2 -> 抢购成功,获得库存:stock_4
user_4 -> 抢购成功,获得库存:stock_5
user_6 -> 抢购失败,库存已空
user_7 -> 抢购失败,库存已空
user_8 -> 抢购失败,库存已空
user_9 -> 抢购失败,库存已空
user_10 -> 抢购失败,库存已空

http://www.dtcms.com/a/552796.html

相关文章:

  • 定制开发开源AI智能名片S2B2C商城系统:新零售革命下云零售模式的创新实践
  • WebForms Validation
  • AI智能办公系统/企业OA办公/DeepSeek办公应用★pc/公众号/H5/App/小程序
  • 破局冷轧困境:RFID 赋能钢厂高效安全升级
  • 线程同步机制及三大不安全案例
  • Leetcode438. 找到字符串中所有字母异位词
  • 站内推广和站外推广的区别wordpress采集生成用户插件
  • 高清的网站制作iis7.0搭建网站
  • 使用 Docker Compose 部署 Spring Boot 应用:SmartAdmin 实战指南
  • 徐州建设企业网站网站建设与网站制作
  • 拆解ASP.NET MVC 视图模型:为 View 量身定制的 “数据小票“
  • 使用Docker搭建DOClever接口管理平台
  • 2025年10月个人工作生活总结
  • 金仓售后服务体系:构建高可用数据库运维新范式
  • 融入现代消费生活 浦发故宫文化主题卡的传承与创新
  • Android Studio Narwhal 4:创建空应用报错 —— AAPT2 process unexpectedly exit 的排查与解决
  • 九寨:在山水间触摸生活的诗意
  • C++(23):延长for循环临时变量生命期
  • Android Studio gradle下载失败报错
  • 贵州 做企业网站的流程58同城最新消息招聘
  • Kubernetes 双层 Nginx 容器环境下的 CORS 问题及解决方案(极端情况)
  • Kimi发布新一代注意力架构!线性注意力实现75% KV缓存减少、6倍解码速度提升
  • 做电子商务系统网站建设wordpress图片加水印
  • 电机参数标幺化与定点计算在整数MCU上的实现
  • Rust开发之错误处理与日志记录结合(log crate使用)
  • 2025年11月1日(星期六)骑行笔架山
  • opencv 学习: 03 初识 cv:Mat
  • 数据结构(c++版):邻接矩阵的实现
  • 在华为TaiShan 200系列服务器基于CentOS 7.6/7.7创建虚拟机
  • Parallels Desktop 26.1.1 for Mac 秋叶QiuChenly中文解锁直装版,最好用的macOS虚拟机