存储在计算机上的一个原始数据复制集,以便于访问。
是介于数据访问者和数据源之间的高速存储,当数据需要多次读取的时候用于加快读取速度。
读缓存
是介于数据访问者和数据源之间的高速存储,进行高速介质(cpu、内存)到低速介质(硬盘、网卡)的匹配。
写缓冲
缓存是否有效依赖于能多少次重用同一个缓存来响应业务请求
命中率是缓存的关键指标
如果查询一个缓存,十次查询九次能够得到正确结果,那么他的命中率就是90%
影响命中率的主要指标:
读取缓存数据时通过缓存键进行精准匹配,缓存键越少,效率越高
可使用内存空间直接决定了缓存对象的平均大小和数量,空间越大,命中率越高
TimeToLive,TTL越长,被重用的可能性越高
read-through,通读缓存给客户端返回缓存资源,并在请求未命中时请求原始服务器
客户端连接的是通读缓存而不是生成响应的原始服务器
cache-aside,对象缓存是一种旁路缓存,旁路缓存通常是一个独立的键值对存储。
应用代码通常首先询问需要的对象是否存在,如果存在则获取后直接返回,不存在则请求原始服务器获得响应后也会缓存到旁路缓存。
var preferences = { /* data object to be stored */};
localStorage.setItem('preferences',JSON.stringify(preferences));
// 访问
var cachedData = localStorage.getItem('preferences');
var preferences = JSON.parse(cachedData);
分布式寻址算法是分布式对象缓存的关键,即缓存键如何分布到不同服务器,集群增加节点时如何处理
操作类型 | 粗略时间 |
---|---|
访问本地内存 | 100ns |
SSD磁盘搜索 | 100,000ns |
网络数据包在同一个数据中心来回一次的时间 | 500,000ns |
非SSD磁盘搜索 | 10,000,000ns |
按顺序从网络读取1MB数据 | 10,000,000ns |
按顺序从非SSD磁盘读取1MB数据 | 30,000,000ns |
跨大西洋网络数据包来回一次的时间 | 150,000,000ns |
跨太平洋网络数据包来回一次的时间 | 300,000,000ns |
每秒等于多少 | 1,000,000,000ns |
此类型数据应用还来不及读取就失效了徒增系统负担,一般数据的读写比在2:1以上,缓存才有意义。
缓存使用内存存储,内存资源有限且宝贵,如果数据没有二八定律即大部分访问集中在小部分数据上,则缓存效果不会明显
一般会对缓存数据设置过期时间,过期时间内可能会和数据库不一致,如果业务容忍则也可以使用,如果业务不能容忍,则需要数据在数据库变更时也要清除缓存。
缓存中存放的是热点数据,热点数据通过LRU算法筛选出来的,整个过程时间比较长,过程内性能一般,需要在缓存系统启动时就把热点数据加载好就是缓存预热warm up,
如果不恰当的业务或恶意请求持续高并发的请求某个不存在的缓存,如果缓存没有相应的对策,那所有的查询请求都落到数据库上,带来很大的压力,甚至崩溃。一个简单的对策是将不存在的数据也缓存起来值为null,并设置较短的过期时间
当缓存服务器崩溃时,请求压力全部打倒数据库,导致数据库也宕机,进而整个服务失效。发生这种问题时甚至不能简单的重启缓存服务器和数据库服务器来恢复。