写在前面
这个项目是跟着博主geektutu
的7Days系列做的分布式缓存服务。
在此记录一些实现项目过程中的学习收获与思考。
什么是分布式缓存?
分布式缓存 是指将应用系统和缓存组件进行分离的缓存机制。
与其相对的是本地缓存。
本地缓存 是指应用系统中的缓存组件。
其最大的优点是应用和cache是在同一个进程内部,请求缓存非常快速,没有过多的网络开销等,在单应用不需要集群支持的场景下使用本地缓存较合适;但是,它的缺点也是应为缓存跟应用程序耦合,多个应用程序无法共享缓存数据,各应用或集群的各节点都需要维护自己的单独缓存。
分布式缓存的优势和特性有哪些?
- 共享缓存数据:缓存服务和应用程序是隔离开的,多个应用系统之间可以直接共享缓存数据。
- 高性能:磁盘I/O速度非常慢,面对高并发高可用的场景往往成为性能瓶颈,缓存将高速内存作为存储介质,数据以
key-value
形式存储,访问速度非常快。 - 动态扩展性:可以动态增加或减少节点应对变化的数据访问负载,可拓展性强,并最大程度提高资源利用率。
为什么要使用分布式缓存?
- 读取速度得到提升。
- 系统扩展能力得到大幅增强。我们可以通过加缓存,来让系统的承载能力提升。
- 总成本下降,单台缓存即可承担原来的多台DB的请求量,大大节省了机器成本。
项目背景
设计一个分布式缓存系统,需要考虑资源控制、淘汰策略、并发、分布式节点通信等各个方面的问题。而且,针对不同的应用场景,还需要在不同的特性之间权衡,例如,是否需要支持缓存更新?还是假定缓存在淘汰之前是不允许改变的?不同的权衡对应着不同的实现。
GoCache
基本上模仿了 groupcache
的实现,总体实现上,还是 groupcache
非常接近的。支持特性有:
- 单机缓存和基于
HTTP
的分布式缓存 - 最近最少访问
(Least Recently Used, LRU)
缓存策略 - 使用
Go
锁机制防止缓存击穿 - 使用一致性哈希选择节点,实现负载均衡
- 使用
protobuf
优化节点间二进制通信