分布式缓存

1991/6/26 面试分布式

# 1、分布式系统中常用的缓存方案有哪些?

  • 客户端缓存:页面和浏览器缓存,APP缓存,H5缓存,localStorage和sessionStorage
  • CDN缓存:
    • 内存存储:数据的缓存
    • 内容分发:负载均衡
  • nginx缓存:本地缓存,外部缓存
  • 数据库缓存:持久层缓存(mybatis,hibernate多级缓存),Mysql查询缓存
  • 操作系统缓存:Page Cache,Buffer Cache

# 2、分布式系统缓存的更新模式?

  • Cache Aside模式
  1. 读取失效:cache数据没有命中,查询DB,成功后把数据写入缓存
  2. 读取命中:读取cache数据
  3. 更新:把数据更新到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);
1
2
3
4
5
6
7
8
9
10
  • Read/Write Through模式

缓存代理了DB读取、写入的逻辑,可以把缓存看成唯一的存储。

  • Write Back模式

这种模式下所有的操作都走缓存,缓存里的数据再通过异步的方式同步到数据库里面。所以系统的写性能能够大大提升了。

# 3、分布式系统缓存淘汰策略

缓存淘汰,又称为缓存逐出(cache replacement algorithms或者cache replacement policies),是指在存储空间不足的情况下,缓存系统主动释放一些缓存对象获取更多的存储空间。一般LRU用的比较多,可以重点了解一下。

  • FIFO 先进先出(First In First Out)是一种简单的淘汰策略,缓存对象以队列的形式存在,如果空间不足,就释放队列头部的(先缓存)对象。一般用链表实现。
  • LRU 最近最久未使用(Least Recently Used),这种策略是根据访问的时间先后来进行淘汰的,如果空间不足,会释放最久没有访问的对象(上次访问时间最早的对象)。比较常见的是通过优先队列来实现。
  • LFU 最近最少使用(Least Frequently Used),这种策略根据最近访问的频率来进行淘汰,如果空间不足,会释放最近访问频率最低的对象。这个算法也是用优先队列实现的比较常见。

更进一步的谈谈Redis缓存淘汰的8个模式,可以参考上文Redis问答部分。