缓存PHP缓存技术已经成为项目中必不可少的一部分,它是提高性能最好的方法,比如减少网络I/O,减少磁盘I/O等,所以该项目加载速度变得更快。缓存可以是CPU缓存,内存缓存,也可以是硬盘缓存,不同的缓存查询速度不同(CPU缓存比内存缓存好还是硬盘缓存好)。接下来,我将一一为您介绍。浏览器缓存浏览器将请求的页面存储在客户端缓存中。当访问者再次访问该页面时,浏览器可以直接从客户端缓存中读取数据,减少了对服务器的访问,加快了网页速度。加载速度。用户发送的请求是强缓存的,不需要请求服务端,直接从客户端缓存中获取。根据Expires和Cache-Control判断是否命中强缓存。代码如下:header('Expires:'.gmdate('D,dMYH:i:s',time()+3600).'GMT');header("缓存控制:max-age=3600");//有效期3600秒Cache-Control还可以设置如下参数:public:可以被所有用户缓存(终端用户的浏览器/CDN服务器)private:只能被终端用户浏览Servercacheno-cache:Donotuselocalcacheno-store:禁止缓存数据Negotiations缓存用户发送的请求,发送给服务器,由服务器决定是否使用客户端缓存。代码如下:$last_modify=strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']);if(time()-$last_modify<3600){header('Last-Modified:'.gmdate('D,dMYH:i:s',$last_modify).'GMT');header('HTTP/1.1304');//NotModifiedexit;}header('Last-Modified:'.gmdate('D,dMYH:i:s').'GMT');用户操作行为对缓存操作行为的影响ExpiresLast-ModifiedAddressBarEnterValidValidPageJumpValidNewOpenWindowValidValidValidForward/BackValidValidValidF5RefreshInvalidValidCtrl+F5RefreshInvalidInvalidInvalidfilecachedatafilecachewillcachedatawith更新频率低,文件读取频率高。比如项目中多处使用城市数据进行三级联动,我们可以将城市数据缓存到一个文件(city_data.json)中,JS可以直接读取这个文件,不需要请求后端服务器。整个站点的静态CMS(内容管理系统)大家可能都不陌生。比如早期的DEDE和PHPCMS,可以在后台设置静态HTML。用户访问网站时读取静态HTML,无需请求后端数据库,不需要Ajax请求数据接口,加快了网站的加载速度。静态HTML具有以下优点:有利于搜索引擎索引(SEO)页面打开速度降低服务器负担CDN缓存CDN(ContentDeliveryNetwork)内容分发网络。用户访问网站时,自动选择最近的CDN节点内容,无需请求源服务器,加快了网站打开速度。缓存主要包括HTML、图片、CSS、JS、XML等静态资源。NoSQL缓存MemcachedCacheMemcached是一个高性能的分布式内存缓存服务器。一般使用目的是通过缓存数据库查询结果来减少数据库访问次数,从而提高动态Web应用程序的速度和可扩展性。它还可以用于存储各种格式的数据,包括图像、视频、文档等。Memcached只支持K/V类型数据,不支持持久化存储。Memcache和Memcached的区别Memcached从0.2.0开始要求PHP版本>=5.2.0,Memcache要求PHP版本>=4.3。Memcached最后发布于2018-12-24,Memcache最后发布于2013-04-07。Memcached基于libmemcached,而Memcache基于PECL扩展。将Memcached视为Memcache的升级版本。PHPMemcached使用手册:http://www.php.net/manual/zh/...人们经常将Memcached与Redis进行比较,接下来我将介绍Redis缓存。RedisCacheRedis是一个高性能的K/V数据库。Redis在很大程度上弥补了MemcachedK/V存储的不足,比如List(链表)、Set(集合)、Zset(有序集合)、Hash(散列),可以将数据存储在内存中或者将数据持久化到磁盘,支持主从同步。总的来说,Redis可以看作是Memcached的扩展版,更加重量级,功能更加强大。Redis主要用于日常工作。Redis学习网站:http://www.redis.cn/MongoDB缓存MongoDB是一个基于分布式文件存储的数据库。用C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB是介于关系型数据库和非关系型数据库之间的产物。它是非关系数据库中功能最强的,与关系数据库最相似。MongoDB学习网站:http://www.mongodb.org.cnWEB服务器缓存Apache缓存使用mod_expires指定缓存的过期时间,可以缓存HTML、图片、JS、CSS等。打开http.conf,打开模块:LoadModuleexpires_modulemodules/mod_expires.so指定缓存的过期时间:打开缓存ExpiresActiveoncss缓存(8640000秒=10天)ExpiresByTypetext/cssA8640000js缓存ExpiresByTypeapplication/x-javascriptA8640000ExpiresByTypeapplication/javascriptA8640000htmlcacheExpiresByTypetext/htmlA8640000imagecacheExpiresByTypeimage/jpegA8640000ExpiresByTypeimage/gifA8640000ExpiresByTypeimage/pngA8640000ExpiresByTypeimage/htmlA8640000图片缓存ExpiresByTypeimage/jpegA8640000ExpiresByTypeimage/gifA8640000ExpiresByTypeimage/pngA8640000ExpiresByTypeimage/x-icon0指定HTML参数expires0可以缓存A8640expirydate,images,JS,CSS等打开nginx.conf://以图片为例:location~.(gif|jpg|jepg|png|bmp|ico)${#添加新的locationroothtml;expires1d;#指定缓存时间}也可以这样理解:proxycachepath和proxy_cache,设置缓存。Opcode缓存Opcode(操作码)操作码。PHP程序运行完毕后,立即释放所有内存,程序中的所有变量都被销毁,每次请求都要重新编译执行,导致速度变慢。当解释器完成对脚本代码的分析后,它会生成可以直接运行的中间代码,也称为操作码。操作码的目的是避免重复编译,减少CPU和内存开销。APC缓存APC(AlternativePHPCache)可选的PHP缓存。APC的目标是为缓存和优化PHP中间代码提供一个免费、开放和健壮的框架。APC可以去掉php的动态分析和编译时间,让php脚本执行的更快。APC扩展最后发布于2012-09-03。如果你有兴趣,你可以了解一下。官方介绍:http://php.net/manual/zh/book...eAcceleratoreAccelerator:一个PHP操作码缓存。如果你有兴趣,你可以了解更多。官方介绍:http://eaccelerator.net/XCacheXCache是??一个快速稳定的PHP操作码缓存。如果你有兴趣,你可以了解更多。官方介绍:http://xcache.lighttpd.net/总结文章主要简单介绍浏览器缓存、文件缓存、NoSQL缓存、WEB服务器缓存、Opcode缓存。每一种缓存都可以深入研究,从介绍->安装->使用->应用场景总结。大家可以想一想,通过上面的介绍,我们在工作中使用了哪些缓存呢?还有哪些缓存可以再次使用,对我们的项目有帮助?关于缓存的常见问题如果你使用过缓存,你一定遇到过头疼的问题,比如数据一致性、雪崩、热点数据缓存、缓存监控等等。罗列几个问题给大家,纯属抛砖引玉。项目中使用缓存时,我们选择Redis还是Memcached,为什么?举一些场景:1、比如实现一个简单的日志收集功能或者发送大量的短信和邮件。实现方式是先将数据收集到队列中,然后有定时任务消费队列,处理要做的事情。直接使用Redis的lpush、rpop或者rpush、lpop。//入队$redis->lpush(key,value);//出队$redis->rpop(key);Memcached没有这样的数据结构。二、比如我们要存储用户信息,ID、姓名、电话号码、年龄、身高,如何存储呢?方案一:key=>valuekey=userdata用户IDvalue=json_encode(用户数据)查询,先取出key,再进行json_decode解析。方案二:hashkey=userdata用户ID,hashKey=name,value=xxhashKey=phone,value=xxhashKey=age,value=xxhashKey=height,value=xx查询时,取出key即可。//添加$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);//查询某个属性方案2优于方案1。3.比如社交项目类似新浪微博,个人中心关注列表和粉丝列表,双向关注列表,热门微博,新闻订阅等。以上都可以使用Redis提供的相关数据结构。4、Memcached只是存储在内存中,而Redis可以存储在内存中,也可以持久化到磁盘。如果需求中的数据需要持久化,请选择Redis。就个人而言,我不在工作中使用Memcached。Memcached通过查询数据分配内存,优于Redis。Memcached默认使用SlabAllocation机制来管理内存。根据预定的大小,将分配的内存划分为特定长度的块来存储相应长度的key-value数据记录,从而彻底解决内存碎片问题。如何保证缓存和数据库的数据一致性?新数据:先加入数据库,再加入缓存。编辑数据:先删除缓存的数据,然后修改数据库中的数据,再添加到缓存中。删除数据:先删除缓存数据,再删除数据库中的数据。查询数据:先查询缓存数据,如果没有数据,再查询数据库,然后添加到缓存中。强一致性很难保证,比如事务一致性、时间点一致性、最终一致性。下面具体问题具体分析。缓存穿透呢?用户请求缓存中不存在的数据,导致请求直接落在数据库上。1.设置一个正规的Key值,首先验证Key是否符合规范。2、接口限流、降级、熔断,请研究istio:https://istio.io/3、Bloomfilter。4.对于不存在的键值,设置空缓存和过期时间。如果存储层创建了数据,及时更新缓存。发生雪崩怎么办?1、互斥锁,只允许一个请求重建索引,其他请求等待缓存重建完成,再从缓存中获取数据。