zvvq技术分享网

系统讲解PHP缓存技术(php的缓存技术php技术优势

作者:zvvq博客网
导读本篇文章给大家带来了关于php的相关知识,其中主要介绍了缓存技术的相关内容,缓存已经成了项目中必不可少的一部分,是提高性能最好的方式,下面一起来看一下,希望对大家有帮

本篇文章给大家带来了关于php的相关知识,其中主要介绍了缓存技术的相关内容,缓存已经成了项目中必不可少的一部分,是提高性能最好的方式,下面一起来看一下,希望对大家有帮助。 zvvq.cn

内容来自zvvq

概述

zvvq

缓存已经成了项目中是必不可少的一部分,它是提高性能最好的方式,例如减少网络I/O、减少磁盘I/O 等,使项目加载速度变的更快。

zvvq好,好zvvq

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

PHP免费”; copyright zvvq

接下来,给大家逐一进行介绍。

内容来自zvvq,别采集哟

浏览器缓存

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

zvvq.cn

强缓存

用户发送的请求,直接从客户端缓存中获取,不请求服务器。 内容来自samhan

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

代码如下: 内容来自samhan

1

zvvq.cn

2 内容来自zvvq,别采集哟

header(&39;Expires: &39;. gmdate(&39;D, d M Y H:i:s&39;, time() + 3600). &39; GMT&39;); 内容来自zvvq

header("Cache-Control: max-age=3600"); //有效期3600秒

zvvq好,好zvvq

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

内容来自zvvq

public:可以被所有的用户缓存(终端用户的浏览器/CDN服务器) 内容来自zvvq,别采集哟

private:只能被终端用户的浏览器缓存 本文来自zvvq

no-cache:不使用本地缓存 内容来自samhan666

no-store:禁止缓存数据 内容来自samhan666

协商缓存

用户发送的请求,发送给服务器,由服务器判定是否使用客户端缓存。

内容来自zvvq,别采集哟

代码如下: 内容来自zvvq,别采集哟

1

内容来自samhan

2

内容来自samhan

3

zvvq

4 内容来自zvvq

5 内容来自zvvq,别采集哟

6 zvvq好,好zvvq

7 zvvq

$last_modify = strtotime($_SERVER[&39;HTTP_IF_MODIFIED_SINCE&39;]); 内容来自samhan666

if (time() - $last_modify < 3600) { 内容来自samhan666

header(&39;Last-Modified: &39;. gmdate(&39;D, d M Y H:i:s&39;, $last_modify).&39; GMT&39;); zvvq

header(&39;HTTP/1.1 304&39;); //Not Modified

内容来自samhan

exit;

内容来自samhan

} zvvq

header(&39;Last-Modified: &39;. gmdate(&39;D, d M Y H:i:s&39;).&39; GMT&39;);

本文来自zvvq

用户操作行为对缓存的影响

本文来自zvvq

文件缓存

数据文件缓存

将更新频率低,读取频率高的数据,缓存成文件。 内容来自zvvq,别采集哟

比如,项目中多个地方用到城市数据做三级联动,我们就可以将城市数据缓存成一个文件(city_data.json),JS 可以直接读取这个文件,无需请求后端服务器。

copyright zvvq

全站静态化

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

本文来自zvvq

静态化HTML有以下优点:

zvvq.cn

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

页面打开速度快 内容来自zvvq

减少服务器负担 本文来自zvvq

CDN缓存

CDN(Content Delivery Network)内容分发网络。 本文来自zvvq

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

本文来自zvvq

缓存主要包括 HTML、图片、CSS、JS、XML 等静态资源。 本文来自zvvq

NoSQL缓存

Memcached 缓存

内容来自samhan666

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

一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。

内容来自samhan666

它也能够用来存储各种格式的数据,包括图像、视频、文件等。 内容来自zvvq,别采集哟

Memcached 仅支持K/V类型的数据,不支持持久化存储。

内容来自samhan666

Memcache 与 Memcached 的区别 copyright zvvq

Memcached 从0.2.0开始,要求PHP版本>=5.2.0,Memcache 要求PHP版本>=4.3。

本文来自zvvq

Memcached 最后发布时间为2018-12-24,Memcache 最后发布时间2013-04-07。 内容来自zvvq,别采集哟

Memcached 基于libmemcached,Memcache 基于PECL扩展。

内容来自samhan666

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

本文来自zvvq

PHP Memcached 使用手册: 本文来自zvvq

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

内容来自zvvq

Memcached 经常拿来与 Redis 做对比,接下来介绍下 Redis 缓存。 内容来自zvvq,别采集哟

Redis缓存 zvvq好,好zvvq

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

zvvq

Redis 很大程度补偿了 Memcached K/V存储的不足,比如 List(链表)、Set(集合)、Zset(有序集合)、Hash(散列),既可以将数据存储在内存中,也可以将数据持久化到磁盘上,支持主从同步。 内容来自samhan666

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

本文来自zvvq

Redis 在日常工作中使用的居多。 内容来自zvvq,别采集哟

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

内容来自samhan666

MongoDB缓存

内容来自samhan

MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。 内容来自samhan666

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

MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。

copyright zvvq

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

zvvq.cn

WEB服务器缓存

Apache缓存

copyright zvvq

利用 mod_expires ,指定缓存的过期时间,可以缓存HTML、图片、JS、CSS 等。

内容来自zvvq,别采集哟

打开 http.conf,开启模块: 内容来自samhan666

1

内容来自samhan

LoadModule expires_module modules/mod_expires.so 内容来自zvvq,别采集哟

指定缓存的过期时间: 内容来自zvvq

1 copyright zvvq

2

copyright zvvq

3 zvvq.cn

4 copyright zvvq

5

内容来自samhan

6 内容来自samhan666

7 zvvq好,好zvvq

8

zvvq

9

zvvq好,好zvvq

10

内容来自zvvq

11

内容来自samhan

12 内容来自zvvq,别采集哟

13 zvvq

14

内容来自samhan

15 内容来自samhan

16

zvvq好,好zvvq

<IfModule expires_module>

zvvq.cn

打开缓存 zvvq.cn

ExpiresActive on

zvvq

css缓存(8640000秒=10天) 内容来自samhan

ExpiresByType text/css A8640000

内容来自zvvq

js缓存

zvvq.cn

ExpiresByType application/x-javascript A8640000 zvvq.cn

ExpiresByType application/javascript A8640000

内容来自zvvq,别采集哟

html缓存

zvvq.cn

ExpiresByType text/html A8640000

内容来自samhan666

图片缓存

内容来自zvvq

ExpiresByType image/jpeg A8640000

内容来自zvvq

ExpiresByType image/gif A8640000 内容来自samhan

ExpiresByType image/png A8640000

内容来自samhan

ExpiresByType image/x-icon A8640000

内容来自samhan666

</IfModule>

内容来自samhan

Nginx缓存

本文来自zvvq

利用 expire 参数,指定缓存的过期时间,可以缓存HTML、图片、JS、CSS 等。 zvvq

打开 nginx.conf : zvvq.cn

1 zvvq

2

内容来自samhan666

3 内容来自zvvq,别采集哟

4 zvvq.cn

5

内容来自zvvq

//以图片为例:

zvvq好,好zvvq

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

内容来自zvvq,别采集哟

root html; 内容来自samhan

expires 1d; 指定缓存时间 内容来自zvvq,别采集哟

} 内容来自samhan

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

