使用Redis锁概念实现秒杀

栏目: 数据库 · Redis · 后端 · 发布时间: 8年前

内容简介:秒杀功能一般在购物网站比较常见,通过设定1到2件特别低价的商品,调动用户的积极性。具体是实现的思路: 1.用户发送秒杀请求,后台程序检测秒杀产品是否已经售完; 2.如果秒杀的产品库存数量大于0,则该请求秒杀成功,减少库存数量,更新用户的信息;

秒杀功能一般在购物网站比较常见,通过设定1到2件特别低价的商品,调动用户的积极性。

具体是实现的思路:

1.用户发送秒杀请求,后台程序检测秒杀产品是否已经售完; 2.如果秒杀的产品库存数量大于0,则该请求秒杀成功,减少库存数量,更新用户的信息;

表面上看没有问题,如果放到现实情况下,则暴露出严重的BUG:

从商品库存数量检测到秒杀成功后,更新库存剩余数量(商品数量减1),这之间只有一步,但是在大并发量情况下,几十个(甚至几百个)用户同时查询、减少,会造成库存数量为负数的情况,即多个用户同时秒杀到一款产品。

这就需要用到 redis 锁的机制,来限制并发查询和更新。

demo示例:

<?php
/**
  *
  * 秒杀请求程序入口
  *
  */
$redis = new Redis();
$ret = $redis->connect("127.0.0.1", 6379);
if ($ret === TRUE) {
    // 检测秒杀是否结束
    if ($redis->get('goods.num') <= 0) {
            echo ("秒杀已经结束");
            return False;
    }
    // 获取锁之后才可以处理库存
    tryagain:
    $lock = $redis->setnx("lock", 1);
    if ($lock === FALSE) {
            goto tryagain;
    }
    // 获取锁之后检测库存
    if ($redis->get('goods.num') <= 0) {
            echo ("秒杀已经结束");
            //删除锁
            $redis->delete("lock");
            return False;
    }
    // 更新秒杀产品剩余库存
    $last_num = $redis->decr('goods.num');
    if ($last_num < 0) {
            echo ("秒杀已结束");
            // 删除锁
            $redis->delete("lock");
            return False;
    } else {
            // 更新用户账户 记录秒杀成功用户信息
            echo ("秒杀成功");
            // 删除锁
            $redis->delete("lock");
            return True;
    }
} else {
    // 连接异常
    die("Redis连接失败");
}

这里唯一要注意的一点,没有处理死锁的情况,即完成商品数量更新后,删除锁失败。


以上所述就是小编给大家介绍的《使用Redis锁概念实现秒杀》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

深入理解计算机系统(原书第2版)

深入理解计算机系统(原书第2版)

(美)Randal E.Bryant、David O'Hallaron / 龚奕利、雷迎春 / 机械工业出版社 / 2011-1-1 / 99.00元

本书从程序员的视角详细阐述计算机系统的本质概念,并展示这些概念如何实实在在地影响应用程序的正确性、性能和实用性。全书共12章,主要内容包括信息的表示和处理、程序的机器级表示、处理器体系结构、优化程序性能、存储器层次结构、链接、异常控制流、虚拟存储器、系统级I/O、网络编程、并发编程等。书中提供大量的例子和练习,并给出部分答案,有助于读者加深对正文所述概念和知识的理解。 本书的最大优点是为程序......一起来看看 《深入理解计算机系统(原书第2版)》 这本书的介绍吧!

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

html转js在线工具
html转js在线工具

html转js在线工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具