博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
thinkphp5 mysql缓存_thinkphp+redis实现秒杀,缓存等功能
阅读量:6902 次
发布时间:2019-06-27

本文共 2586 字,大约阅读时间需要 8 分钟。

秒杀是商城常见功能 php+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_redis

extension=php_igbinary.dll

extension=php_redis.dll

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

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

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

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

/**

* Created by PhpStorm.

* User: lhl

* Date: 2018/8/20

* Time: 下午1:52

*/

namespace module;

class Redis extends \Redis

{

public static function redis() {

$con = new \Redis();

$con->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

$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')]);

}

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

转载地址:http://ooodl.baihongyu.com/

你可能感兴趣的文章
算法与数据结构之翻转问题
查看>>
【第二组】项目冲刺(Alpha版本) 第一次每日例会 2017/7/10
查看>>
软件运行过慢?系统打开特别慢?连系统都装不了?可能是硬盘坏了
查看>>
JDBC查询结果集ResultSet--示意图
查看>>
Mongo的安全验证
查看>>
Python的安装位置与Python库
查看>>
thinkphp Class 'PDO' not found 错误
查看>>
(实用篇)PHP ftp上传文件操作类
查看>>
完成注册功能
查看>>
职场规划从“试错”开始
查看>>
AtCoder - 2568 最小割
查看>>
Lucene5.x 中文 同义词
查看>>
【转载】Cookie/Session机制详解
查看>>
ASCII码、Unicode码 转中文
查看>>
java 不通过第三个字符串,实现一个字符串倒序
查看>>
map/reduce
查看>>
矩阵的相似对角化
查看>>
weixinJSDDK
查看>>
eclipse手动安装svn和maven
查看>>
权限管理 (二) 实现中几个问题
查看>>