thinkphp redis队列处理_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查看扩展是否成功安装

a100eba5430ce4494a03f60e95ad0627.png

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

b89e49b95c0680b436ad136e3839af4d.png

然后在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 moduleRedis::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')]);
    }

以上内容希望帮助到大家,更多PHP大厂PDF面试文档,PHP进阶架构视频资料,PHP精彩好文可以访问:

四年精华PHP技术文章整理合集——PHP框架篇

四年精华PHP技术文合集——微服务架构篇

四年精华PHP技术文合集——分布式架构篇

四年精华PHP技术文合集——高并发场景篇

四年精华PHP技术文章整理合集——数据库篇

作者:生活就像面向对象
来源:博客园
地址:https://www.cnblogs.com/phpclass/p/10735908.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值