PHP缓存技术:浏览器、数据文件、WEB服务器...
概述
缓存已经成为项目中必不可少的一部分。这是提高性能的最好方法,比如减少网络I/O、磁盘I/O等,使项目加载速度更快。
缓存可以是CPU缓存、内存缓存、硬盘缓存。不同的缓存查找速度也不同(CPU缓存比内存缓存比硬盘缓存好)。
那我就一一介绍了。
浏览器的缓存
浏览器将请求的页面存储在客户端的缓存中。当访问者再次访问该页面时,浏览器可以直接从客户端的缓存中读取数据,减少服务器的负载。访问,加快网页加载速度。
强大的缓存
用户发送的请求直接来自客户端的缓存,无需询问服务器。
根据Expires和Cache-Control判断强缓存是否命中。
代码为:
header('过期时间:'.gmdate('D, d M Y H:i:s', time() + 3600).'GMT');❀ header( "Cache控制:最大年龄=3600"); //有效期3600秒
Cache-Control还可以设置以下参数:
- public:所有用户均可缓存(最终用户浏览器/CDN服务器) 仅缓存:最终用户的浏览器by
- no-cache:不使用本地缓存
- no-store:禁用数据缓存
协商缓存
User 是否将请求发送到服务器以使用客户端缓存。† ööö(' 最后修改: '.gmdate('D, d M Y H:i:s', $last_modify).' GMT');
header('HTTP/1.1 304'); //未修改
exit;
}
header('最后修改: '.gmdate('D, d M Y H:i:s').' GMT');
用户操作行为缓存中
操作行为 | 过期 | 最后修改 | ||
---|---|---|---|---|
在标题栏中按回车 | 有效 | 有效 | 有效❀ 标识符 | 有效 |
新窗口 | 有效 | 有效 | ||
前进/后退 | 有效 | 有效 | 有效 | 有效 |
F 5 Ctrl+F5 更新 | 无效 | 无效 |
文件缓存
数据文件缓存
将低刷新和高读取的数据缓存到文件中。
例如,如果我们在项目中的多个地方使用城市数据进行三级链接,我们可以将城市数据缓存在一个文件(city_data.json)中,JS会直接读取这个文件,而不需要返回。终端服务器。
统计整个页面
CMS(内容管理系统),也许大家都知道,比如早期的DEDE和PHPCMS。可以在后台设置静态 HTML。当用户访问您的网站时,只需要读取静态HTML,无需后端数据库或向前端发出Ajax请求,从而加快了您网站的加载速度。 † 交付网络)内容分发网络。
用户访问网站时,自动选择最近的CDN节点的内容,无需请求源服务器,加快了网站的打开速度。
缓存主要包含HTML、图片、CSS、JS、XML等静态资源。? ,指定缓存过期时间,可以缓存HTML、图片、JS、CSS等。
打开http.conf
并启用模块
expires_module module/mod_expires
.so 输入缓存过期时间:
打开 关于如何设置缓存的更多信息,请参见proxycachepath和proxy_cache。 Operate Code(操作码)操作码。 PHP程序运行后,所有内存立即被释放,程序中的所有变量都被销毁。每个请求都必须被翻译并重新执行,这会降低速度。 解释器解析完脚本代码后,会生成中间代码,也称为操作代码,可以直接运行。 操作码的目的是避免重复翻译并减少 CPU 和内存开销。 APC(替代 PHP Cache)可选 PHP 缓存。 APC 旨在提供一个免费、开放且可靠的框架来缓存和优化 PHP 中间代码。 APC可以去掉php动态解析和编译的时间,因此php脚本可以执行得更快。 APC 扩展最后发布于 2012-09-03。 有兴趣的话可以多了解一下。官方介绍:http://php.net/manual/zh/book.apc.php eAccelerator:PHP操作代码缓存。 有兴趣的话可以多了解一下。官方介绍:http://eaccelerator.net/ X Cache 是一个快速稳定的 PHP 动作代码缓存。 有兴趣的话可以多了解一下。官方介绍:http://xcache.lighttpd.net/ 文章主要介绍浏览器缓存、文件缓存、NoSQL缓存、WEB服务器缓存、Opcode缓存。 所有类型的缓存都可以深入研究,从介绍->安装->使用->应用场景总结。 大家可以想想。通过上面的介绍,我们在工作中都用到了哪些缓存呢? 我们还可以使用哪些其他缓存来帮助我们的项目? 如果你使用过缓存,你一定经历过数据一致性、雪崩、热点数据缓存、缓存监控等令人头疼的问题。 我列出了一些问题。你,只是为了吸引眼球。 回忆一些场景: 1。例如,实现简单的日志收集功能或者发送大量的短信和电子邮件。实现方式是先将数据收集到队列中,然后运行定时任务来消费和处理队列。去做。 直接使用Redis的lpush、rpop或者rpush、lpop函数。 2。例如,如果我们要存储ID、姓名、电话号码、年龄、身高等用户数据,我们如何存储呢? 1。 option: key => value key = user_id of user_data value = json_encode (user_data) ,然后先执行查询 j。 2。选项:hash key = 用户数据的用户ID hashKey = name, value = xx hashKey = xyy = 电话号码,值 = xx hashKey =高度,值=xx 查询时,取出钥匙即可。 选项2比选项1好。 3。例如,社交项目类似于新浪微博、个人中心关注列表和粉丝列表、双向关注列表、热门微博、消息订阅等。雷迪斯。 4。 Memcached仅存储在内存中,而Redis可以存储在内存中,也可以持久化到磁盘。 如果需求中的数据必须保留,则选择Redis。 我在工作中没有使用Memcached。 Memcached 通过查询数据来分配内存比 Redis 更好。 默认情况下,Memcached 使用磁盘分配机制来管理内存。根据预定的大小,将分配的内存分成固定长度的块来存储适当长度的键值数据记录,彻底解决内存碎片问题。 添加新数据:先添加到数据库,然后添加到缓存。 编辑数据:先删除缓存数据,然后修改数据库中的数据,最后添加到缓存中。 删除数据:先删除缓存数据,再删除数据库中的数据。 查询数据:先查询缓存数据,如果没有则查询数据库,然后添加到缓存中。 强一致性很难保证,比如事务一致性、时间一致性、最终一致性等。 我们来具体分析一下具体问题。 用户请求缓存中不存在的数据,所以请求直接到数据库。 1. 设置正常的键值,首先检查键是否符合规范。 2.接口限流、降级、断路器,请学习istio:https://istio.io/ 3.布隆过滤器。 4。为不存在的键值设置空缓存和过期时间。当存储层创建数据时,及时更新缓存。 1. 互斥锁,只允许一个请求重建索引,其他请求等待缓存重建完成,重新从缓存中取出数据。 2.双缓存策略,原始缓存和副本缓存。当原始缓存过期并且请求复制缓存时,原始缓存被设置为短过期,而复制缓存被设置为长过期。 #Open缓存
40000 秒 = 10 天) ExpiresByType text /css A8640000
#js 缓存
ExpiresByType app/x-javascript A8640000 ExpiresByType text /css A8640000 /html A8 640000
#图像缓存
按类型过期图像/jpeg A8640000
按类型过期图像/gif A8640000
按类型过期图像/png A8640000 ❀
Nginx缓存使用
过期
参数指定缓存过期时间。 HTML、图像、JS、CSS 等缓存。nginx.conf
: //以图片为例:
{mp|d|pco|jpg) 新位置
root html; 1一天后到期; #指定缓存时间
}
操作码缓存
APC 缓存
eAccelerator
X Cache
总结
缓存常见问题
如果我们在项目中使用缓存,我们应该选择Redis还是Memcached?为什么?
//行内
$redis->lpush(key, value);
//行外
$redis->rpop(key);♶M没有这个数据结构。
//新增
$redis->hSet(key, hashKey, value);
$redis->hSet(key, hashKey, value);
$redis->hSet(key, hashKey, value);
//编辑
$redis->hSet(key, hashKey, value);
//查询
$redis->hGetAll(key); //请求所有属性
$redis->hGet(key, hashKey); //查询某个属性
如何保证缓存和数据库数据的一致性?
缓存入侵怎么办?
遇到雪崩怎么办?
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。