使用


直接使用Laravel为我们提供的Facade

支持的大部分方法:

其他使用方法请参照官方翻译(中文)文档: https://learnku.com/docs/lara…

源码


Laravel 中常用 Cache Facade 来操作缓存, 对应的实际类是 Illuminate\Cache\CacheManager 缓存管理类(工厂).

Cache::xxx()

我们通过 CacheManager 类获取持有不同存储驱动的 Illuminate\Cache\Repository 类

CacheManager::store($name = null)

Repository 仓库类代理了实现存储驱动接口 Illuminate\Contracts\Cache\Store 的类实例.

Cache Facade

首先从 Cache Facade 开始分析, 先看一下其源码:

在配置文件 config\app.php 中定义了 Cache 服务提供者

Illuminate\Cache\CacheServiceProvider 源文件:

通过上面源码可知, Cache Facade 关联的项是 Illuminate\Cache\CacheManager, 也就是我们通过 Cache Facade 实际调用的是 CacheManager实例的方法.

CacheManager

<?php

namespace Illuminate\Contracts\Cache;

interface Factory
{
    /**
     * Get a cache store instance by name.
     *
     * @param  string|null  $name
     * @return \Illuminate\Contracts\Cache\Repository
     */
    public function store($name = null);
}

CacheManager 实现了 Illuminate\Contracts\Cache\Factory 接口(↑), 即实现了一个简单工厂, 传入存储驱动名, 返回对应的驱动实例。

CacheManager实现的简单工厂接口方法:

可以看到 CacheManager 提供了会话级别的实例缓存, 当解析驱动名时, 它会按如下顺序解析:

  1. 自定义驱动: 查看是否有通过 CacheManager::extend(…)自定义的驱动
  2. Laravel提供的驱动: 查看是否存在 CacheManager::createXxxDriver(…)方法

这些方法返回的实例必须是实现了 Illuminate\Contracts\Cache\Repository 接口

本质上, CacheManager 就是一个提供了会话级别缓存的 Repository 实例工厂, 同时它提供了一个 __call 魔术方法, 以便快速调用默认缓存驱动。


Repository


Illuminate\Contracts\Cache\Repository 接口


Repository 是一个符合 href=”http://www.baidu.com/link?

url=9LkUzilH74QMr6SuXLs5wqzeJAXlxKxOoz7qJLQSMmy8JHcYUiJj_wtVBslGK2dB”>PSR-16: Common Interface for Caching Libraries 规范的缓存仓库类, 其在Laravel相应的实现类: Illuminate\Cache\Repository


Illuminate\Cache\Repository 部分代码如下:

从源码可以看出, Illuminate\Cache\Repository 实现了代理模式, 具体的实现是交由 Illuminate\Contracts\Cache\Store 来处理, Repository 主要作用是

  1. 提供一些便捷操作(可以理解为语法糖)
  2. Event 事件触发, 包括缓存命中/未命中、写入/删除键值


Store


Illuminate\Contracts\Cache 缓存驱动是实际处理缓存如何写入/读取/删除的类, 接口内容如下:

<?php

namespace Illuminate\Contracts\Cache;

interface Store
{
    public function get($key);
    public function many(array $keys);
    public function put($key, $value, $minutes);
    public function putMany(array $values, $minutes);
    public function increment($key, $value = 1);
    public function decrement($key, $value = 1);
    public function forever($key, $value);
    public function forget($key);
    public function flush();
    public function getPrefix();
}

具体的实现类有:

  • ApcStore
  • ArrayStore
  • NullStore
  • DatabaseStore
  • FileStore
  • MemcachedStore
  • RedisStore