Redis事务与锁机制在并发秒杀场景的深入剖析

十. Redis 事务与 “锁机制”——并发秒杀处理的详细阐述

目录

  • 十. Redis 事务与 “锁机制”——并发秒杀处理的详细阐述
  • 1. Redis 事务的定义
  • 2. Redis 事务的三大特性
  • 3. Redis 事务相关指令 Multi、Exec、discard 及 “watch & unwatch”
    • 3.1 快速入门(演示 Redis 事务控制)
    • 3.2 注意事项与细节
  • 4. Redis 事务冲突及解决办法(悲观锁,乐观锁) watch & unwatch
    • 4.1 “悲观锁” 解决
    • 4.2 “乐观锁” 解决
    • 4.3 watch & unwatch
  • 5. 案例演示:火车票-抢票(解决超卖,库存遗留)问题
    • 5.1 案例思路分析:
    • 5.2 完成基本购票流程,暂不考虑事务与并发问题
    • 5.3 抢票并发模拟,出现超卖问题
    • 5.4 Redis 连接池技术
    • 5.5 利用 Redis 的事务机制,解决超卖问题(使用 watch,multi )
    • 5.6 抢票并发模拟,分析库存遗留问题
    • 5.7 运用 LUA 脚本(解决超卖,和库存遗留问题)
  • 6. 总结:

1. Redis 事务的定义

  1. Redis事务是一种独立的隔离性操作:事务内的所有命令会被依次序列化,并按顺序执行。
  2. 在事务执行过程中,不会被其他客户端发送的命令请求打断。
  3. Redis事务的主要作用是将多个命令串联起来,防止其他命令插队执行。

2. Redis 事务的三大特性

  1. 独立的隔离操作

    1. Redis事务是独立的隔离性操作,其中所有命令会被序列化并按顺序执行。
    2. 在事务执行过程中,不会被其他客户端发送的命令请求打断。
  2. 无隔离级别概念

    队列中的命令在未提交前不会实际执行。

  3. 不保证原子性

    事务执行时,若有指令失败,其他指令仍会继续执行,不存在回滚机制。

    MySQL事务支持回滚,而Redis事务不支持回滚。

3. Redis 事务相关指令 Multi、Exec、discard 及 “watch & unwatch”

3.1 快速入门(演示 Redis 事务控制)

127.0.0.1:6379> multi
127.0.0.1:6379(TX)> set k1 v1
QUEUED
127.0.0.1:6379(TX)> set k2 v2
QUEUED
127.0.0.1:6379(TX)> set k3 v3
QUEUED
127.0.0.1:6379(TX)> exec

3.2 注意事项与细节

  1. 组队阶段可通过 discard 放弃组队,需在 [TX] 队列且未执行 exec 命令前有效。
  2. 若组队阶段出现命令输入等错误,会导致 exec 失败,事务所有指令不执行。
  3. 组队成功但指令执行异常时,exec 提交会出现部分成功部分失败情况,Redis事务不具原子性。

4. Redis 事务冲突及解决办法(悲观锁,乐观锁) watch & unwatch

以抢票问题为例:多个用户同时请求购票,若不处理会出现超卖。

4.1 “悲观锁” 解决

悲观锁认为每次获取数据时其他会修改,因此获取数据前上锁。传统关系型数据库的行锁、表锁等即属此类。

4.2 “乐观锁” 解决

乐观锁认为获取数据时其他不会修改,更新时检查版本等。Redis利用 check-and-set 机制实现事务。

4.3 watch & unwatch

  1. 基本语法: watch key [key ...]
  2. 执行 multi 前用 watch 监视key,若事务执行前key被修改,事务中断。
  3. unwatch 取消对所有key的监视,若已执行 execdiscard,无需再用。

5. 案例演示:火车票-抢票(解决超卖,库存遗留)问题

5.1 案例思路分析:

通过WEB项目演示,需保证一个用户只能购一张票、无超购、无库存遗留。

5.2 完成基本购票流程,暂不考虑事务和并发问题

编写Java Web项目,引入相关jar包和jquery,创建index.jsp等。

5.3 抢票并发模拟,出现超卖问题

使用ab工具模拟并发请求,测试超卖情况。

5.4 Redis 连接池技术

