我是靠谱客的博主 欣慰火,最近开发中收集的这篇文章主要介绍redis 实现防止超卖现象redis 实现防止商品超卖现象,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

redis 实现防止商品超卖现象

redis实现防止商品超卖现象主要是利用redis的原子性,在判断是否超卖过程中,最好不要有数据库查询这种具有耗时性的操作。

话不多说直接上代码

$client = new Redis();
$client->connect("127.0.0.1",6379);

第一步:肯定是连接redis

$productTotal = 10; //产品总数
$productOverKey = "pd_test_key";

$client->setnx($productOverKey,0);
$productOver = $client->get($productOverKey);
$client->watch($productOverKey);

第二步:

  • 假设当前商品总数量productTotal 为10个
  • 设置已卖出产品数量的key为pd_test_key,并设置初始值为0
  • 然后利用watch监听这个key
  • 获取已卖出商品的数量
// 如果卖出的产品数量比总数小则可以执行操作
if($productOver < $productTotal) {
    $client->multi();
    $client->incr($productOverKey);
    if($client->exec()) {
        // 执行数据库操作,
        //产品已抢购成功

        $mysql = mysqli_connect("127.0.0.1","root","123456","test");

        mysqli_query($mysql,"INSERT INTO `pdtest` (`status`,`create_time`) VALUES ('ok','".Date("Y-m-d H:i:s")."')");

        mysqli_close($mysql);

    }else {
        // 抢购失败
    }

}else {
    // 没货了
}

第三步:

  • 判断卖出的数量是否已经超过总数量
  • 启用redis的事务,这是保证原子性的条件
  • 直接在事务中增加已卖出数量,(watch会监听,如果其他地方对这个key进行了更改,则事务会执行失败)
  • 等事务执行成功以后就可以对数据库进行操作了

博主这里是利用redis的watch和multi的原子性,当然也可以利用lua脚本来实现原子性

用ab测试工具测试

ab -c 100 -n 1000 http://test.net

没有出现超卖现象

ps:

  • 缺点之一:要对商品的总数量和卖出数量的key进行维护
  • 分布式的话也可以使用zookeeper来实现分布式锁
  • 如果流量十分大的话,可以配和nginx等进行限流,超过指定数量以后的请求直接显示另外一个网页

最后

以上就是欣慰火为你收集整理的redis 实现防止超卖现象redis 实现防止商品超卖现象的全部内容,希望文章能够帮你解决redis 实现防止超卖现象redis 实现防止商品超卖现象所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部