thinkphp+redis实现秒杀,缓存等功能

秒杀是商城常见功能 php+redis是最常见的秒杀功能

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

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

2,下载redis

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

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

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

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

1; php_redis 2extension=php_igbinary.dll 3extension=php_redis.dll

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

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

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

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

1<?php 2/** 3 * Created by PhpStorm. 4 * User: lhl 5 * Date: 2018/8/20 6 * Time: 下午1:52 7 */ 8 9namespace module; 10 11 12class Redis extends \Redis 13{ 14 public static function redis() { 15 $con = new \Redis(); 16 $con->connect(config('redis.host'), config('redis.port'), 5); 17 return $con; 18 } 19} 20 21在thinkphp文件下的helper.php加入 22 23 24if (!function_exists('redis')) { 25 /** 26 * 获取容器对象实例 27 * @return Container 28 */ 29 function redis() 30 { 31 return \module\Redis::redis(); 32 } 33} 34 35然后就可以在控制器写redis缓存方法了 36//创建redis缓存 37\Cache::store('redis')->set(key, value); 38//读取缓存 39\Cache::store('redis')->get(key);

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

///秒杀入口

1 public function insva(){ 2 $id = input('id');//获取商品id 3 if(!$id){ 4 return $this->insertlog(0);//记录失败日志 5 } 6 $redis = $this->redis();//接入redis 7 $count = $redis->reduceStock('goods_stock');//减少库存,返回剩余库存 8 if($count ==0){ 9 $this->insertlog(0);//记录秒杀失败日志 10 return false; 11 }else{ 12 $order = $this->build_order_no();//随机生成订单号 13 $status = 1; 14 $data = db('goods')->where('id',$id)->find(); 15 if (!$data){ 16 return $this->insertlog(0);//商品不存在 17 } 18 $res = db('order')->insert(['order_sn'=>$order,'uid'=>$this->user_id,'goods_id'=>$id]);//插入订单 19 $stock = db('goods')->where('id',$id)->setDec('count');//减少库存 20 if($stock){ 21 $this->insertlog();//记录成功日志 22 }else{ 23 $this->insertlog(0);//记录秒杀失败日志 24 } 25 } 26 } 27 28 // 将商品库存存入队列 29 public function redisinit(){ 30 $store=50; // 库存50 31 $redis=$this->redis(); //接入redis 32 $redis->del('goods_store'); // 删除库存列表 33 $res=$redis->llen('goods_store'); //返回库存长度,这里已经是0 34 $count=$store-$res; 35 for($i=0;$i<$count;$i++){ 36 $redis->lpush('goods_store',1); //列表推进50个,模拟50个商品库存 37 } 38 } 39 40 //生成唯一订单 41 function build_order_no(){ 42 return date('ymd').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8); 43 } 44 45 46 47// 记录日志 状态1成功 0失败 48 function insertlog($status=1){ 49 return Db::name("ab_log")->insertGetId(["count"=>1,"status"=>$status,"addtime"=>date('Y-m-d H:i:s')]); 50 }

以上内容希望帮助到大家, 很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家 ,需要戳这里 PHP进阶架构师>>>实战视频、大厂面试文档免费获取

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

thinkphp+redis实现秒杀,缓存等功能 - HelloWorld