文章目录
- 首先,项目来自极客兔兔分布式缓存-GeeCache,我们先来谈谈分布式缓存,然后介绍一下项目,后序几篇来进行详细分析以及加一些自己的思考。
1. 分布式缓存
- 引用极客兔兔博客中的一句话,因为我感觉这句话说得很NB。
1.1 背景
- 有很多应用场景中涉及到频繁访问一些数据,例如:我们看见的一些点赞量、转发量、网站访问量等,如果我们从数据库中去读取会很慢,因为数据库中的数据存在磁盘上(需要通过IO操作将磁盘数据取到内存中,再从内存中读取数据),而为了增加访问效率,加快访问速度,因此将频繁访问的数据存在内存中,从内存去读,远远快于从磁盘访问数据(如下图)。
1.2 面临的问题
1.2.1 内存
- 将数据存到内存中,但是内存是有限的,那么对于内存中的数据就需要采用相关的策略来淘汰一些数据,常用的有FIFO(先进先出)、LRU(最近最少使用)等。
1.2.2 并发写
- 对于这些数据肯定是涉及到修改等操作的,例如:常看到的一条热门消息的点赞量和转发量在实时的变化,因此对于并发操作涉及到加锁,以保证写入的正确性和一致性。
1.2.3 单机性能
- 单个机器的各种计算资源、存储资源都是有限的,因此对于大型的系统的数据量而言,采用多节点的分布式部署是一种好的选择。
2. 分布式内存对象缓存系统介绍
2.1 Memcached
2.1.1 介绍
- 引用Memcached介绍
2.1.2 常见的提速方法
2.1.3 memcached特征
2.1.4 使用场景
2.2 groupcache
- groupcache是一个kv缓存,用于在某些方面替代memcache,groupcache 不像其它的一些缓存数据库有个服务端,需要客户端去连接,换句话说,它本没有服务端或者人人都是服务端。相对于 memcached,groupcache 提供更小的功能集和更高的效率,以第三方库的形式提供服务。
- 还有一个问题,当多个客户端同时访问memcache中不存在的键时,会导致多个客户端从mysql获取数据并同时插入memcache中,而在相同情况下,groupcache只会有一个客户端从mysql获取数据,其他客户端阻塞,直到第一个客户端获取到数据之后,再返回给多个客户端。
2.3 GeeCache
- GeeCache基本上模仿了groupcache的实现,实现了单机缓存和基于 HTTP 的分布式缓存、最近最少访问(Least Recently Used, LRU) 缓存策略、使用 Go 锁机制防止缓存击穿、使用一致性哈希选择节点,实现负载均衡、使用 protobuf 优化节点间二进制通信等。
参考
- memcached原理及介绍
- golang语言之groupcache