透析PHP缓存问题

这篇具有很好参考价值的文章主要介绍了透析PHP缓存问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

透析PHP缓存问题,PHP,php,缓存,开发语言

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

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

缓存方式

  • 1、代码级缓存

1)数据缓存:是指数据库查询PHP缓存机制,每次访问页面的时候,都会先检测相应的缓存数据是否存在,如果不存在,就连接数据库,得> 到数据,并把查询结果序列化后保存到文件中,以后同样的查询结果就直接从缓存表或文件中获得。

2)页面缓存:每次访问页面的时候,都会先检测相应的缓存页面文件是否存在,如果不存在,就重新动态生成,得新内容,显示页面并同> 时生成缓存页面文件,这样下次访问的时候页面文件就发挥作用了。(模板引擎和常见的一些PHP缓存机制类通常有此功能)

3)时间触发缓存:检查文件是否存在并且时间戳小于设置的过期时间,如果文件修改的时间戳比当前时间戳减去过期时间戳大,那么就用缓> 存,否则更新缓存。

4)内容触发缓存:当插入数据或更新数据时,强制更新PHP缓存机制。

5)静态缓存:是指静态化,直接生成HTML或XML等文本文件,有更新的时候重生成一次,适合于不太变化的页面。

  • 2、服务器级缓存

1)内存缓存:著名就是Memcached,主要用于多台web服务器,是高性能的,分布式的内存对象PHP缓存机制系统,用于在动态应用中减少数> 据库负载,提升访问速度。

2)操作码缓存:就是在PHP代码解析编译的过程中进行缓存,主要有eaccelerator, apc, phpa,xcache等

3)数据库缓存:就是对sql语句及结果进行缓存,mysql中用的比较多,采用LRU(即least recently used 最近最少使用)算法。

4)基于反向代理的Web缓存:是指在外部请求过来时,设置缓存根据配置文件进行转向解析。这样,服务器请求就可以转发到我们指定的内部地址上,实际就相当于一个内容分发机。如:Nginx,SQUID(一个专用的代理服务器),mod_proxy(apache2以上又分为mod_proxy和mod_cache)。

  • 3、文件缓存

数据文件缓存:将封信频率低,读取率高的数据,缓存成文件,如三级联动数据。

全站静态化:静态HTML,不请求数据库,有利于SEO,页面加载速度快,服务器负担小

CDN缓存:内容分发网络,缓存主要包括 HTML、图片、CSS、JS、XML 等静态资源。

  • 4、NoSQL缓存

Memcached 缓存:高性能的分布式内存缓存服务器,存储各种格式的数据,包括图像、视频、文件等

Redis缓存:高性能的 K/V 数据库,五种常见数据结构:String,List,Set,Sorted set,Hash,

MongoDB缓存:是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的,学习网址:http://www.mongodb.org.cn

缓存的使用场景

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

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

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

  • 方案一:key => value
key = user_data_用户ID

value = json_encode(用户数据)

查询时,先取出key,然后进行json_decode解析。
  • 方案二:hash
key = user_data_用户ID

hashKey = 姓名,value = xx

hashKey = 电话,value = xx

hashKey = 年龄,value = xx

hashKey = 身高,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); //查询某个属性

方案二 优于 方案一。

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

以上都用 Redis 提供的相关数据结构即可。

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

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

缓存和数据库一致性

  • 新增数据:先新增到数据库,再新增到缓存。
  • 编辑数据:先删除缓存数据,再修改数据库中数据,再新增到缓存。
  • 删除数据:先删除缓存数据,再删除数据库中数据。
  • 查询数据:先查询缓存数据,没有,再查询数据库,再新增到缓存。
  • 强一致性是很难保证的,比如事务一致性,时间点一致性,最终一致性等。

缓存使用问题

对于代码级缓存,除了服务器,网络会影响缓存,基本不会有什么大的问题。但是在高并发的应用中,服务器级缓存就可能会引起严重的问题,主要有以下三种情况:

缓存穿透

500w网站在接到用户请求时,会先判断缓存是否存在,如果存在就直接返回缓存内容,如果不存在,就直接查询DB,得到结果,缓存后再返回给用户。但是,如果用户请求的数据缓存中一直都不存在,那么就会直接查询DB,缓存就没起到作用了,如果请求量很大,就会给DB造成压力,甚至挂掉。

解决办法:对所有可能查询的参数以hash形式存储,在控制层先进行校验,不符合则丢弃。比如:用户请求某个用户abc的个人信息,但实际上abc用户并不存在,这里就会出现缓存穿透。如果在用户第一次请求时,以用户名作为一个key进行缓存,以后请教时,判断key是否存在,如果存在就返回定义好的结果,如果不存在,也不让它连续多次查询DB,这样就可以防止缓存被穿透了。

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

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

三、布隆过滤器。

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

缓存失效

引起这个问题的主要原因还是高并发的时候。比如500w网站默认缓存时间是10分钟,并发很高时可能会出在某一个时间 同时生成了很多的缓存,并且过期时间都一样,这个时候就可能引发一当过期时间到后,这些缓存同时失效,请求全部转发到DB,DB可能会压力过重。

解决办法:将缓存失效时间分散开,比如我们可以在原有的失效时间基础上增加一个随机值,比如1-5分钟随机,这样每一个缓存的过期时间的重复率就会降低,就很难引发集体失效的事件。

缓存雪崩

这种情况可能出现在并发访问时候。如果缓存集中在一段时间内失效,DB的压力凸显。当发生大量的缓存穿透,例如对某个失效的缓存的大并发访问就造成了缓存雪崩。

