基于 Redis 实现秒杀资格判断,提升并发性能

在互联网电商平台上,秒杀活动往往会吸引大量用户同时抢购,如何高效地处理高并发请求,保证用户体验,是一个重要的技术挑战。本文将介绍如何基于 Redis 实现秒杀资格的判断,提高并发性能。

基本思路

秒杀活动的核心流程可以归纳为以下几个步骤:

  1. 检查库存是否足够。
  2. 判断用户是否已经参加过此次秒杀。
  3. 扣减库存。
  4. 记录用户的秒杀信息。
  5. 返回订单 ID。

为了保证高并发情况下的执行效率和数据一致性,我们采用 Redis 来处理这些操作,并利用 Lua 脚本保证操作的原子性。

Lua 脚本实现

下面是一段 Lua 脚本,它能够在 Redis 中执行上述的秒杀操作:

--- 秒杀资格判断 Lua 脚本
--- 1. 参数列表
local voucherId = ARGV[1] -- 优惠券 ID
local userId = ARGV[2] -- 用户 ID

--- 2. 数据 key
local stockKey = 'seckill:stock:' .. voucherId -- 库存 key
local orderKey = 'seckill:order:' .. voucherId -- 订单 key

--- 3. 脚本逻辑
--- 3.1. 判断库存是否足够
if (tonumber(redis.call('get', stockKey)) <= 0) then
    return 1
end
--- 3.2. 判断用户是否已经参与过秒杀
if (redis.call('sismember', orderKey, userId) == 1) then
    return 2
end
--- 3.3. 扣减库存
redis.call('incrby', stockKey, -1)
--- 3.4. 记录用户秒杀信息
redis.call('sadd', orderKey, userId)
return 0

Java 代码实现

接下来展示如何在 Java 中调用上述 Lua 脚本,并处理返回结果:

@Override
public Result seckillVoucher(Long voucherId) {
    // 获取当前用户 ID
    Long userId = UserHolder.getUser().getId();
    
    // 1. 执行 Lua 脚本
    Long result = stringRedisTemplate.execute(
            SECKILL_SCRIPT,
            Collections.emptyList(),
            voucherId.toString(), userId.toString()
    );
    
    // 2. 判断结果
    int r = result.intValue();
    if (r != 0) {
        // 2.1. 如果结果不为 0,说明没有购买资格
        return Result.fail(r == 1 ? "库存不足" : "不能重复下单");
    }
    
    // 2.2. 如果结果为 0,说明有购买资格,生成订单 ID 并保存到阻塞队列中
    long orderId = redisIdWorker.nextId("order");
    // TODO: 将订单信息保存到数据库或消息队列中
    
    // 3. 返回订单 ID
    return Result.ok(orderId);
}

代码详解

  1. Lua 脚本部分

    • 定义两个参数:优惠券 ID 和用户 ID。
    • 使用 Redis 的 get 命令获取当前库存,判断库存是否足够。
    • 使用 Redis 的 sismember 命令判断用户是否已经参与过秒杀活动。
    • 如果库存足够且用户没有参与过,则使用 incrby 命令扣减库存,使用 sadd 命令记录用户信息。
  2. Java 代码部分

    • 获取当前用户 ID。
    • 调用 stringRedisTemplate.execute 方法执行 Lua 脚本,并传递参数。
    • 根据 Lua 脚本返回的结果判断用户是否有秒杀资格。
    • 如果用户有秒杀资格,则生成订单 ID,并将订单信息保存到数据库或消息队列中。
    • 返回订单 ID。

对比:

图1是从数据库查,图2是基于Redis,可见平均值提高了很多。

总结

通过使用 Redis 和 Lua 脚本,可以高效地处理秒杀活动中的高并发请求,确保数据的准确性和一致性。这种方法不仅提高了系统的性能,还保证了用户的秒杀体验。希望本文对你理解和实现秒杀系统有所帮助。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android跨进程调用,Binder线程池溢出导致ANR

