使用redis缓存数据

一、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所在目录


使用redis缓存数据_第1张图片
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('抢购成功' . '
'); break; } if(Redis::get('goods_num_' . $goodsId)==0){ echo('已经卖完了' . '
'); 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); }

你可能感兴趣的:(使用redis缓存数据)