Laravel 缓存源码分析

本文深入分析了Laravel框架中的缓存机制,通过源码探讨了如何使用Cache门面调用缓存方法,如get和set。详细解释了Cache服务如何在服务容器中注册,以及CacheManager如何作为简单工厂实现,根据存储驱动创建对应的驱动实例。同时揭示了代理模式在IlluminateCacheRepository中的应用,用于提供便捷操作和事件触发。总结指出,Laravel缓存源码中融入了简单工厂和代理模式的设计思想。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

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

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

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

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

看下 Cache 服务类

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

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

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

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

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

 

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

调用createXxxxDriver   比如 

createFileDriver createMemcachedDriver createArrayDriver  createRedisDriver

这里以createRedisDriver为例

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

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

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

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

具体的实现类有 ArrayStore RedisStore  DatabaseStore等等

总结:

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

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

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

Illuminate\Contracts\Cache\Store这个接口的实现类来处理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值