内容来自samhan666

Opcode缓存

Opcode(Operate Code)操作码。

内容来自zvvq

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

当解释器完成对脚本代码的分析后,便将它们生成可以直接运行的中间代码,也称为操作码。 内容来自samhan

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

内容来自samhan666

APC缓存

APC(Alternative PHP Cache)可选 PHP 缓存。 内容来自zvvq,别采集哟

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

APC 可以去掉 php 动态解析以及编译的时间,使php脚本可以执行的更快。 内容来自samhan666

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

感兴趣可以了解下,官方介绍:http://php.net/manual/zh/book.apc.php

内容来自samhan666

eAccelerator

eAccelerator:A PHP opcode cache。 内容来自samhan666

感兴趣可以了解下,官方介绍:http://eaccelerator.net/ 内容来自samhan

XCache

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

zvvq

感兴趣可以了解下,官方介绍:http://xcache.lighttpd.net/

内容来自samhan

小结 内容来自samhan666

文章主要简单的介绍了 浏览器缓存、文件缓存、NoSQL缓存、WEB服务器缓存、Opcode缓存。 内容来自zvvq,别采集哟

每一种缓存都可以研究,从介绍 -> 安装 -> 使用 -> 总结应用场景。

zvvq.cn

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

zvvq.cn

还可以再使用哪些缓存,可以对我们的项目有帮助? copyright zvvq

