一、redis的安装
1、下载地址
https://github.com/MSOpenTech/redis/releases
2、安装
解压到自定义目录
在当前目录运行dos
输入命令
redis-server.exe redis.windows.conf
或者直接打开
Paste_Image.png
便可运行redis
安转为系统服务
redis-server.exe --service-install redis.windows.conf
可以在服务中设置开机自动启动
Paste_Image.png
Paste_Image.png
3、测试redis
新打开一个dos窗口
运行
redis-cli.exe -h 127.0.0.1 -p 6379
或者直接运行
Paste_Image.png
set key value 存值
get key 取值
二、laravel安转redis的扩展
1、安转Composer包依赖工具
下载地址
https://getcomposer.org/download/
或运行
php -r "readfile('https://getcomposer.org/installer');" > composer-setup.php
php composer-setup.php
php -r "unlink('composer-setup.php');"
2、安转Composer包依赖工具
指定php.exe所在目录
Paste_Image.png
3、为laravel添加redis扩展
在laravel项目根目录运行dos命令
composer require predis/predis 1.0.*
然后等待自动下载跟新
默认的下载源下载较慢,可以跟新为中国镜像
composer config -g repo.packagist composer https://packagist.phpcomposer.com
三、laravel中使用redis
1、引入
use Illuminate\Support\Facades\Redis;
2、redis基本命令
Redis门面类可以通过魔术方法直接运行redis原生命令
//字符串存储
Redis::set($key,$val); //设置key值得val值。
Redis::get($key); //获取key值得val值。
Redis::del($key); //删除键值;
Redis::expire($key,time); //设置过期时间 time为秒
//队列
Redis::lpush($key,$val); //队列左侧插入一个$key,$val值,rpush右侧插入
Redis::lpop($key); //队列左侧弹出一个$key并返回$val值,rpush右侧弹出
//集合
Redis::sAdd($key,$val);//插入集合
Redis::sismember($key,$val);//判断$val是否在集合内
Redis::Smembers($key);//查询所有成员
//有序集合
Redis::zAdd($key,time(),$val);插入数据$key,索引,$val。索引为浮点型
Redis::zrevrange('test',0,10000);查询指定范围内的成员。
laravel缓存数据时需用serialize 和 unserialize 序列化数据
队列可用来存储http请求,限时秒杀可用
秒杀实例
/**
* 秒杀,使用redis缓存
* @param Request $req
*/
public function index(Request $req){
$userId=$req->user_id;//用户id
$goodsId=1;//商品id
Redis::lpush('list_'.$goodsId,$userId);//存入用户请求入队列
//文件锁
$fp = fopen("lock.txt", "w+");
if(flock($fp,LOCK_SH)){
$this->SecKill($goodsId,$fp);
}
while(1){
if(Redis::sismember('zige_list_' . $goodsId,$userId)){
echo('抢购成功' . '<br>');
break;
}
if(Redis::get('goods_num_' . $goodsId)==0){
echo('已经卖完了' . '<br>');
break;
}
}
}
/**
* 取出用户请求队列并处理
* @param $goodsId
* @param $fp
*/
public function SecKill($goodsId,$fp){
//将库存数量存入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){
$tmp = Redis::lpop('list_' . $goodsId);//取出队列的头部
$goodNum = Redis::get('goods_num_' . $goodsId);//查看库存
if($goodNum > 0){
//过滤已购买的用户
if(Redis::sAdd('zige_list_' . $goodsId, $tmp)){
Redis::Decrby('goods_num_' . $goodsId, 1);//redis库存减少
Test::add(['name' => $tmp]);//生成订单存入数据库
Goods::where(['id' => $goodsId])->decrement('num', 1);//修改数据库商品的库存
};
}else{
break;
}
//判断队列是否处理完成
if(Redis::lLen('list_'.$goodsId)){
break;
}
}
flock($fp,LOCK_UN);fclose($fp);
}