在thinkphp5.0框架使用redis,redis支持五种数据类型 string hash list set zset
<?php
namespace app\index\controller;
use think\db;
class Index
{
/**
* 模拟商品的总库存
*/
private $goods_count=100;
private $redis;
public function __construct(){
$this->redis = $this->redisConnect();
}
/**
* redis链接
* @return \Redis
*/
public function redisConnect(){
$redis = new \Redis();
$redis->connect('127.0.0.1',6379);
return $redis;
}
public function shop(){
$msg = [];
$uid = mt_rand(1000,9999);
$len = $this->redis->HLEN('goods_users');
// echo $len;exit;
$goodsid = time();
if($len<=$this->goods_count){
// $this->redis->delete('goods_user_queue');exit;
//判断用户是已经抢购了商品
if(!($this->redis->hExists('goods_users','user_'.$uid))){
$data= [
'user_'.$uid =>$uid,
'goodsid' =>$goodsid
];
$this->redis->hset('goods_users','user_'.$uid,$uid);
//如果没有抢到商品加入到队列
$this->redis->lpush('goods_user_queue',json_encode($data));
$msg['status']=1;
$msg['msg'] = '恭喜你抢购成功';
}else{
$msg['status'] = 2;
$msg['msg'] = 'sorry您已经购买过该商品了,只能参加一次';
}
}else{
$msg['status'] = 3;
$msg['msg'] = '活动已经结束';
}
echo json_encode($msg);
}
//跑定时任务
public function insertdata(){
$len = $this->redis->lLen('goods_user_queue');
if($len){
//如果redis存在购买信息则减少库存
$datajson = $this->redis->lPop('goods_user_queue');
$data = json_decode($datajson,true);
$where['id'] = $data['goodsid'];
//库存-1
db('goods')->where($where)->update(['goodsnum'=>'goodsnum-1']);
//写入订单表
db('order')->insert(['goodsid'=>$data['goodsid'],'uid'=>$data['userid']]);
}
}
}