首页 > 数据库 >【心得】TP6使用Redis进行处理商城秒杀

【心得】TP6使用Redis进行处理商城秒杀

时间:2023-09-16 11:33:59浏览次数:70  
标签:goods return Redis redis TP6 秒杀 心得 id store

书接上回,上次分享了TP6对于Redis的基础使用,那么今天就为大家带来一个简单的,使用场景很高的心得代码风险,Redis在商城秒杀的使用,该代码为简单分享能解决一些基础后续可以根据自己所需进行业务重构。

image.png

读这篇文章的我就默认大家已经环境都安装好了,如果不知道怎么安装的可以传送到这里

https://blog.51cto.com/u_16240159/7486573

整体业务流程

1.在准备秒杀时,先将当前参与秒杀的的产品进行入队处理 2.进入秒杀页面处理当前的用户是否进入到队列

业务代码逻辑

首先在extend文件夹下新建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')]);
    }

以上就是简单的一个实现高并发,秒杀的代码了,有啥问题可以互相交流指正

标签:goods,return,Redis,redis,TP6,秒杀,心得,id,store
From: https://blog.51cto.com/u_16240159/7491818

相关文章

  • ZB集团的HIS系统的后期管理维护中的一些心得体会
    忙忙碌碌,时间好快,已经三年过去,不经意间发现,留存在草稿箱的第一篇随笔是三年期的,说实话,三年前很忙,现在似乎也没闲下来! 那时候的自己是一名某医疗集团的CTO(信息部主管),设计互联网大大小小的事情都要经手,实在是心力交瘁,尽管如此,我却甘之如饴,因为,在那几年我学到了很多,我相信,每个人在......
  • [粘贴]github-redis-rdb-cli
    redis-rdb-cliAtoolthatcanparse,filter,split,mergerdbandanalyzememoryusageoffline.Itcanalsosync2redisdataandallowuserdefinethereownsinkservicetomigrateredisdatatosomewhere.  ChatwithauthorContracttheauthorchen.b......
  • 【心得】TP6 使用redis基础
    在业务场景中,我们会面对一些对于不经常更改的数据,但是会频繁访问,会对数据库造成不必要的负载,以及对于一些高并发的处理我们都需要用到缓存的技术,目前主流使用的缓存有MemChachedRedis等,当然我们也有TP框架自带的缓存。但是今天我给大家带来的是redis的基础使用。第一步安装red......
  • Redis7 10大数据类型(Redis集合)
    一、常用二、单值多value,且无重复三、案例SADDkeymember[member...]添加元素SMEMBERSkey遍历集合中的所有元素SISMEMBERkeymember判断元素是否在集合中SREMkeymember[member...]删除元素scard获取集合里面的元素个数SRANDMEMBERkey[数字]从集合中随机展现......
  • linux上安装redis保姆级教程
    1、执行下面的命令下载redis:wgethttps://download.redis.io/releases/redis-6.2.6.tar.gz 2、解压tar-zxvfredis-6.2.6.tar.gz 3、安装gccyuminstallgcc-c++makemakeinstall  4、redis默认安装位置:/usr/local/bin配置文件所在目录:安装目录/redis/redis-......
  • 本地搭建的Redis集群中实现配置DB0到DB255
    要在本地搭建的Redis集群中实现配置DB0到DB255,需要执行以下步骤:1.编辑Redis配置文件(redis.conf):使用文本编辑器打开redis.conf文件,找到以下配置项:```#Setthenumberofdatabases.ThedefaultdatabaseisDB0,youcanselect#adifferentoneonaper-connect......
  • redis批量先查缓存再查数据库
    RedisUtil:/***批量查询缓存,若是缓存没有的数据再调用对应的方法查询数据,查询之后放入缓存*@paramprefix缓存前缀*@paramparams缓存参数*@paramcolumn缓存参数对应字段列名*@paramdataBaseFunction数据库查询方法*@return......
  • redis配置(二)
    1.redis扩展:redis服务可以使用相关程序写代码去连接服务.redis服务(可以理解为一个很屌的Socket服务端程序)________________________________________|||PHP扩展java相关客户端库调用python相关包调......
  • Redis SCAN:实现key的模糊匹配的科学方法
    目录scan基本介绍shell使用scan最基本的scan带匹配模式和count的scanjava中使用hscanscan基本介绍在使用redis的时候,我们经常涉及到这样的需求:模糊搜索key,即找出满足特定匹配模式的所有key。但是,如果使用像keys和hkyes这样的方法的话,当key的数量特别多时,效率会很慢,而且对线......
  • Redis高级客户端Lettuce详解
    Lettuce是一个高性能基于Java编写的Redis驱动框架,底层集成了ProjectReactor提供天然的反应式编程,通信框架集成了Netty使用了非阻塞IO,5.x版本之后融合了JDK1.8的异步编程特性,在保证高性能的同时提供了十分丰富易用的API,5.1版本的新特性如下:支持Redis的新增命令ZPOPMIN,ZPOPMAX,BZ......