ThinkPHP缓存源码深度解析(2)

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: ThinkPHP缓存源码深度解析


二、缓存cache获取的执行流程以及源码解析

既然学习了缓存设置的源码解析,那么也应该来简单的了解一下缓存获取的源码解析。


同样演示案例还是之前的那个,只不过是把set换为get即可


image.png


跟设置缓存的流程是一样的,首先会来到门面类中创建缓存的对应实例


image.png


门面类创建了缓存类的时候之后就会来到cache类这个文件thinkphp/library/think/Cache.php


在这个文件中可以看到还是使用了__call方法,这个方法就是调用不存在的方法会执行。


image.png


接着会来到这init方法,这个方法在设置缓存值的时候已经进行深入讲解了。


根据执行流程我们将会看到init这个方法自动初始化缓存(这里需要注意,第一次并不是在这里进行执行的,而是make方法,当make方法执行完后会把值存放在handler这个属性,第二次通过call方法进来之后就直接返回了,而不会在进行一次执行,这里一定要注意)


这里为什么先会执行cache的make方法,是因为在容器中创建cache类实例的时候会在make方法中判断类中是否存在make方法,如果存在就会先进行执行。


image.png


所以说在cache这个类中return call_user_func_array([$this->init(), $method], $args);这块代码会去执行thinkphp/library/think/cache/driver/File.php这个类的get方法


image.png


在这个类中你可以看到一个在设置缓存值时花了好久解析的一个方法getCacheKey


在这个方法中主要就是使用了sbustr来进行了加密值的节,前俩个值为目录,其余字符为文件名。


然后将文件名给返回出去。


image.png


然后就使用file_get_contents来将文件的内容获取出来


image.png


然后可以接着往下看,在这里有一个过期删除缓存文件。


框架中的过期策略是当你设置了过期时间时,缓存过期后不会直接删除而是当你再一次访问之后才会进行删除。


这种策略就是redis中的惰性删除,当我们使用惰性删除时,数据到期了也不会自动删除,那么他的删除方式是,在下一次在获取这个key值时,会做一个判断,判断这个key是否过期,如果过期了在执行删除。


image.png


截止到这里关于缓存获取的执行流程已经源码解析就完成了,其实大多数内容在获取的时候就已经解析完了。


那为什么还是要在聊一下获取缓存数据,那是因为在这里还需要给大家在解释一些东西。


三、数据压缩

在设置缓存的时候将缓存的值写入文件时有过一个函数gzcompress


然而在获取缓存值的时候从文件将数据读出时又遇到的一个函数gzuncompress


其实从设置缓存和获取缓存的这俩个功能中就可以看出,设置的为压缩数据,获取的解压数据。


在PHP中关于压缩函数还有其它俩个分别为gzdeflate、gzencode,同样的解压函数也是对应的gzinflate gzdecode


这几个函数虽说都是压缩函数,但是底层实现是不一样的。


gzcompress使用的是ZLIB格式;


gzdeflate使用的是纯粹的DEFLATE格式;


gzencode使用的是GZIP格式;


以上就是关于数据压缩和解压的一些知识,了解即可。


四、总结

在这一节中咔咔带大家领略了框架对于缓存的处理结果。


其实咔咔之前测试过关于框架自带的缓存响应时间应该会缩短三分之一,当然这个也是根据数据量的大小有区别的。


至此关于PHP框架ThinkPHP的源码解读到这里就结束了,后期如果有时间将会对其中一些没有提到的内容在进行解读。


最后说一句阅读源码是真的累。

相关文章
|
3天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
14 2
|
3天前
|
存储 缓存 网络协议
如何防止DNS缓存中毒攻击(一)
DNS缓存中毒也称为DNS欺骗
22 10
|
3天前
|
缓存 网络协议 安全
如何防止DNS缓存中毒(Ⅱ)
服务器应该配置为尽可能少地依赖与其他DNS服务器的信任关系
20 10
|
3天前
|
存储 安全 Linux
Golang的GMP调度模型与源码解析
【11月更文挑战第11天】GMP 调度模型是 Go 语言运行时系统的核心部分,用于高效管理和调度大量协程(goroutine)。它通过少量的操作系统线程(M)和逻辑处理器(P)来调度大量的轻量级协程(G),从而实现高性能的并发处理。GMP 模型通过本地队列和全局队列来减少锁竞争,提高调度效率。在 Go 源码中,`runtime.h` 文件定义了关键数据结构,`schedule()` 和 `findrunnable()` 函数实现了核心调度逻辑。通过深入研究 GMP 模型,可以更好地理解 Go 语言的并发机制。
|
16天前
|
消息中间件 缓存 安全
Future与FutureTask源码解析,接口阻塞问题及解决方案
【11月更文挑战第5天】在Java开发中,多线程编程是提高系统并发性能和资源利用率的重要手段。然而,多线程编程也带来了诸如线程安全、死锁、接口阻塞等一系列复杂问题。本文将深度剖析多线程优化技巧、Future与FutureTask的源码、接口阻塞问题及解决方案,并通过具体业务场景和Java代码示例进行实战演示。
36 3
|
17天前
|
缓存 网络协议 安全
如何防止DNS缓存中毒(Ⅱ)
防止DNS缓存中毒的方法包括:减少DNS服务器与其它服务器的信任关系;限制DNS服务器上的服务;使用最新版DNS;加强用户安全教育,如识别可疑网站,仅访问HTTPS网站等。部署SSL证书并选择符合国际Webtrust标准的CA机构,可进一步提高安全性。
28 1
|
17天前
|
存储 缓存 网络协议
如何防止DNS缓存中毒攻击(一)
DNS缓存中毒,即DNS欺骗,是一种通过利用DNS系统的漏洞,将用户流量从合法服务器导向虚假服务器的网络攻击。攻击者通过伪造DNS响应,使缓存服务器存储错误的IP地址,从而实现对合法URL的劫持。这不仅可能导致用户信息泄露,还可能使用户设备遭受恶意软件感染,对金融、医疗等关键领域造成严重影响。据统计,DNS攻击每年造成的平均损失高达223.6万美元,其中23%的攻击源自DNS缓存中毒。
45 0
|
1月前
|
消息中间件 缓存 NoSQL
Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。
【10月更文挑战第4天】Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。随着数据增长,有时需要将 Redis 数据导出以进行分析、备份或迁移。本文详细介绍几种导出方法:1)使用 Redis 命令与重定向;2)利用 Redis 的 RDB 和 AOF 持久化功能;3)借助第三方工具如 `redis-dump`。每种方法均附有示例代码,帮助你轻松完成数据导出任务。无论数据量大小,总有一款适合你。
74 6
|
6天前
|
缓存 NoSQL 关系型数据库
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
本文详解缓存雪崩、缓存穿透、缓存并发及缓存预热等问题,提供高可用解决方案,帮助你在大厂面试和实际工作中应对这些常见并发场景。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
|
7天前
|
存储 缓存 NoSQL
【赵渝强老师】基于Redis的旁路缓存架构
本文介绍了引入缓存后的系统架构,通过缓存可以提升访问性能、降低网络拥堵、减轻服务负载和增强可扩展性。文中提供了相关图片和视频讲解,并讨论了数据库读写分离、分库分表等方法来减轻数据库压力。同时,文章也指出了缓存可能带来的复杂度增加、成本提高和数据一致性问题。
【赵渝强老师】基于Redis的旁路缓存架构

推荐镜像

更多