Android跨进程调用&#xff0c;Binder线程池溢出导致ANR 如果发生ANR&#xff0c;找到trace.txt 、/data/anr目录下&#xff0c; "main" prio5 tid1 Native| group"main" sCount1 dsCount0 flags1 obj0x72c33e38 self0x78a64c2a00| sysTid1863 nice0 cgr…

任务4.8.4 利用Spark SQL实现分组排行榜

文章目录 1. 任务说明2. 解决思路3. 准备成绩文件4. 采用交互式实现5. 采用Spark项目实战概述&#xff1a;使用Spark SQL实现分组排行榜任务背景任务目标技术选型实现步骤1. 准备数据2. 数据上传至HDFS3. 启动Spark Shell或创建Spark项目4. 读取数据5. 数据转换6. 创建临时视图…

PS系统教程28

Alpha通道&#xff08;透明通道&#xff09; 8位的灰度通道&#xff0c;也有256个位置记录图片当中的透明度信息 作用&#xff1a;定义透明、半透明、不透明通道信息。保存、存储选区。 白色不透明区域黑色透明区域灰色半透明区域 案例 为了将我们抠出来的人物方便下次修改…

Opencv学习项目6——pyzbar

在之前我们学习了解码图片中的二维码&#xff0c;这次我们开启摄像头来解码视频中二维码 开启摄像头 # 打开摄像头 cap cv2.VideoCapture(0) cap.set(3, 640) # 设置摄像头画面宽度 cap.set(4, 480) # 设置摄像头画面高度 我使用的是笔记本上的摄像头来进行的&#xff0c;…

CleanMyMac中文版2024官方正式版下载!你的电脑清洁专家!

CleanMyMac中文版&#xff0c;你的电脑清洁专家&#xff01;✨&#x1f9f5; 你是否曾为电脑的卡顿和垃圾文件而烦恼&#xff1f;别担心&#xff0c;CleanMyMac中文版来帮你解决这些问题&#xff01;这款神奇的软件不仅可以帮助你清理垃圾文件&#xff0c;还能优化系统性能&…

什么是营销翻译?为什么要使用它?

营销翻译是将营销活动和宣传品翻译成不同语言的过程。它可能涉及翻译您的&#xff1a; 网站营销文案&#xff0c;社交媒体帖子&#xff0c;演示文稿&#xff0c;新闻稿&#xff0c;产品包装&#xff0c;产品说明&#xff0c;海报&#xff0c;宣传册&#xff0c;以及 虽然企业…

商家转账到零钱申请驳回解决方案

商家转账到零钱是什么&#xff1f; 商家转账到零钱&#xff0c;简单说&#xff0c;就是微信支付提供的一个功能&#xff0c;让商家能够方便、快捷、安全地将钱转到用户的微信零钱里。这个功能特别适用于那些需要给用户发红包、退款或者进行其他形式转账的商家。它提供了两种转…

Origin做聚类分析并利用聚类插件绘制热力图

1.聚类分析 1.1 K均值聚类 step1、首先进行归一化&#xff0c;具体步骤如图1-1所示&#xff1a; 图1-1 操作后得到归一化值如图1-2所示&#xff1a; 图1-2 step2、执行K均值聚类分析&#xff0c;如图1-3所示&#xff0c;选中聚类列&#xff0c;接着点击“统计”—“多变量分析…

高级别智能驾驶神级利器:自研OTA系统

在港口无人水平运输场景中&#xff0c;经纬恒润提供了车、路、网、云、图全栈式自研解决方案&#xff0c;包含了自动驾驶车辆、路侧车路协同、全场高可靠定位、5G远程驾驶、运营调度管理、OTA软件升级系统、数字孪生、仿真系统、高精地图等专业模块&#xff0c;组成了一套完整的…

H3C综合实验

实验拓扑 实验要求 1、按照图示配置IP地址 2、sw1和sw2之间的直连链路配置链路聚合 3、 公司内部业务网段为VLAN10和VLAN20; VLAN 10是市场部&#xff0c;vlan20是技术部&#xff0c;要求对VLAN进行命名以便识别&#xff1b;PC1属于vlan10&#xff0c;PC2属于vlan20&#xf…

