分布式缓存
分布式系统中常用的缓存方案有哪些?
- 客户端缓存:页面和浏览器缓存,APP缓存,H5缓存,localStorage和sessionStorage
- CDN缓存:
- 内存存储:数据的缓存
- 内容分发:负载均衡
- nginx缓存:本地缓存,外部缓存
- 数据库缓存:持久层缓存(mybatis,hibernate多级缓存),Mysql查询缓存
- 操作系统缓存:Page Cache,Buffer Cache
分布式系统缓存的更新模式?
- Cache Aside模式
- 读取失效:cache数据没有命中,查询DB,成功后把数据写入缓存
- 读取命中:读取cache数据
- 更新:把数据更新到DB,失效缓存
// Read data = cache.get(id); if (data == null) { data = db.get(id); cache.put(id, data); } // Write db.save(data); cache.invalid(data.id);
- Read/Write Through模式
缓存代理了DB读取、写入的逻辑,可以把缓存看成唯一的存储。
- Write Back模式
这种模式下所有的操作都走缓存,缓存里的数据再通过异步的方式同步到数据库里面。所以系统的写性能能够大大提升了。
分布式系统缓存淘汰策略
缓存淘汰,又称为缓存逐出(cache replacement algorithms或者cache replacement policies),是指在存储空间不足的情况下,缓存系统主动释放一些缓存对象获取更多的存储空间。一般LRU用的比较多,可以重点了解一下。
- FIFO 先进先出(First In First Out)是一种简单的淘汰策略,缓存对象以队列的形式存在,如果空间不足,就释放队列头部的(先缓存)对象。一般用链表实现。
- LRU 最近最久未使用(Least Recently Used),这种策略是根据访问的时间先后来进行淘汰的,如果空间不足,会释放最久没有访问的对象(上次访问时间最早的对象)。比较常见的是通过优先队列来实现。
- LFU 最近最少使用(Least Frequently Used),这种策略根据最近访问的频率来进行淘汰,如果空间不足,会释放最近访问频率最低的对象。这个算法也是用优先队列实现的比较常见。