连接池节省连接消耗,配置MaxTotal、maxIdle等参数。

5.5 利用 Redis 的事务机制,解决超卖问题(使用 watch,multi )

通过 watch 监控库存,使用事务完成秒杀。

5.6 抢票并发模拟,分析库存遗留问题

大量并发请求可能导致库存遗留,因乐观锁机制部分请求被打断。

5.7 运用 LUA 脚本(解决超卖,和库存遗留问题)

LUA脚本具原子性,解决多任务并发问题。LUA脚本示例:

local userid=KEYS[1];
local ticketno=KEYS[2];
local stockKey='sk:'..ticketno..":ticket";
local usersKey='sk:'..ticketno..":user";
local userExists=redis.call("sismember",usersKey,userid);
if tonumber(userExists)==1 then
   return 2;
end
local num= redis.call("get" ,stockKey);
if tonumber(num)<=0 then
   return 0;
else
   redis.call("decr",stockKey);
   redis.call("sadd",usersKey,userid);
end
return 1

6. 总结:

在本部分,感谢读者的关注与支持,将继续在相关领域探索,期待与读者再次相遇。

文章整理自互联网,只做测试使用。发布者:Lomu,转转请注明出处:https://www.it1024doc.com/12530.html

(0)
LomuLomu
上一篇 2025 年 6 月 18 日
下一篇 2025 年 6 月 18 日

相关推荐

  • idea2025.3激活码同步教程

    这篇指南兼容IDEA、PyCharm、DataGrip、Goland等JetBrains系列开发工具,全家桶用户都能用! 话不多说,直接展示最新版IDEA破解成功的界面截图,可以看到有效期已经延续到2099年了,非常给力! 接下来,我将通过图文详解的方式,手把手教你如何将IDEA激活到2099年。 当然,这个激活方案对历史旧版本同样有效! 无论你的操作系统是…

    IDEA破解教程 2026 年 3 月 19 日
    7300
  • 实用图解版最新版webstorm激活码,分步破解教程教学

    免责声明:本文所涉破解补丁、激活码均源自互联网公开渠道,仅供个人学习研究,禁止商业用途。如条件允许,请支持正版!官方正版低至 32 元/年:https://panghu.hicxy.com/shop/?id=18 WebStorm 是 JetBrains 出品的一款跨平台 IDE,支持 Windows、macOS 与 Linux。下面手把手教你利用破解补丁实…

    2025 年 11 月 5 日
    15600
  • PyCharm激活问题合集|激活失败、验证失败如何解决?

    本教程适用于IDEA、PyCharm、DataGrip、Goland等,支持Jetbrains全家桶! 废话不多说,先上最新PyCharm版本破解成功的截图,如下,可以看到已经成功破解到 2099 年辣,舒服! 接下来,我就将通过图文的方式, 来详细讲解如何激活 PyCharm至 2099 年。 当然这个激活方法,同样适用于之前的旧版本! 无论你是Windo…

    2025 年 10 月 1 日
    20600
  • [华为OD机考 – 密语传递 – 基于深度优先搜索的Java实现(2025 A卷 200分)]

    华为2025届OD机考A卷试题库持续更新中,专项练习 _ 戳此进入_ 专题导览 本系列试题已编入《华为OD机考Java真题全集(A/B/C/D/E卷)》。练习频次与中签率正相关, 添加哪吒微信,备注”华为OD备考”,加入专属刷题群 ,每道题配备:解题思路解析、完整代码实现、多组测试数据、算法选择依据、应用场景说明,题库实时更新,24小时在线答疑。 题目要求 …

    2025 年 5 月 12 日
    29300
  • 最新IDEA破解教程,永久激活码,2024 IDEA版本激活方法

    本教程适用于IDEA、PyCharm、DataGrip、Goland等,支持Jetbrains全家桶! 废话不多说,先给大家看一下最新IDEA版本的破解截图,可以看到已经成功破解至2099年,激活效果非常好! 接下来,我会通过图文方式,详细讲解如何激活IDEA至2099年。 无论你使用的是Windows、Mac还是Linux系统,无论你的IDEA版本是多少,…

    DataGrip破解教程 2025 年 4 月 12 日
    1.7K00

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信