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
上一篇 9小时前
下一篇 8小时前

相关推荐

  • DataGrip 2024破解教程:激活码使用全指南

    DataGrip 2024破解教程:激活码使用全指南 这篇教程适用于所有JetBrains系列软件,包括DataGrip。接下来,我将向大家展示如何通过简单的图文步骤,成功激活DataGrip至2099年。通过这个方法,你不仅能轻松激活最新版本,也能适用于旧版本的激活。 首先,先看一下成功激活的截图,我们可以看到DataGrip已经成功激活,且有效期延续至2…

    DataGrip破解教程 2025 年 4 月 21 日
    19200
  • 2025年最新DataGrip永久破解教程(附激活码+破解补丁)🔥

    🚀 本教程适用于Jetbrains全家桶,包括IDEA、PyCharm、DataGrip、Goland等开发工具! 先给大家看看最新版本的破解成果,成功激活到2099年不是梦!👇 下面我就手把手教你如何永久激活DataGrip,这个方法同样适用于旧版本哦!💪 无论你是Windows、Mac还是Linux系统,都能轻松搞定! 第一步:下载DataGrip安装包…

    2025 年 6 月 4 日
    7000
  • WxPython跨平台开发框架之动态菜单的管理和功能权限的控制

    在一个业务管理系统中,如果我们需要实现权限控制功能,我们需要定义好对应的权限功能点,然后在前端界面中对界面元素的可用性和功能点进行绑定,这样就可以在后台动态分配权限进行动态控制了,一般来说,权限功能点是针对角色进行控制的,也就是简称RBAC(Role Based Access Control)。对于登录系统后的用户,对用户的菜单(工具栏)、界面操作按钮的权限…

    2025 年 1 月 6 日
    28100
  • Java MDC技术详解:实现高效日志链路追踪的实战指南

    一、MDC技术概述 MDC(映射诊断上下文)是SLF4J日志框架提供的一项线程级数据存储功能。作为线程安全的容器,它能够在特定线程范围内保存多组键值数据,并自动将这些信息嵌入日志记录中,从而实现日志信息的上下文关联。 二、MDC的核心价值 功能 描述 应用实例 请求追踪 完整记录请求处理路径 微服务调用链路分析 参数传递 跨方法共享通用数据 机构编码、用户标…

    未分类 2025 年 5 月 19 日
    7800
  • 2025年最新DataGrip永久破解教程:一键激活至2099年(附激活码)

    JetBrains旗下的DataGrip是数据库开发者的利器,但官方正版价格不菲。本文将详细介绍如何将DataGrip破解激活至2099年,方法同样适用于IDEA、PyCharm等JetBrains全家桶软件。 破解效果预览 先来看看破解成功后的效果,许可证有效期已延长至2099年! 准备工作 下载DataGrip安装包 若尚未安装DataGrip,请访问官…

    2025 年 5 月 9 日
    22100

发表回复

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

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

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

关注微信