关于缓存的常见问题

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

给大家列出几个问题,纯属抛转引玉。 内容来自samhan666

当项目中使用到缓存,我们是选择 Redis 还是 Memcached ,为什么?

zvvq.cn

举一些场景: zvvq.cn

一、比如实现一个简单的日志收集功能或发送大量短信、邮件的功能,实现方式是先将数据收集到队列中,然后有一个定时任务去消耗队列,处理该做的事情。 内容来自zvvq

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

1 本文来自zvvq

2

zvvq.cn

3

内容来自samhan666

4

内容来自zvvq

5 内容来自zvvq,别采集哟

//进队列 本文来自zvvq

$redis->lpush(key, value); copyright zvvq

//出队列

zvvq

$redis->rpop(key); 本文来自zvvq

Memcached 没有这种数据结构。 内容来自samhan666

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

copyright zvvq

方案一:key => value

内容来自zvvq

key = userdata用户ID 内容来自samhan666

value = json_encode(用户数据) 内容来自samhan

查询时,先取出key,然后进行json_decode解析。 本文来自zvvq

方案二:hash

zvvq好,好zvvq

key = userdata用户ID copyright zvvq

hashKey = 姓名,value = xx 内容来自samhan666

hashKey = 电话,value = xx copyright zvvq

hashKey = 年龄,value = xx 内容来自samhan666

hashKey = 身高,value = xx

zvvq

查询时,取出key即可。 内容来自samhan

1

zvvq好,好zvvq

2

内容来自zvvq

3 zvvq

4

本文来自zvvq

5

内容来自samhan666

6

zvvq.cn

7 内容来自zvvq,别采集哟

8

zvvq.cn

9 内容来自zvvq

//新增

zvvq.cn

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

内容来自samhan

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

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

//编辑 内容来自samhan666

$redis->hSet(key, hashKey, value); 本文来自zvvq

//查询

内容来自zvvq

$redis->hGetAll(key); //查询所有属性 zvvq好,好zvvq

$redis->hGet(key, hashKey); //查询某个属性 本文来自zvvq

方案二 优于 方案一。 内容来自samhan666

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

以上都用 Redis 提供的相关数据结构即可。 内容来自samhan

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

如果需求中的数据需要持久化,请选择 Redis 。

zvvq好,好zvvq

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

Memcached 默认使用 Slab Allocation 机制管理内存,按照预先规定的大小,将分配的内存分割成特定长度的块以存储相应长度的key-value数据记录,以完全解决内存碎片问题。 copyright zvvq

如何保证,缓存与数据库的数据一致性?

新增数据:先新增到数据库,再新增到缓存。

内容来自zvvq

编辑数据:先删除缓存数据,再修改数据库中数据,再新增到缓存。 zvvq好,好zvvq

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

zvvq好,好zvvq

查询数据:先查询缓存数据,没有,再查询数据库,再新增到缓存。 本文来自zvvq

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

具体问题具体分析吧。

zvvq.cn

缓存穿透怎么办?

用户请求缓存中不存在的数据,导致请求直接落在数据库上。 zvvq.cn

一、设置有规则的Key值,先验证Key是否符合规范。 zvvq好,好zvvq

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

本文来自zvvq

三、布隆过滤器。 本文来自zvvq

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

雪崩怎么办?

一、互斥锁,只允许一个请求去重建索引,其他请求等待缓存重建执行完,重新从缓存获取数据。

内容来自zvvq,别采集哟

zvvq

二、双缓存策略,原始缓存和拷贝缓存,当原始缓存失效请求拷贝缓存,原始缓存失效时间设置为短期,拷贝缓存设置为长期。 zvvq.cn

推荐学习:《PHP视频教程

本文来自zvvq

以上就是系统讲解PHP缓存技术的详细内容,更多请关注其它相关文章! 内容来自zvvq,别采集哟