ThinkPHP5.0源码学习之缓存Cache(一)
一、文件
1、缓存配置文件:thinkphp\convention.php
2、缓存文件:thinkphp\library\think\Cache.php
3、驱动目录:thinkphp\library\think\cache\driver,包含8个文件:File.php、Lite.php、Memcache.php、Memcached.php、Redis.php、Sqlite.php、Wincache.php、Xcache.php,通过文件名可知其对应的缓存类型。
二、缓存配置
在全局配置文件convention.php中可以看到,type就是驱动方式,默认使用的是File文件驱动,实例化的是\think\cache\driver\File.class。可以通过修改type来使用不同的驱动。
三、Cache.php文件分析
$instance-缓存的实例
$readTimes-缓存读取次数
$writeTimes-缓存写入次数
$handler-操作句柄
1、缓存初始化
首先,句柄handler为空时才会去初始化对象,否则直接返回句柄。
其次,通过传入不同的配置信息,连接对应的缓存驱动。
2、连接缓存驱动
第50行: $name = md5(serialize($options));
将配置参数进行序列化(serialize)后,再进行md5操作,得到的结果作为缓存对象索引;
第53行: if (true === $name || !isset(self::$instance[$name])) {}
检查$instance中是否存在对应索引的缓存对象
第54-56行: $class = false === strpos($type, '\\') ? '\\think\\cache\\driver\\' . ucwords($type) : $type;
class的名字由type决定, 如果type没有包含反斜线, 则class = \think\cache\driver\.ucwords($type),
而框架是把think作为核心目录的别名,所以其真实路径为\thinkphp\libray\\think\driver\.ucwords($type),
再根据自动加载,去该文件夹下加载对应的对象;
第65行: self::$instance[$name] = new $class($options);
通过这句代码可以知道init()方法中句柄的内容,是这个方法中创建的缓存对象,并通过第67行的return返回。
connect的目的是:return new $class($option),如果是true,就不存,如果是flase,就存到$instance[$name]里面。
四、缓存驱动接口
方法名 | 用途 |
参数
|
public static function has($name){}
|
判断缓存是否存在
|
$name 缓存变量名
|
public static function get($name, $default = false){}
|
读取缓存 |
$name 缓存变量名
$default 默认值
|
public static function set($name, $value, $expire = null){}
|
写入缓存 |
$name 缓存变量名
$value 存储数据
$expire 有效时间 0为永久
|
public static function inc($name, $step = 1){} | 自增缓存 |
$name 缓存变量名
$step 步长
|
public static function dec($name, $step = 1){}
|
自减缓存 |
$name 缓存变量名
$step 步长
|
public static function rm($name){}
|
删除缓存 |
$name 缓存标识
|
public static function clear($tag = null){}
|
清除缓存 |
$tag 标签名
|
public static function pull($name){}
|
读取缓存并删除
|
$name 缓存变量名
|
public static function remember($name, $value, $expire = null){}
|
如果不存在则写入缓存
|
$name 缓存变量名
$value 存储数据
$expire 有效时间 0为永久
|
public static function tag($name, $keys = null, $overlay = false)
|
缓存标签 |
$name 标签名
$keys 缓存标识
$overlay 是否覆盖
|
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现