章节索引 :

缓存的使用

1.前言

缓存的主要目的是保存上一次访问过且没有过期的数据,合理地使用缓存可以很好地提升访问速度,ThinkPHP 框架提供内置支持的缓存类型包括 filememcachewincachesqliteredis,本小节介绍这几种缓存是如何配置的,配置好缓存之后就可以使用缓存来存储数据,在缓存的数据没有过期之前,再次请求该数据的时候可以直接从缓存中取出来。

2.缓存配置文件

打开 config\cache.php,设置如下内容:

<?php

// +----------------------------------------------------------------------
// | 缓存设置
// +----------------------------------------------------------------------

return [
    // 默认缓存驱动
    'default' => env('cache.driver', 'file'),

    // 缓存连接方式配置
    'stores'  => [
        'file' => [
            // 驱动方式
            'type'       => 'File',
            // 缓存保存目录
            'path'       => '../runtime/study/',
            // 缓存前缀
            'prefix'     => '',
            // 缓存有效期 0表示永久缓存
            'expire'     => 0,
            // 缓存标签前缀
            'tag_prefix' => 'tag:',
            // 序列化机制 例如 ['serialize', 'unserialize']
            'serialize'  => [],
        ],
        // redis缓存
        'redis'   =>  [
            // 驱动方式
            'type'   => 'redis',
            // 服务器地址
            'host'       => env('REDIS.HOST', '127.0.0.1'),
        ],
    ],
];

如下图所示:
图片描述

Tips: 其中默认缓存驱动中的 env('cache.driver', 'file') 表示从 .env 文件中出 [CACHE] 模块下的 DRIVER 变量的值,默认是 fileredis 配置中的 env('REDIS.HOST', '127.0.0.1') 也是同理。

3.配置 .env 文件

打开 .env 文件,加入如下类容:

[CACHE]
DRIVER = file

[REDIS]
HOST = 127.0.0.1

如下图所示:
图片描述

Tips: redis 的配置需要根据实际的 ip 去填写,为了学习方便,这里可以将 DRIVER 设置为 file,表示默认使用文件缓存,若实际业务中,可以根据配置好的 redis,将 DRIVER 设置为 redis 也可以。

4.设置和取出缓存

app\controller\Index.php 中的 index() 方法加入如下代码:

        Cache::set('access_token',"zmxlspwoigydhxnmslqo",3600);
        halt(Cache::get('access_token'));

如下图所示:
图片描述

Tips: 其中 Cache::set('access_token',"zmxlspwoigydhxnmslqo",3600) 表示给 access_token 这个缓存名设置一个值 zmxlspwoigydhxnmslqo ,过期时间为 3600s 之后,在 3600s 之内该值就会一直保存在缓存中,注意第二参数也能保存一个数组。

请求打印结果如下图:
图片描述

5.缓存标签

可以将同一类缓存加上同一个标签,这样在需要同时清理的时候就会很方便:

        Cache::tag('study')->set('name1','qsx1',10);
        Cache::tag('study')->set('name2','qsx2',10);
        Cache::tag('study')->set('name3','qsx3',10);
        Cache::tag('study')->set('name4','qsx4',10);
        Cache::tag('study_01')->set('name5','qsx5',10);
        $name1 = Cache::get('name1');
        $name2 = Cache::get('name2');
        $name3 = Cache::get('name3');
        $name4 = Cache::get('name4');
        $name5 = Cache::get('name5');
        print_r([$name1,$name2,$name3,$name4,$name5]);
        //清除 tag = study 的所有缓存
        Cache::tag('study')->clear();

        $name1 = Cache::get('name1');
        $name2 = Cache::get('name2');
        $name3 = Cache::get('name3');
        $name4 = Cache::get('name4');
        $name5 = Cache::get('name5');
        print_r([$name1,$name2,$name3,$name4,$name5]);die;

如下图所示:
图片描述

Tips: 其中 Cache::tag('study')->clear(); 表示将打过 tagstudy 的缓存清除掉,可以使用 Cache::tag('study')->append('namex') 这种方式给没有打标签的缓存打上标签。

请求打印结果如下图:
图片描述

6.小结

本小节主要介绍了如何配置缓存,若要更换默认缓存方式,可以在 .env 文件中将 [CACHE] 变量模块下的 DRIVER 设置为对应的缓存方式,如 redisfile,缓存的主要目的是保存上一次访问过且没有过期的数据,合理地使用缓存可以很好地提升访问速度,有些场景下某些值不能频繁获取,需要将该值在有效期时间内缓存起来,例如使用微信公众平台等接口时获取 access_token,有效期 7200s,在有效期内限制了获取 access_token 的次数,此时使用缓存将会变得很方便。

Tips: 代码仓库:https://gitee.com/love-for-poetry/tp6