使用单例模式

例子redis做秒杀和其它功能(避免被多次实例化)

<?php
namespace app\index\controller;

class Base extends \think\Controller
{
     // 实例
    protected static $reids = null;

    public static function getRedis(){
        if(null === self::$reids) {
            self::$reids = new \Redis();
            self::$reids->connect('127.0.0.1',6379);
            self::$reids->auth('123456');
        }
        return self::$reids;
    }

}

<?php
namespace app\index\controller;

use think\Db;

class Index extends Base
{
    public function index()
    {
        $mobile='17805990428'.rand(0,19); //用户
        Db::startTrans();
        try{
            $inventory_value = Db::name('inventory')->where('id',1)->lock(true)->find();//行锁
            if($inventory_value['number_value'] == 0 && $inventory_value['number_value'] == ''){
                Db::rollback();
                return $this->msg('20000','秒杀结束','');
            }
            self::getRedis()->rpush("mobile",$mobile); //队列
            //做秒杀逻辑
            Db::name('inventory')->where('id',1)->setDec('number_value',1);
            $seckill = [
                'userID' => $mobile,
                'create_time' => date('Y-m-d H:i:s',time())
            ];
            Db::name('seckill')->insert($seckill);
            self::getRedis()->lpop('mobile');   //清空
            // 提交事务
            Db::commit();    
        } catch (\Exception $e) {
            // 回滚事务
            Db::rollback();
            return $this->msg('20000','秒杀已结束','');
        }
    }

}

使用redis都去调用getRedis方法,这样可以避免多次被实例化

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值