zoukankan      html  css  js  c++  java
  • Laravel入坑指南(12)——最终章:Session、缓存与Redis

    因为web服务除了业务准确之外,我们最关注的就是服务的性能。鉴于web服务几乎都是IO密集型,我们为了提高IO的速度,自然不能把所有的数据都放在关系型数据库中。而redis的并发与性能可以很好地帮我们解决这个问题,并且php语言对redis接口是非常友好的,所以redis就自然而然成为我们关注的焦点。

    关于redis的话题,我们在第6节中已经讨论过了。今天我们要讨论的是基于redis,如何使用Laravel的缓存机制,以及如何将session行为数据存储在redis中。

    1、缓存机制:Cache

    虽然,我们可以直接使用Redis类直接对我们的数据进行存取。但是在缓存的运用场景有时比较繁琐,我们会把Redis提供的API进行一层封装。而Laravel提供的Cache类就是对Redis进行一层封装。要注意:(划重点)Cache是对底层缓存机制做一层封装,但是Cache的底层不一定是redis,Laravel的缓存可以由文件、数据库、memcached以及redis进行存储。

    1) 配置文件

    缓存相关的配置文件是/config/cache.php。

    看到上面这一项,我们不难联想到要使用redis作为我们缓存的存储介质,所以我们需要在/.evn文件中加上配置项:

    CACHE_DRIVER=redis

    接着,我们需要关注cache所关联的redis如何配置。在default配置项下,我们可以看到stores配置项,里面有redis项:

    这个配置项,没有关于redis的服务器地址、端口等信息,这是为什么呢?这两项的意思是,cache的驱动使用Laravel的redis驱动配置,连接则使用这个驱动下的cache配置项。小伙伴是否还记得Laravel的redis在哪里配置?没错,就是在/config/database.php中。现在让我们一起打开database.php这个配置文件,我们可以看到这一项:

     所以,我们其实早在第6节的时候,已经配置好了。

    2) 存取缓存

    //获取对应key的值
    Cache::get('key'); 
    
    //获取对应key的值,如果不存在返回default
    Cache::get('key', 'default');
    
    //设置key的值为value,时长600秒
    Cache::put('key', 'value', 600);
    
    //只有在缓存不存在时才会添加数据
    Cache::add('key', 'value', $seconds);
    
    //持久化数据
    Cache::forever('key', 'value');
    
    //缓存闭包,缓存项不存在的话闭包的结果将会被返回
    $value = Cache::get('key', function() {
        return DB::table(...)->get();
    });
    
    //缓存项不存在的话闭包的结果将会被返回,并保存到缓存中$second秒
    $value = Cache::remember('users', $seconds, function() {
        return DB::table('users')->get();
    });
    
    //缓存项不存在的话闭包的结果将会被返回,并永存保存到缓存中
    $value = Cache::rememberForever('users', function() {
        return DB::table('users')->get();
    });
    
    //判断key是否存在
    if (Cache::has('key')) {}
    
    //增减
    Cache::increment('key');
    Cache::increment('key', $amount);
    Cache::decrement('key');
    Cache::decrement('key', $amount);
    
    //移除缓存
    Cache::forget('key');
    Cache::put('key', 'value', 0);
    
    //清除所有缓存
    Cache::flush();
    
    //从指定的存储介质中读取缓存数据
    Cache::store('file')->get('foo');
    
    //锁,示例1,锁定10秒
    if (Cache::lock('foo', 10)->get()) {
    
        Cache::lock('foo')->release();
    }
    
    //锁,示例2,闭包形式,业务完成时自动释放
    Cache::lock('foo')->get(function () {
        
    });
    
    //锁,示例3,在锁定的时候无效,可以等待5秒钟
    $lock = Cache::lock('foo', 10);
    try {
        $lock->block(5);
    
    } catch (LockTimeoutException $e) {
        // Unable to acquire lock...
    } finally {
        optional($lock)->release();
    }
    
    //锁,示例4,闭包形式,在锁定的时候无效,可以等待5秒钟
    Cache::lock('foo', 10)->block(5, function () {
        
    });

    2、Session

    1) session的使用

    //下面所有的$request都是Request的实例
    $request->session()->get('key', 'default');
    
    //如果key不存在则返回闭包函数的内容
    $value = $request->session()->get('key', function() {
        return 'default';
    });
    
    //获取session中所有数据
    $data = $request->session()->all();
    
    //判断对应的key是否存在
    $request->session()->has('users');
    
    //存储数据
    $request->session()->put('key', 'value');
    
    //删除数据
    $request->session()->forget('key');
    $request->session()->forget(['key1', 'key2']);
    $request->session()->flush();
    
    //重新生成session id
    $request->session()->regenerate();

    这时候,我们使用$request下的session()成员函数,会报错:“Session store not set on request”。这时有两种解决办法:

    方法一:不要通过$request获取session,而是使用Laravel提供的session()辅助函数。

    方法二:在/app/Http/Kernel中,将StartSession中间件从web中移到全局位置。如下图:

    2) 存储介质

    通常,我们想把session的存储介质设置为redis,方便集群时session数据共享。这时,我们就需要设置/config/session.php配置文件中的driver和store两个配置项。

    'driver' => env('SESSION_DRIVER', 'file'),
    'connection' => env('SESSION_CONNECTION', null),

    所以我们需要在/.env中增加两项:

    SESSION_DRIVER=redis
    SESSION_CONNECTION=session

    其次,我们需要在/config/database.php的redis这一项中添加session项:

     这一步设置完成后,我们向session中写入数据就会保存的redis中。

    原计划,这是Laravel系列的最后一篇了。但是博主再三思量,对于刚入坑小伙伴我们还有一个不得不说的故事。所以这个系列会再出一个番外篇,那我们下期见咯:)

    ---------------------------  我是可爱的分割线  ----------------------------

    最后博主借地宣传一下,漳州编程小组招新了,这是一个面向漳州青少年信息学/软件设计的学习小组,有意向的同学点击链接,联系我吧。

  • 相关阅读:
    核心动画03-图标抖动.mp4
    核心动画02-CAKeyframeAnimation帧动画
    核心动画01-CABasicAnimation
    CALayer参考文献
    CALayer04-自定义图层
    CALayer03-隐式动画
    CALayer02-创建新图层
    iOS开发中的网络请求
    IT教育课程考评系统开发-06
    IT教育课程考评系统开发-05
  • 原文地址:https://www.cnblogs.com/ddcoder/p/13437759.html
Copyright © 2011-2022 走看看