一、安装
1.下载redis。从下面地址下:https://github.com/MSOpenTech/redis/releases
2.打开dos命令栏,进入到redis的目录下面,输入以下命令:
redis-server.exe redis.windows.conf
3.测试,重新打开一个dos命令栏,进入到redis的目录下,输入以下命令:
redis-cli.exe -h 127.0.0.1 -p 6379
set key value 存值
get key 取值
二、安装Composer包依赖管理命令为laravel添加redis扩展。
1.安装Composer,选择php.exe所在目录。
2.为laravel添加redis扩展。
参考网址:http://www.tuicool.com/articles/E7Rfmq
在laravel项目更目录运行dos命令:
composer require predis/predis 1.0.*
配置redis,在config/database.php 中
'redis' => [ 'cluster' => false,
'default' => [ 'host' => '127.0.0.1',
'port' => 6379,
'database' => 0, ],
],
三、使用。
参考网址:
http://www.redis.net.cn/
引入文件
use Redis;
运行原始命令
Redis::command(命令,参数数组);
连接指定服务器
$redis = Redis::connection($host);默认连接默认的服务器。
字符
Redis::command('setnx',[$key,$val]);当$key没有时插入。
Redis::set($key,$val);设置key值得val值。
Redis::get($key);获取key值得val值。
Redis::del($key);删除键值;
Redis::command('Expire',[$key,秒]);过期时间。
队列
:
Redis::lpush($key,$val);往队列左侧插入一个val值,rpush右侧插入。
Redis::lpop($key);弹出队列左侧一个val值并返回val值,rpush右侧。
集合
:
Redis::sAdd($key,$val);插入集合;
Redis::sismember($key,$val);判断$val是否在集合内;
Redis::Smembers($key);查询所有成员。
有序集合:
Redis::zAdd('test',time(),'a',time(),'b');插入数据$key,索引,$val。
Redis::zrevrange('test',0,10000);查询指定范围内的成员。
代码实现:
<?php
namespace App\Http\Controllers;
use App\Models\Goods;
use App\Models\Test;
use Illuminate\Http\Request;
use Redis;
//秒杀控制器
class MiaoshaController extends Controller
{
/**
* 秒杀,使用redis缓存
* @param Request $req
*/
public function index(Request $req){
$userId=$req->user_id;//用户id
$goodsId=1;//商品id
//判断该商品在redis中是否有库存,将库存数量存入redis
if(!Redis::command('EXISTS',['goods_num_'.$goodsId])){
$num=Goods::getOne(['id'=>$goodsId])->num;//通过数据库查询得到;
Redis::set('goods_num_'.$goodsId,$num);//设置库存
Redis::command('Expire',['goods_num_'.$goodsId,600]);//设置过期时间
}
//如果还有库存就提示抢购成功
while(1){
//判断该用户是否抢购过该商品了
if(!Redis::sismember('zige_list_' . $goodsId,$userId)){
//用户购买该商品,把该商品加入redis的队列中,
Redis::lpush('list_'.$goodsId,$userId);//存入用户请求入队列
Redis::lpush('zige_list_'.$goodsId,$userId);//长期存放在redis中做判断
Redis::Decrby('goods_num_' . $goodsId, 1);//商品加入redis中redis库存减少
echo('抢购成功' . '<br>');
break;
}
//如果库存为0了,就说明这里的商品抢玩了
if(Redis::get('goods_num_' . $goodsId)==0){
echo('已经卖完了' . '<br>');
break;
}
}
}
/**
* 取出redis中的商品秒杀的消息队列存入mysql中
* @param $goodsId
* @param $fp
*/
public function SecKill($goodsId,$fp){
//处理队列
//取出队列的头部
$tmp = Redis::lpop('list_' . $goodsId);
while($tmp){
//把取出的数据加入到mysql中
Order::edit([$where],$info);
$tmp = Redis::lpop('list_' . $goodsId);//取出队列的头部
}else{
//队列中没有数据,停止
break;
}
}
}
网友评论