千家信息网

thinkphp中怎么利用redis实现秒杀缓存功能

发表于:2025-02-07 作者:千家信息网编辑
千家信息网最后更新 2025年02月07日,thinkphp中怎么利用redis实现秒杀缓存功能,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1,安装redis,根
千家信息网最后更新 2025年02月07日thinkphp中怎么利用redis实现秒杀缓存功能

thinkphp中怎么利用redis实现秒杀缓存功能,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

1,安装redis,根据自己的php版本安装对应的redis扩展

首先查看phpinfo();php环境信息

2,下载redis

https://windows.php.net/downloads/pecl/snaps/redis/https://windows.php.net/downloads/pecl/releases/igbinary/

一定要确认下载版本是否和php对应

3.解压缩后,将php_redis.dll和php_redis.pdb拷贝至php的ext目录下

4.修改php.ini,(PS:此php.ini文件是在Apache目录)在该文件中加入:

; php_redisextension=php_igbinary.dllextension=php_redis.dll

注意:extension=php_igbinary.dll一定要放在extension=php_redis.dll的前面,否则此扩展不会生效

5.重启Apache后,使用phpinfo查看扩展是否成功安装

在config配置redis 我示例用的是thinkphp5.0

然后在extend下新建module文件夹 创建Redis.php文件

connect(config('redis.host'), config('redis.port'), 5);        return $con;    }}在thinkphp文件下的helper.php加入if (!function_exists('redis')) {    /**     * 获取容器对象实例     * @return Container     */    function redis()    {        return \module\Redis::redis();    }}然后就可以在控制器写redis缓存方法了  //创建redis缓存\Cache::store('redis')->set(key, value);//读取缓存\Cache::store('redis')->get(key);

秒杀的核心问题是在大并发的情况下不会超出库存的购买,这个就是处理的关键所以思路是第一步在秒杀类的先做一些基础的数据生成:
三张表做测试,分别是:商品表,日志表,订单表,

///秒杀入口

  public function insva(){        $id = input('id');//获取商品id        if(!$id){            return $this->insertlog(0);//记录失败日志        }        $redis = $this->redis();//接入redis        $count = $redis->reduceStock('goods_stock');//减少库存,返回剩余库存        if($count ==0){            $this->insertlog(0);//记录秒杀失败日志            return false;        }else{            $order = $this->build_order_no();//随机生成订单号            $status = 1;            $data = db('goods')->where('id',$id)->find();            if (!$data){                return $this->insertlog(0);//商品不存在            }            $res = db('order')->insert(['order_sn'=>$order,'uid'=>$this->user_id,'goods_id'=>$id]);//插入订单            $stock = db('goods')->where('id',$id)->setDec('count');//减少库存            if($stock){                $this->insertlog();//记录成功日志            }else{                $this->insertlog(0);//记录秒杀失败日志            }        }    }    // 将商品库存存入队列    public function redisinit(){        $store=50; // 库存50        $redis=$this->redis(); //接入redis        $redis->del('goods_store'); // 删除库存列表        $res=$redis->llen('goods_store'); //返回库存长度,这里已经是0        $count=$store-$res;        for($i=0;$i<$count;$i++){            $redis->lpush('goods_store',1); //列表推进50个,模拟50个商品库存        }    }    //生成唯一订单    function build_order_no(){        return date('ymd').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);    }            // 记录日志 状态1成功 0失败    function insertlog($status=1){        return Db::name("ab_log")->insertGetId(["count"=>1,"status"=>$status,"addtime"=>date('Y-m-d H:i:s')]);    }

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。

0