0
点赞
收藏
分享

微信扫一扫

【分布式缓存源码分析】Memcached、groupcache和GeeCache(一)

闲嫌咸贤 2022-02-03 阅读 64

文章目录

  • 首先,项目来自极客兔兔分布式缓存-GeeCache,我们先来谈谈分布式缓存,然后介绍一下项目,后序几篇来进行详细分析以及加一些自己的思考。

1. 分布式缓存

  • 引用极客兔兔博客中的一句话,因为我感觉这句话说得很NB。

1.1 背景

  • 有很多应用场景中涉及到频繁访问一些数据,例如:我们看见的一些点赞量、转发量、网站访问量等,如果我们从数据库中去读取会很慢,因为数据库中的数据存在磁盘上(需要通过IO操作将磁盘数据取到内存中,再从内存中读取数据),而为了增加访问效率,加快访问速度,因此将频繁访问的数据存在内存中,从内存去读,远远快于从磁盘访问数据(如下图)。
    0

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 优化节点间二进制通信等。

参考

  1. memcached原理及介绍
  2. golang语言之groupcache
举报

相关推荐

0 条评论