解决办法:解决这个问题,其实是在缓存穿透的防止阶段,我们对缓存查询加锁,如果KEY不存在,就加锁,然后查DB入缓存,然后解锁;其他进程如果发现有锁就等待,然后等解锁后返回数据或者进入DB查询。
一、互斥锁,只允许一个请求去重建索引,其他请求等待缓存重建执行完,重新从缓存获取数据。

二、双缓存策略,原始缓存和拷贝缓存,当原始缓存失效请求拷贝缓存,原始缓存失效时间设置为短期,拷贝缓存设置为长期。文章来源地址https://www.toymoban.com/news/detail-819790.html

到了这里,关于透析PHP缓存问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • PHP从入门到精通—PHP开发入门-PHP概述、PHP开发环境搭建、PHP开发环境搭建、第一个PHP程序、PHP开发流程

    每开始学习一门语言,都要了解这门语言和进行开发环境的搭建。同样,学生开始PHP学习之前,首先要了解这门语言的历史、语言优势等内容以及了解开发环境的搭建。 PHP概述 Ø 认识PHP PHP最初是由Rasmus Lerdorf于1994年为了维护个人网页而编写的一个简单程序。这个程序用来显

    2024年02月14日
    浏览(65)
  • PHP语言基础

    🌱博客主页:大寄一场. 😘博客制作不易欢迎各位👍点赞+⭐收藏+➕关注 目录 前言 一、变量和数据类型 二、运算符和表达式 三、条件语句 四、循环语句 PHP是一种非常流行的开源服务器端脚本语言,广泛用于Web开发。它可以与HTML、CSS和JavaScript配合使用,以动态生成内容。

    2024年02月02日
    浏览(49)
  • 关于php原生开发与主流php框架使用心得

    PHP是世界上最好的web开发语言,这个无可辩驳,当然去掉web两个字,这毫无意义,网上很多喷子鼓吹的java,.net,python都差的远。 php有如下优点: 简单易学。正是因为如此,才造就了php开发者人群的庞大和良莠不齐,但是我们不能因为阳光和空气获取起来毫不费力就说它不重

    2024年02月02日
    浏览(47)
  • thinkphp5.1 获取缓存cache(‘cache_name‘)特别慢,php 7.0 unserialize 特别慢

    场景: 项目中大量使用了缓存,本地运行非常快,二三百毫秒,部署到服务器后 一个表格请求就七八秒,最初猜想是数据库查询慢,经过追代码,发现是获取到缓存后,进行反序列化过程造成的 解决:将php 版本从7.0 切换到7.1 就好了 扩展:查询了官方手册也未见 这方面的

    2024年02月07日
    浏览(51)
  • 使用vscode编写插件-php语言

    https://blog.csdn.net/qq_45701130/article/details/125206645 一、环境搭建 1、安装 Visual Studio Code 2、安装 Node.js 3、安装 Git 4、安装生产插件代码的工具: npm install -g yo generator-code 二、创建工程 yo code 选择项解释: 选择编写扩展的语言,我选择的是JavaScript 输入扩展名称 输入一个标志(我

    2024年02月11日
    浏览(48)
  • PHP入门介绍及语言基础

    🌱博客主页:大寄一场. 😘博客制作不易欢迎各位👍点赞+⭐收藏+➕关注 目录 前言 一、变量和数据类型 二、运算符和表达式 三、条件语句 四、循环语句 PHP是一种非常流行的开源服务器端脚本语言,广泛用于Web开发。它可以与HTML、CSS和JavaScript配合使用,以动态生成内容。

    2024年02月05日
    浏览(44)
  • PHP开发日志 ━━ php8.3安装与使用组件Xdebug

    今天开头写点历史: 二十年前流行asp,当时用vb整合常用函数库写了一个dll给asp调用,并在此基础上开发一套仿windows界面的后台管理系统; 后来asp逐渐没落,于是在十多年前转投php,不久后用php写了一套mvc框架,同时参考asp仿windows经验,结合兴起的jQuery重写后台管理系统。

    2024年02月02日
    浏览(50)
  • 短视频矩阵源码开源搭建--基于PHP语言

    短视频矩阵系统是一种基于云计算和大数据技术的智能化视频分发系统,旨在为用户提供个性化的短视频推荐和播放服务。该系统通过对用户行为数据和视频内容进行深度分析和计算,实现了智能化的推荐算法和视频分发机制,使用户能够快速、便捷地找到自己喜欢的视频并

    2024年02月21日
    浏览(38)
  • 医院安全(不良)事件报告系统 PHP语言实现

    医院安全(不良)事件报告制度 一、目的 规范医院安全(不良)事件的主动报告,增强风险防范意识,及时发现医疗不良事件和安全隐患,将获取的医疗安全信息进行分析反馈,并从医院管理体系、运行机制与规章制度上进行有针对性的持续改进。 二、适用范围 适用于本院

    2024年02月06日
    浏览(53)
  • 【PHP】问题已解决:宝塔面板搭建php网站无法上传图片或是文件(保姆级图文)

    『PHP』分享PHP环境配置到项目实战个人学习笔记。 欢迎关注 『PHP』 系列,持续更新中 欢迎关注 『PHP』 系列,持续更新中 宝塔面板搭建php网站无法上传图片或是文件。 检查你的php里是否安装了 fileinfo 扩展,这会影响文件上传,而且因为宝塔面板让你有多个版本的php,所以

    2024年02月07日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包