想远程控制手机,用哪个软件好?

很多人都想知道安卓系统或iOS系统要如何实现手机远程控制手机、电脑远程控制手机&#xff0c;分别需要用到什么软件&#xff0c;这篇文章一次说清楚。 注意&#xff0c;安卓系统需要是7.0及以上版本&#xff0c;iOS系统需要是11及以上版本。具体使用步骤请点击关注&#xff0c;…

10 种最佳编程字体

1.Commit Mono 这是我目前最喜欢的字体。这是我用来输入这篇文章的字体。作者 Eigil Nikolajsen 于 2023 年使用Fira Code和JetBrains Mono作为灵感开发了它。 Commit Mono 清晰易读&#xff0c;可配置性强。您可以根据粗细&#xff08;我更喜欢最细的 300&#xff09;、连字、…

开发一款直播APP完整指南

直播是一种强大的营销工具&#xff0c;可以让企业与观众进行真实的互动。 根据Grand View Research发布的预测&#xff0c;直播行业规模将从 2021 年的 700 亿美元增长到 2028 年的近 2240 亿美元&#xff0c;七年内增长三倍。 区块链技术和人工智能等技术进步将在未来几年提…

网页设计的意义何在?最后一个你绝对没想到!

在当今时代&#xff0c;网页已经成为我们日常生活中不可或缺的一部分。网页的支持对于搜索信息、购物、社交娱乐、在线学习和工作至关重要。网页设计作为网页的重要组成部分之一&#xff0c;在实现网页的各种功能和目的方面发挥着至关重要的作用。那么&#xff0c;网页设计的目…

lammps六边形建模方法

大家好&#xff0c;我是小马老师。 本文介绍lammps六边形结构建模方法。 lammps自带的形状有长方体、圆柱体、圆锥体和球体&#xff0c;其他特殊的情况大多需要用组合建模方法。 如下图截面为六边形的纳米线&#xff0c;很难用一条命令建模。 主要原理和之前的锐角刀具建模原理…

msvcr120.dll丢失我们要怎样修复?总结4种方法修复msvcr120.dll

msvcr120.dll丢失我们要怎样修复&#xff1f;相信经常使用电脑的人&#xff0c;总会遇到这样的一个问题&#xff0c;那就是突然弹窗说你的msvcr120.dll不见了&#xff0c;丢失了&#xff0c;然后你的各种程序也启动不了&#xff01;这时候你就需要去修复msvcr120.dll这个文件&a…

Spring Boot项目的两种发布方式

5.1.方式1&#xff1a;通过jar包发布 步骤1&#xff1a;在pom中添加一个SpringBoot的构建的插件 <build><plugins><plugin><groupId>org.springframework.boot</groupId><!--自动检测项目中的 main 函数--><artifactId>spring-boot…

短视频最火的10个拍摄技巧,新手也能这样拍出大片效果

短视频越来越占据了人们的生活&#xff0c;不管是记录生活还是发个朋友圈是不是总感觉咱们自己拍出来的效果总是不如别人呢&#xff1f;更别说发短视频平台呢&#xff01;下面就分享10个拍摄技巧大家学着试试慢慢也能拍出大片效果。 不管你以后是否发展短视频平台&#xff0c;…

mprpc框架的配置文件加载

目录 1.回顾测试 2.mprpc框架的配置文件加载 2.1 mprpcconfig.h 2.2 完善mprpcapplication.h 2.3 完善mprpcapplication.cc 2.4 mprpcconfig.cc 2.5 test.conf 2.6 测试运行 ​3.扩展问题 1.回顾测试 我们先把之前的项目代码工程编译好&#xff0c;然后进入bin里面&am…

这七个自动化测试小知识,帮助你在自动化测试中走的更远

我们对自动化测试充满了希望&#xff0c;然而&#xff0c;自动化测试却经常带给我们沮丧和失望。虽然&#xff0c;自动化测试可以把我们从困难的环境中解放出来&#xff0c;在实施自动化测试解决问题的同时&#xff0c;又带来同样多的问题。在开展自动化测试的工作中&#xff0…