PHP网站造成mysql CPU压力大 如何用redis缓存

做了一个网站 php SQL使用了UNION ALL 造成网站访问mysql CPU压力非常大 如果对全站的页面进行redis缓存怎么实现 ?这种情况应该怎么解决比较好

阅读 5.9k
6 个回答

1:理解缓存本质。
业务能接受非实时吗?业务调用频率?缓存时间?过期时间?
2:CPU压力过大或其他问题,有确切的分析吗?
3:都没问题后,是否应该考虑是业务本身的呢,如设计上有啥缺陷?缓存掩盖不了设计的bug。因为很多业务场景变化很频繁,即使用缓存,也不能解决。
4:怎么实现?
1):全站缓存是个弊端,不是实现不了,用一个filter 拦截所有请求,req->k,res->v
2):redis数据量非常大时候,必须分集群,增加了复杂性。

很多框架自带cache缓存类,可以修改这个缓存驱动为redis,然后所有从数据库取数据的操作都改为先判断是否有对应缓存,有的话取缓存,没有的话先取数据库,然后再将取到的数据写入一份到缓存里面用于下一次请求使用。

首先考虑一下为什么用缓存,自己总结了一下现在所应用到的一些缓存,顺便巩固一下学到的知识


  1. ob 缓冲区做的局部缓存,比如我一个页面好几天都不会有变化那种,不过局部不缓存就是要你跑异步了,这种方式是缓存静态页,我写的类是加密丢到阿里oss的还蹭了下它的cdn

  2. Redis 我用到了主从分离来解决统计网站 pv,uv,然后写定时脚本对它定时入库的,因为它有个的概念太好了

  3. Memcache 用来缓解部分常用简单的key/value反复查询的数据

还是先从unition上来解决吧,为什么不分开查询,最后组装数据呢

感觉缓存并没办法解决你的问题,反而增加了很多复杂度。 先从SQL的角度来解决吧,分解。

  • 造成CPU消耗过大,建议去定位下具体是什么原因造成。

  • 先看看sql语句上能否优化, 还有会不会有慢查询以及索引是否打上

  • 如果网站数据量确实很大,再考虑使用redis, 可以将redis打造成nosql,业务处理使用redis来实现,只有信息落地再进入mysql

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题