NOTE
2.1 如何设计一个缓存中间件
1. 什么是缓存中间件 - 通用缓存的基础设施 2. 为什么需要缓存中间件 - 为应用层屏蔽缓存的读写、并发安全、缓存淘汰、分布式支持等细节 3. 如何设计缓存组件 3.1. 基本读写 - 比如HashMap能实现O(1)的读写效率 3.2. 并发安全 多线程同时读写缓存会出问题,如何解决? 3.2
这是历史学习笔记,可能存在过时或不完整的理解。
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. 集中式缓存
- 单独的缓存进程+网络访问
- 优点:
- 各个节点不需要同步数据
- 一致性好
- 缺点:
- 需要网络访问效率低点