做了一个网站 php SQL使用了UNION ALL 造成网站访问mysql CPU压力非常大 如果对全站的页面进行redis缓存怎么实现 ?这种情况应该怎么解决比较好
做了一个网站 php SQL使用了UNION ALL 造成网站访问mysql CPU压力非常大 如果对全站的页面进行redis缓存怎么实现 ?这种情况应该怎么解决比较好
很多框架自带cache缓存类,可以修改这个缓存驱动为redis,然后所有从数据库取数据的操作都改为先判断是否有对应缓存,有的话取缓存,没有的话先取数据库,然后再将取到的数据写入一份到缓存里面用于下一次请求使用。
首先考虑一下为什么用缓存,自己总结了一下现在所应用到的一些缓存,顺便巩固一下学到的知识
ob
缓冲区做的局部缓存,比如我一个页面好几天都不会有变化那种,不过局部不缓存就是要你跑异步了,这种方式是缓存静态页,我写的类是加密丢到阿里oss
的还蹭了下它的cdn
Redis
我用到了主从分离来解决统计网站 pv
,uv
,然后写定时脚本对它定时入库的,因为它有个表
的概念太好了
Memcache
用来缓解部分常用简单的key/value
反复查询的数据
造成CPU消耗过大,建议去定位下具体是什么原因造成。
先看看sql语句上能否优化, 还有会不会有慢查询以及索引是否打上
如果网站数据量确实很大,再考虑使用redis, 可以将redis打造成nosql,业务处理使用redis来实现,只有信息落地再进入mysql
5 回答3.2k 阅读✓ 已解决
3 回答3.6k 阅读✓ 已解决
1 回答4k 阅读✓ 已解决
3 回答1.8k 阅读✓ 已解决
2 回答2.2k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
2 回答3.1k 阅读
1:理解缓存本质。
业务能接受非实时吗?业务调用频率?缓存时间?过期时间?
2:CPU压力过大或其他问题,有确切的分析吗?
3:都没问题后,是否应该考虑是业务本身的呢,如设计上有啥缺陷?缓存掩盖不了设计的bug。因为很多业务场景变化很频繁,即使用缓存,也不能解决。
4:怎么实现?
1):全站缓存是个弊端,不是实现不了,用一个filter 拦截所有请求,req->k,res->v
2):redis数据量非常大时候,必须分集群,增加了复杂性。