文档章节

php redis实现秒杀功能

RitaChen
 RitaChen
发布于 2016/11/17 13:36
字数 424
阅读 364
收藏 0

主要针对并发情况下,通过redis的分布式锁和队列的方式进行处理的代码

Queue:{商品ID}:   数据类型是有序集合(zset),成员是用户ID,score是用户入队的时间戳

Lock:Queue:{商品ID}: 数据类型是字符串(string),存储的是该锁的过期时间

goods:{商品ID}:stock: 存储的是商品的库存数量

简单介绍demo代码中的实现思路:

将当前秒杀的商品id作为一个队列名称

$queue_name = “Queue:{商品ID}”;

对$queue_name进行加锁

    通过setnx(满足原子性)实现加锁  :$redis->setnx("Lock:Queue:{商品ID}",  $expire time)

    加锁成功,给该锁设置一个过期时间,主要是为了防止死锁

    如果加锁失败,通过设置休眠时间,进行循环请求

加锁成功后,判断队列中的成员数是否超过指定的大小

$count = $this->redis->zCard("Queue:{$name}");
if($count >=  $this->redis->get("goods:{$name}:stock")) {
    $this->lockModel->unlock("Queue:$name");
    return '超过指定集合数量';
}

 判断用户ID是否存在队列中,如不存在则加入队列(score:存入的是当前时间戳 )

if (false === $this->redis->zScore("Queue:$name", $user_id)) {
    $this->redis->zAdd("Queue:$name", $score, $user_id);
}

入队成功,进行解锁$redis->del("Lock:Queue:{商品ID}");提示用户抢购成功。成功的用户会跳转到确认购买的页面,点击确认后才会生成订单、出队等后续操作

ps: 针对多个账号,一次性发送多个请求可以通过ip的访问频率的限制来预防

参考文章:http://blog.jobbole.com/95156/

demo代码的下载地址:https://github.com/Ritajiajia/redis_test/tree/master/test/seckill

    

© 著作权归作者所有

共有 人打赏支持
RitaChen
粉丝 3
博文 17
码字总数 21495
作品 0
成都
高级程序员
java架构师之用Redis轻松实现秒杀系统

导论 曾经被问过好多次怎样实现秒杀系统的问题。昨天又在CSDN架构师微信群被问到了。因此这里把我设想的实现秒杀系统的价格设计分享出来。供大家参考。 秒杀系统的架构设计 秒杀系统,是典型...

Java高级架构师
08/09
0
0
电商类产品的必备功能:秒杀与竞拍

这个真的是老生常谈,万年不变的话题了,但是我在Google搜到的关于秒杀与竞拍的内容,大多都是讲些大而泛的架构层面,系统层面的东西,牵扯到具体代码实现却一笔带过,这就导致了,很多很多同...

gzchen
08/27
0
0
秒杀 计数器 直播--php 实现数据库连接池、直播平台

yaf项目快速开发(兼容php7): yaf project rapid development, integration of the db action class support chain operation, support separate read and write, pdo, mysqli, mongo, up......

qieangel
2015/09/07
11.5K
3
都在讨论秒杀,大家实现秒杀的思路是什么呢?

我的思路是 某种产品秒杀N个 1、秒杀前,在redis中存入n条数据,包含id和对应产品的id,形成一个待秒杀产品队列 2、用户抢到一个,就pop出去一个,在这个出队的数组中加入用户的uid,存入一个...

悠悠知我心
2015/11/10
646
3
基于redis分布式锁实现“秒杀”

最近在项目中遇到了类似“秒杀”的业务场景,在本篇博客中,我将用一个非常简单的demo,阐述实现所谓“秒杀”的基本思路。 业务场景 所谓秒杀,从业务角度看,是短时间内多个用户“争抢”资源...

lsfire
2016/10/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周一乱弹 —— 鱼生不值得

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @瘟神灬念:分享新裤子的单曲《没有理想的人不伤心 (Remix版)》: 《没有理想的人不伤心 (Remix版)》- 新裤子 手机党少年们想听歌,请使劲儿戳...

小小编辑
21分钟前
4
3
arts-week10

Algorithm 905. Sort Array By Parity - LeetCode Review Who’s Afraid of the Big Bad Preloader? 一文读懂前端缓存 一个网络请求3个步骤:请求,处理,响应,而前端缓存主要在请求处响应这两步...

yysue
今天
4
0
00.编译OpenJDK-8u40的整个过程

前言 历经2天的折腾总算把OpenJDK给编译成功了,要说为啥搞这个,还得从面试说起,最近出去面试经常被问到JVM的相关东西,总感觉自己以前学的太浅薄,所以回来就打算深入学习,目标把《深入理...

凌晨一点
今天
5
1
python: 一些关于元组的碎碎念

初始化元组的时候,尤其是元组里面只有一个元素的时候,会出现一些很蛋疼的情况: def checkContentAndType(obj): print(obj) print(type(obj))if __name__=="__main__": tu...

Oh_really
昨天
6
2
jvm crash分析工具

介绍一款非常好用的jvm crash分析工具,当jvm挂掉时,会产生hs_err_pid.log。里面记录了jvm当时的运行状态以及错误信息,但是内容量比较庞大,不好分析。所以我们要借助工具来帮我们。 Cras...

xpbob
昨天
180
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部