Laravel 缓存源码分析

绝地灬酷狼 2023-06-12 09:47 24阅读 0赞

在laravel中使用缓存一般是 use Illuminate\Support\Facades\Cache; 缓存门面来调用缓存方法 get set 等等方法

比如使用 Cache::get(); 进入Cache Faced类里发现

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2pheWxhb3pob3U_size_16_color_FFFFFF_t_70

Cache 继承了 Illuminate\Support\Facades 当调用get方法时就调用了 Facede类中的 魔术方法__callStatic

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2pheWxhb3pob3U_size_16_color_FFFFFF_t_70 1

最终是从服务容器中获取到 cache这个对象,那么这个服务是什么时候注册到容器的呢

laravel框架里的服务提供者 有的核心服务 在框架启动的时候就已经注册了 有的自定义服务 是在接受请求时

  1. Illuminate\Foundation\Http\Kernel---------> $this->bootstrap(); 这个方法启动引导程序的时候 注册服务的

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2pheWxhb3pob3U_size_16_color_FFFFFF_t_70 2

将config/app里的 服务 执行register方法 注册进容器里面

看下 Cache 服务类

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2pheWxhb3pob3U_size_16_color_FFFFFF_t_70 3

register方法中 有三个绑定 可以看到cache绑定了CacheManager这个对象

在Facede门面中的 __callStatic方法中 最后一行

  1. return $instance->$method(...$args);

也就是相当于 (new CacheManager())->$method(…$args)了

CacheManager 实现了Factory接口 即实现了一个简单工厂,传入存储驱动名,返回对应的驱动实例

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2pheWxhb3pob3U_size_16_color_FFFFFF_t_70 4

进入CacheManager 这个类中 发现 没有 put putMany increment等操作缓存的方法 但是最后一行有个__call魔术方法

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2pheWxhb3pob3U_size_16_color_FFFFFF_t_70 5

20191112140301463.png

20191112140321184.png

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2pheWxhb3pob3U_size_16_color_FFFFFF_t_70 6

调用createXxxxDriver 比如

  1. createFileDriver createMemcachedDriver createArrayDriver createRedisDriver

这里以createRedisDriver为例

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2pheWxhb3pob3U_size_16_color_FFFFFF_t_70 7

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2pheWxhb3pob3U_size_16_color_FFFFFF_t_70 8

  1. $repository = new Repository($store); 根据传入的驱动对象 返回相对应的Respository对象

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

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

Illuminate\Contracts\Cache\Store\Store接口 是缓存驱动实际处理缓存如何写入读取删除的类

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2pheWxhb3pob3U_size_16_color_FFFFFF_t_70 9

具体的实现类有 ArrayStoreRedisStore DatabaseStore等等

总结:

从源码中可以看到 运用了两种设计模式 简单工厂和代理模式

  1. 简单工厂:Illuminate\Cache\CacheManage 根据配置文件里 缓存驱动 来实例化 缓存实例对象

代理模式: Illuminate\Cache\Repository 实现代理模式 具体的实现由

  1. Illuminate\Contracts\Cache\Store这个接口的实现类来处理

发表评论

表情:
评论列表 (有 0 条评论,24人围观)

还没有评论,来说两句吧...

相关阅读

    相关 mybatis一级缓存分析

      MyBatis执行SQL语句之后,这条语句就是被缓存,以后再执行这条语句的时候,会直接从缓存中拿结果,而不是再次执行SQL 这也就是大家常说的MyBatis一级缓存,一