剖析Golang Bigcache的极致性能优化

剖析Golang Bigcache的极致性能优化

💡 原文中文,约6200字,阅读约需15分钟。
📝

内容提要

Bigcache是用Golang实现的本地内存缓存的开源库,主打的就是可缓存数据量大,查询速度快。它通过数据分片存储、避免GC对map的影响和采用FIFO式的Ring Buffer设计等方式来提高性能。Bigcache的设计思想包括避免GC对map的影响、数据分片存储和FIFO式的内存结构设计。它的Set过程是将key和value序列化成[]byte并存储到BytesQueue中,然后将key和value的信息存储到hashmap中。Get过程是Set的逆过程,删除操作只是将key从map中删除。Bigcache的过期淘汰是通过遍历数组来删除过期的元素。它还进行了细节的极致优化,如使用ffjson替换json操作来提高性能。

🎯

关键要点

  • Bigcache是用Golang实现的本地内存缓存的开源库,主打可缓存数据量大和查询速度快。

  • Bigcache的设计目标包括缓存元素数量大、延迟要求低和稳定性高。

  • 大多数开源缓存库基于map实现,Bigcache设计了全新的缓存库以解决性能问题。

  • Bigcache的设计思想包括避免GC对map的影响、数据分片存储和FIFO式的内存结构设计。

  • 避免GC对map的影响是通过不在map中存储指针来实现的。

  • Bigcache采用数据分片存储以降低锁冲突并提升并发量。

  • Bigcache的shard设计要求固定不变,且shard个数为2的平方数以提高计算效率。

  • Bigcache使用FIFO式的Ring Buffer设计来管理内存,简化数据管理逻辑。

  • Set过程包括计算key的hash值、序列化key和value并存储到BytesQueue中。

  • Bigcache在处理旧值时不会复用内存,而是将新值push到队列中。

  • 当ring buffer满时,Bigcache会扩容或淘汰最旧数据以腾出空间。

  • Get过程是Set的逆过程,支持获取过期数据而不报错。

  • 删除操作仅将key从map中删除,原始值在内存中仍然保留。

  • Bigcache的过期淘汰逻辑简单,所有元素的过期时间一致,遍历数组进行清理。

  • Bigcache在细节上进行了极致优化,如使用ffjson替换标准json操作以提高性能。

🏷️

标签

➡️

继续阅读