问题描述:在高并发的情况下,让同一个客户只能买到同一种商品一次,不能继续购买,同时还要防止商品超卖。
解决思路:超卖使用redis的队列性质。限制同一用户重复购买,使用集合。因redis的一个操作具有原子性。但是我们这次需要多个redis操作。那么redis的原子性就显得苍白无力。所以还要引入互斥锁的思想来解决多个操作不具备原子性的操作。既然同时有多个操作进行,为了保证多个操作的正常进行,同时引入redis事务特性。话不多说,直接上代码
场景:秒杀活动。
第一步:先把参与秒杀的活动存入队列```
第二步 模拟客户购买商品
<?php
namespace app\manage\controller;
use think\Controller;
use app\common\model\Article;
use think\Db;
use app\common\model\Paybills;
// redis测试
class RedisTest extends Controller
{
// redis对象
private $_redis;
// 加锁
public function lock($key, $random)
{
if (empty($this->_redis)) {
$this->getRedis();
}
$ret = $this->_redis->set($key, $random, [
'nx',
'ex' => 6000
]);
return $ret;
}
// 解锁
public function unLock($key, $random)
{
if ($this->_redis->get($key) ==