php+redis抢购商品高并发实现

1、准备前库存先存储到redis

php 复制代码
// 创建Redis连接
$redis = new Redis();
$redis->connect('127.0.0.1', 6379); // 假设Redis服务器在本地运行,端口为默认的6379
// 商品ID
$productID = 123;
//库存
$stock=10;
$stockKey = 'product:' . $productID . ':stock';
$redis->set($stockKey,$stock);

2、用户抢购

php 复制代码
// 创建Redis连接
$redis = new Redis();
$redis->connect('127.0.0.1', 6379); // 假设Redis服务器在本地运行,端口为默认的6379
// 商品ID
$productID = 123;
// 检查并发数控制
$maxConcurrent = 10; // 设置最大并发数为10
if ($redis->incr('concurrent_users') > $maxConcurrent) {
    $redis->decr('concurrent_users');
    die('抢购过于火爆,请稍后再试!');
}
// 检查抢购有效性
if ($redis->sismember('purchased_users:' . $productID, '用户ID')) {
    $redis->decr('concurrent_users');
    die('您已经购买过该商品!');
}
// 检查库存
$stockKey = 'product:' . $productID . ':stock';
$currentStock = $redis->get($stockKey);
if ($currentStock <= 0) {
    $redis->decr('concurrent_users');
    die('商品库存不足!');
}
// 扣减库存
$redis->decr($stockKey);
$redis->sadd('purchased_users:' . $productID, '用户ID');
// 抢购成功,进行后续操作
// ...
// 记录抢购日志
$logEntry = '用户ID 抢购了商品ID:' . $productID . ' ' . date('Y-m-d H:i:s');
$redis->rpush('purchase_log', $logEntry);
// 释放并发数控制
$redis->decr('concurrent_users');
echo '抢购成功!';
  1. 创建Redis连接:首先,你需要在PHP代码中创建一个与Redis服务器的连接。可以使用现有的Redis扩展或包来实现。
  2. 加载商品信息到Redis缓存:在抢购开始之前,你可以将商品的信息加载到Redis缓存中。这可以减轻数据库的负担,并提高读取速度。你可以使用Redis的哈希表数据结构来存储商品的ID、名称、库存等信息。
  3. 控制抢购并发数:为了避免超卖和数据不一致的问题,你需要限制抢购的并发数。可以使用Redis的原子性操作,如INCRDECR命令,来实现原子的并发数控制。例如,你可以使用一个Redis计数器来记录当前正在进行抢购的用户数。如果超过了设置的并发限制,可以返回错误或给用户一个友好的提示。
  4. 有效性检查:在用户发起抢购请求之前,进行一些有效性检查是很重要的,例如检查用户是否已经达到抢购次数的限制,或者是否已经购买过该商品。这些检查可以在Redis缓存中进行,以减少数据库查询的频率。
  5. 扣减库存:在用户成功抢购之后,需要扣减商品的库存。你可以使用Redis的原子性操作,如DECRBY命令,在多个并发请求下准确地扣减库存。如果库存不足,可以返回错误或给用户一个友好的提示。
  6. 记录抢购日志:为了跟踪和统计抢购活动,可以使用Redis的列表数据结构来记录抢购日志。每次抢购成功可以将相关信息写入到Redis的一个列表中,后续可以根据需要对日志进行处理和分析。 请注意,上述步骤中的一些操作可以在数据库层面或Redis层面进行,具体取决于你的系统架构和需求。使用Redis作为缓存的好处是可以提高读取速度和并发处理能力,减轻了数据库的负担
相关推荐
Highcharts.js2 小时前
教程:基于 React + Highcharts 构建一个单页应用程序、按需数据拉取与图表渲染
开发语言·前端·数据结构·react.js·前端框架·highcharts·页面应用
海兰2 小时前
【数据库】tdsql(mysql8.0)优化思考三
数据库·redis
头发还在的女程序员3 小时前
医院陪诊管理系统怎么选择?——2026 年选型避坑与架构参考
java·开发语言·陪诊系统·陪诊app·医院陪诊陪护
爱写代码的小朋友5 小时前
从零开始学 Win32 API:C++ 窗口编程实战(VS Code + MinGW-w64 命令行详解)
开发语言·c++
果汁华5 小时前
Function Calling 与 Python 实战完整指南
开发语言·网络·python
小小晓.6 小时前
C++:语句和作用域
开发语言·c++
wanderist.7 小时前
Lambda表达式在算法竞赛中的应用
java·开发语言·算法
海天鹰8 小时前
PHP上传文件
android·开发语言·php
Yeauty9 小时前
渲染成图再 CLI 拼接,还是进程内直推?Rust 帧到视频的两条路
开发语言·rust·音视频
geovindu9 小时前
CSharp: Breadth First Search Algorithm and Depth First Search Algorithm
开发语言·后端·算法·c#·.net·搜索算法