图片加载中...

图片加载中... 十四年全栈培训机构

图片加载中... 申请免费试听机会

首页>新闻动态>PHP开发技术文章

从原理PHP缓存技术讲解场景系统

更新时间:2021-08-09

缓存可以是CPU缓存、内存缓存、硬盘缓存,不同的缓存查询速度也不一样(CPU缓存 优于 内存缓存 优于 硬盘缓存)。

浏览器缓存 浏览器将请求过的页面存储在客户端缓存中,当访问者再次访问这个页面时,浏览器就可以直接从客户端缓存中读取数据,减少了对服务器的访问,加快了网页的加载速度。

根据 Expires 和 Cache-Control 判断是否命中强缓存。

header('Expires: '. gmdate('D, d M Y H:i:s', time() + 3600). ' GMT');

Cache-Control 还可以设置以下参数:

private:只能被终端用户的浏览器缓存

no-store:禁止缓存数据

代码如下:

if (time() - $last_modify < 3600) {

header('HTTP/1.1 304'); //Not Modified

}

用户操作行为对缓存的影响 操作行为 Expires Last-Modified 地址栏回车 有效 有效 页面跳转 有效 有效 新开窗口 有效 有效 前进/后退 有效 有效 F5刷新 无效 有效 Ctrl+F5刷新 无效 无效 文件缓存 数据文件缓存 将更新频率低,读取频率高的数据,缓存成文件。

全站静态化 CMS(内容管理系统),也许大家都比较熟悉,比如早期的 DEDE、PHPCMS,后台都可以设置静态化HTML,用户在访问网站的时候读取的都是静态HTML,不用请求后端的数据库,也不用Ajax请求数据接口,加快了网站的加载速度。

有利于搜索引擎的收录(SEO)

减少服务器负担

用户访问网站时,自动选择就近的CDN节点内容,不需要请求源服务器,加快了网站的打开速度。

NoSQL缓存 Memcached 缓存 Memcached 是高性能的分布式内存缓存服务器。

它也能够用来存储各种格式的数据,包括图像、视频、文件等。

Memcache 与 Memcached 的区别

Memcached 最后发布时间为2018-12-24,Memcache 最后发布时间2013-04-07。

可以将 Memcached 看作是 Memcache 的升级版。

http://www.php.net/manual/zh/...

Redis缓存 Redis 是一个高性能的 K/V 数据库。

总的来说,可以将 Redis 看作是 Memcached 的扩展版,更加重量级,功能更强大。

Redis 学习网址:http://www.redis.cn/

旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。

MongoDB 学习网址:http://www.mongodb.org.cn

打开 http.conf,开启模块:

指定缓存的过期时间:

打开缓存

css缓存(8640000秒=10天)

js缓存

ExpiresByType application/javascript A8640000

ExpiresByType text/html A8640000

ExpiresByType image/jpeg A8640000

ExpiresByType image/png A8640000

 

打开 nginx.conf :

location ~.(gif|jpg|jepg|png|bmp|ico)$ { #加入新的location

expires 1d; #指定缓存时间

大家也可以了解下:proxycachepath 和 proxy_cache,进行缓存的设置。

PHP程序运行完后,马上释放所有内存,所有程序中的变量都销毁,每次请求都要重新翻译、执行,导致速度可能会偏慢。

操作码 的目地是避免重复编译,减少CPU和内存开销。

APC 的目标是提供一个自由、 开放,和健全的框架,用于缓存、优化 PHP 中间代码。

APC 扩展最后的发布时间为 2012-09-03。

eAccelerator eAccelerator:A PHP opcode cache。

XCache XCache 是一个又快又稳定的 PHP opcode 缓存器。

小结 文章主要简单的介绍了 浏览器缓存、文件缓存、NoSQL缓存、WEB服务器缓存、Opcode缓存。

大家可以思考下,通过上面的介绍,工作中我们使用了哪些缓存?

关于缓存的常见问题 用过缓存,大家肯定遇到过比较头痛的问题,比如数据一致性,雪崩,热点数据缓存,缓存监控等等。

当项目中使用到缓存,我们是选择 Redis 还是 Memcached ,为什么? 举一些场景:

直接使用 Redis 的 lpush,rpop 或 rpush,lpop。

$redis->lpush(key, value);

$redis->rpop(key);

二、比如我们要存储用户信息,ID、姓名、电话、年龄、身高 ,怎么存储?

key = userdata用户ID

查询时,先取出key,然后进行json_decode解析。

key = userdata用户ID

hashKey = 电话,value = xx

hashKey = 身高,value = xx

//新增

$redis->hSet(key, hashKey, value);

//编辑

//查询

$redis->hGet(key, hashKey); //查询某个属性

三、比如社交项目类似于新浪微博,个人中心的关注列表和粉丝列表,双向关注列表,还有热门微博,还有消息订阅 等等。

四、Memcached 只存储在内存中,而 Redis 既可以存储在内存中,也可以持久化到磁盘上。

个人在工作中没有用到 Memcached ,通过查询资料得到 Memcached 内存分配时优于 Redis。

如何保证,缓存与数据库的数据一致性? 新增数据:先新增到数据库,再新增到缓存。

删除数据:先删除缓存数据,再删除数据库中数据。

强一致性是很难保证的,比如事务一致性,时间点一致性,最终一致性等。

缓存穿透怎么办? 用户请求缓存中不存在的数据,导致请求直接落在数据库上。

二、接口限流、降级、熔断,请研究 istio:https://istio.io/

四、为不存在的key值,设置空缓存和过期时间,如果存储层创建了数据,及时更新缓存。

分享到:

上一篇:PHP中HTTP防盗链技术


下一篇:PHP程序员应该掌握哪些技术?

相关课程MORE>

图片加载中

WEB高级前端+HTML5

前端开发就是利用各种Web技术进行产品的界面开发...

图片加载中

UI交互式设计师

让学生快速达到一名UI界面设计师的标准...

图片加载中

PHP高级架构工程师

广阔的发展空间,需要新型的技术人员...

图片加载中

高级python开发

Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本...

图片加载中TEL:010-83650488

图片加载中

在线咨询

电话咨询