NOTE

2.1 如何设计一个缓存中间件

1. 什么是缓存中间件 - 通用缓存的基础设施 2. 为什么需要缓存中间件 - 为应用层屏蔽缓存的读写、并发安全、缓存淘汰、分布式支持等细节 3. 如何设计缓存组件 3.1. 基本读写 - 比如HashMap能实现O(1)的读写效率 3.2. 并发安全 多线程同时读写缓存会出问题,如何解决? 3.2

系统设计创建于 更新于 historical

这是历史学习笔记,可能存在过时或不完整的理解。

1. 什么是缓存中间件

  • 通用缓存的基础设施

2. 为什么需要缓存中间件

  • 为应用层屏蔽缓存的读写、并发安全、缓存淘汰、分布式支持等细节

3. 如何设计缓存组件

3.1. 基本读写

  • 比如HashMap能实现O(1)的读写效率

3.2. 并发安全

多线程同时读写缓存会出问题,如何解决?

3.2.1. 加锁

  • 为了避免锁粒度太大导致并发低,可以采用JDK1.7的ConcurrentHashMap的思想
    • 将缓存拆分为多个分片,并对每个分片都有一个锁,这样,如果客户端从不同的分片更新缓存,客户端就不会彼此等待。
  • sync.map.md(关联笔记尚未公开)
  • JDK1.8的ConcurrentHashMap.md
  • JDK1.7的ConcurrentHashMap.md

3.2.2. 日志异步更新

  • 参考数据库的设计,将所有的更新写入日志中,后台进程读取日志进而更新缓存

3.3. 缓存淘汰策略

  • 缓存替换策略.md(关联笔记尚未公开)

3.4. 分布式

3.4.1. 复制式缓存

  • 进程内缓存+分布式系统复制.md
  • 优点:进程内访问效率高
  • 缺点:
    • 各个节点需要同步数据,节点越多同步越慢
    • 一致性差

3.4.2. 集中式缓存

  • 单独的缓存进程+网络访问
  • 优点:
    • 各个节点不需要同步数据
    • 一致性好
  • 缺点:
    • 需要网络访问效率低点

4. 例子

4.1. Redis

4.2. Caffeine

5. 参考