redis解决超卖以及限制用户购买问题

本文介绍如何在高并发环境下利用Redis的队列和集合特性防止超卖,以及结合互斥锁思想和Redis事务确保操作原子性,以实现用户限购。通过实例展示了在秒杀活动中如何运用这些策略。
摘要由CSDN通过智能技术生成

问题描述:在高并发的情况下,让同一个客户只能买到同一种商品一次,不能继续购买,同时还要防止商品超卖。
解决思路:超卖使用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) == 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值