阅读模式:

php使用redis watch秒杀抢购

查看:3007  :5  类型:  来源:php自学网  标签 php redis 秒杀抢购

        redis的watch multi exec 方法实现秒杀抢购。优点:使用了乐观锁没有锁的等待,比队列方式减少了大量的内存消耗。

<?php
header("content-type:text/html;charset=utf-8");
$redis = new redis();
$result = $redis->connect('127.0.0.1', 6379);
$gots = $redis->get("gots");  // 已抢数量
$robTotal = 100;  // 抢购总数量
if ($gots < $robTotal) {
    $redis->watch("gots");  // 监听key
    $redis->multi();  // 开启事务
    //插入抢购数据  
    $redis->hSet("userList", "user_id_" . mt_rand(1, 9999), time());
    $redis->set("gots", $gots + 1);  // 抢购到+1
    $robResult = $redis->exec();  // 执行事务
    if ($robResult) {
        echo "抢购成功!<br/>";
        echo "剩余数量:" . ($robTotal - ($redis->get("gots"))) . "<br/>";
        echo "用户列表:<pre>";
        var_dump($redis->hGetAll("userList"));
    } else {
        echo "手气不好,再抢购!";
        exit;
    }
}else {
    echo "已售罄";
    exit;
}
分享到:
0 0
最新看法:
贝如  时间 2020-04-24 16:25:08  广东省广州市越秀区/海珠区电信
沙发
PHPLAF v.1.0.10 正式发布了!开发文档:https://blog.junphp.com/apiword.jsp 回复
少年  时间 2020-05-29 16:53:50  广东省广州市电信
板凳
为什么用户列表是存time()的 回复
站长 2020-05-30 00:48 广东省深圳市电信
测试用的。 回复
时代光华  时间 2021-01-05 15:20:56  中国安徽省合肥市蜀山区
地板
在抢购成功时,进行新增数据,1000条执行后,会丢失数据。数据库新增没有1000条 回复
站长 2021-01-06 17:19 广东省深圳市电信
设置了库存1000 ? 我觉得不建议抢购成功时直接做入库处理。而是在已售罄后再依次入库。如果实时性要求较高,可以增加一个进程格外处理redis中的用户hash列表。 回复
回复:[主题]
表情:
 提交
清空

我的看法:

IN: