当前位置: 首页 > news >正文

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

秒杀是商城常见功能  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文件

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

 

转载于:https://www.cnblogs.com/phpclass/p/10735908.html

相关文章:

  • (JS基础)String 类型
  • django2中表单的使用二
  • css学习_css布局案例
  • jsp简单介绍
  • python inspect模块
  • 通过SQL脚本来查询SQLServer 中主外键关系
  • python的pandas库学习笔记
  • 最全的前端模块化方案
  • 深入浅出了解“装箱与拆箱”
  • 力扣算法题—091解码
  • 如何利用在线画图网站绘制流程图
  • 软件原型设计工具Axure
  • 数据脱敏(一)--基础知识
  • linux-高并发与负载均衡-lvs-DR模型试验
  • Guns 旗舰版 2.4 发布,更简洁的管理系统
  • ----------
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • 【译】理解JavaScript:new 关键字
  • Android 架构优化~MVP 架构改造
  • dva中组件的懒加载
  • JavaScript中的对象个人分享
  • magento 货币换算
  • mysql_config not found
  • webpack入门学习手记(二)
  • 那些年我们用过的显示性能指标
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 使用parted解决大于2T的磁盘分区
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 通过git安装npm私有模块
  • 由插件封装引出的一丢丢思考
  • 再谈express与koa的对比
  • hi-nginx-1.3.4编译安装
  • # Maven错误Error executing Maven
  • #NOIP 2014#Day.2 T3 解方程
  • #pragma预处理命令
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • $.ajax()参数及用法
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (原創) 未来三学期想要修的课 (日記)
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (转)Google的Objective-C编码规范
  • (转)Mysql的优化设置
  • (转)VC++中ondraw在什么时候调用的
  • (转)重识new
  • .Net MVC + EF搭建学生管理系统
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .net 怎么循环得到数组里的值_关于js数组
  • .NET 中 GetProcess 相关方法的性能
  • .NET/C# 使窗口永不获得焦点
  • .Net转Java自学之路—SpringMVC框架篇六(异常处理)
  • .pyc文件是什么?