概述
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 实现防止商品超卖现象所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复