数据的缓存
数据缓存的基本概念是通过某种方式获取数据之后,把数据存储起来,以方便后面可以更加有效的获取。数据缓存一方面可以减少系统的复杂操作,提高性能,另一方面,减少网络延迟(很多就得到结果,不需要长连接,占用网络资源).
缓存需要考虑几个问题:
* 缓存的大小 -- 缓存要占用资源,资源不是无限的,所以要对缓存的大小做好规划
* 缓存数据的并行访问 -- 同时如果有多个对数据的访问,应该不是问题
* 缓存数据的时效效性 -- 缓存的数据须有个时效性。时效性的标准必须明确。过时的数据可能不是系统预期的行为。
* 缓存数据的一致性 -- 缓存的数据不能跟系统其他部分的数据相互矛盾。
有些场景下,还要考虑下面两种情况:
* 有层级的缓存 -- 把缓存分级。 进一步提升系统性能。
* 预缓存 -- 在数据尚未真正请求的时候就已经把数据缓存起来了。
这两种情况跟业务逻辑紧密相关。
对于动态网站来说, 有三种级别的缓存:
* 缓存整个页面,或者某一部分(比如导航部分,根据数据库查询生成,很少改变)
* 缓存跨请求的数据,比如任意的会话数据(session data, 购物篮),用户的侧写数据
* 缓存计算结果,比如数据库查询结果, 某个RPC返回的数据
那么,怎么判断哪些数据需要缓存,而且可以缓存呢?
* 完全静态的页面?
* 在某一些时间段内静态的页面?
* 完全静态的数据?
* 在某一些时间段捏是静态的数据?
如何衡量一个缓存机制是成功的呢?
一个指标,就是cache locality; = cache read hits / cache read attempts. 在100次读取缓存的操作中,有多少次能真正读取到正确的数据。
当这个值比较小的时候,缓存不但没有提高系统的性能,反而降低了性能。