专栏首页PHP修行之路PHP+Redis 商品超卖

PHP+Redis 商品超卖

第一种使用Redis LIST做队列(List的Lpop操作是原子性的)

  • 思路:先在Redis中根据商品数量生成相应的库存队列,当用户抢购商品时先从队列中获取商品,然后再进行下单等相关逻辑处理
  • 实践

    生成库存队列

<?php
public function fillStock(){
        $redis = new \Redis();
        $redis->connect("redis",6379);
        $redis->auth("hengda");
        $redis->select(1);
        for ($i = 0;$i < 1000;$i++){
            $redis->lPush("shop_list",rand(1000000000,99999999999999));
        }
}

抢购消费队列

<?php
public function purchase(){
        $redis = new \Redis();
        $redis->connect("redis",6379);
        $redis->auth("hengda");
        $redis->select(1);

        if(!$redis->lPop("shop_list")){
            return response_json(1,["msg"=>"已结束"],"success");
        }

    //TODO 生成订单队列
}

第二种使用Redis执行Lua脚本(执行脚本的eval操作是原子性的)

  • 思路:在redis库中存储库存数,当用户抢购时先将库存减1然后再生成订单对列
  • 实践
<?php
public function purchaseLua(){
        $redis = new \Redis();
        $redis->connect("redis",6379);
        $redis->auth("hengda");
        $redis->select(1);

        $lua_script = <<<LUA
local shop_num_exit = redis.call("get","shop_num");
if shop_num_exit == "0"
then
    return false;
else
    return redis.call("decr","shop_num");
end
LUA;
        $result = $redis->eval($lua_script);
        if($result === false){
            return response_json(1,["msg"=>"已结束"],"success");
        }

        //TODO 生成订单对列
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 使用redis 中的事务处理实现商品秒杀

    redis中的事物事物处理是指能够批量的执行一组命令(当事务开始执行时,事务中的命令能够按照按照规定好的顺序执行而不会被插队或打断);

    码缘
  • 【php设计模式】责任链模式

    责任链模式为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。

    码缘
  • xss攻击和csrf攻击的定义及区别

    (1)登录受信任网站A,并在本地生成Cookie。(如果用户没有登录网站A,那么网站B在诱导的时候,请求网站A的api接口时,会提示你登录)

    码缘
  • Java开发环境系列:Redis安装与配置

    去官网找了很久,发现原来在官网上可以下载的windows版本的,现在官网已经没有下载地址,只能在github上下载,官网只提供linux版本的下载。

    架构师小跟班
  • linux下安装配置redis

    之后重新刷新一遍profile文件即可,这样redis-cli命令就能在任意路径下使用了

    萌萌哒的瓤瓤
  • Redis:安装方法

    服务启动脚本:/usr/lib/systemd/system/redis.service

    新码农
  • 查看redis服务是否启动

    redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(...

    用户8101025
  • 工具系列 | 如何快速编译安装 Redis

    启动redis服务,并指定启动服务配置文件,检测运行端口,为了安全,请不要使用root用户去启动

    Tinywan
  • redis(1)

    redis就是KV类型的数据库. 可用作数据库,消息中间件. 它支持的数据类型也很多

    大大刺猬
  • ubuntu 安装并远程连接redis

    String Hash List 耗费性能 Set SortedSet 特别耗性能,排序保持唯一

    星尘的一个朋友

扫码关注云+社区

领取腾讯云代金券