有很多文章介绍缓存服务器,但大多都只是说明概念,都在讲架构,没有实现过程。
假设我有一个大型商场,URL www.x.com/id=111,指向 id 为 111 的商品详情
不考虑多级缓存,不考虑缓存失效问题,如何用缓存来提高页面 www.x.com/id=111 性能
有很多文章介绍缓存服务器,但大多都只是说明概念,都在讲架构,没有实现过程。
假设我有一个大型商场,URL www.x.com/id=111,指向 id 为 111 的商品详情
不考虑多级缓存,不考虑缓存失效问题,如何用缓存来提高页面 www.x.com/id=111 性能
不要过早的优化
确定现在访问页面是不是有性能问题.
如果有性能问题, 那么瓶颈在哪里? Web Server 还是 DB, 是动态资源访问慢, 还是动态资源慢.
如果是静态资源慢可以考虑:
a.设置文件的过期时间
b.考虑购买CDN, 或者自己做.(varnish, squid...)
如果是动态资源慢:
使用相关的profile工具, 分析代码执行效率. 找到比较耗时的操作.
如果是数据库操作慢:
确定数据库参数是否合理
查看慢查询log, 针对每一条SQL进行优化.
考虑是否添加缓存.(Memcache, redis...)
1 回答1.1k 阅读✓ 已解决
2 回答804 阅读✓ 已解决
1 回答946 阅读✓ 已解决
1 回答653 阅读✓ 已解决
1 回答1.4k 阅读
2 回答836 阅读
看题目描述,我先假设题主不是要缓存在实际项目中的各种应用及延伸,而是一个最简单的实现。就拿你的大型商城例子来说怎么实现一个最基本的缓存。
定义问题先
设置缓存的目的是提速。但速度这种东西的相对的,想提速得先知道哪慢了。相对于内存来说,从硬盘读数据慢;相对于本机来说,网络传输慢。
所以在开始缓存之前,我们先假设这个大型商场从数据库读数据这里慢了。
把缓存设置在应用服务器这里,先不考虑优化数据库的性能。
现在要求解的问题就是如何实现
[缓存]
这里。实现
没有缓存时,访问URL
http://www.x.com/index?id=111
时的部分代码:改造后
不考虑分布式不考虑多级不考虑失效,我们的缓存模块已经写完了。(但这个实现有问题,后面说)
分析
添加缓存前,由于每次请求都从数据库中拿数据,需要通过网络/磁盘,速度慢,数据库压力大。
现在将结果放在内存中做缓存,如果后面的请求命中了这个缓存,就能直接从内存中获取数据,而内存显然比网络/磁盘快的多。
题主的例子还包含了应用缓存机制的一个隐性条件:近期被访问过的数据有很大几率会被再次访问。
比如商城的促销商品,或者淘宝爆款。一定时期内大量的访问都会指向这些数据,这时缓存的价值才最大化了。
(发散下思维,以下开始胡思乱想,推荐忽略)
回到前面说的这个简单实现的问题:没有失效机制
尽管假设中说明了可以不考虑失效,但是不失效的缓存还是缓存么。
通常来说内存虽然速度比磁盘快,但成本高,容量小。这都是失效机制的意义所在(我把内存自带的断电失效机制忘了233333),更别说数据一致性的问题了。
如果有这样的一种缓存介质,成本和磁盘一样低,速度和内存一样快,断电不丢数据,又稳定又可靠,那它本身就是存储原始数据的完美位置了。。
复制出热数据加速访问的,叫缓存;
复制出全数据的,叫冗余;
复制出全数据永不失效的,叫灾备;
不仅全数据永不失效,速度还比原来快的,你可能是搞到忆阻器了。。。