如何动手实现并欣赏localcache领域的优秀开源设计方案?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1879个文字,预计阅读时间需要8分钟。
前言,哈喽,大家好,我是asong。
上篇文章:动手实现一个localcache+设计篇,介绍了设计一个本地缓存要考虑的点,有读者朋友反馈可以借鉴bigcache的存储设计,可以减少GC压力。
前言
哈喽,大家好,我是asong。上篇文章:动手实现一个localcache - 设计篇 介绍了设计一个本地缓存要思考的点,有读者朋友反馈可以借鉴bigcache的存储设计,可以减少GC压力,这个是我之前没有考虑到的,这种开源的优秀设计值得我们学习,所以在动手之前我阅读了几个优质的本地缓存库,总结了一下各个开源库的优秀设计,本文我们就一起来看一下。
高效的并发访问
本地缓存的简单实现可以使用map[string]interface{} + sync.RWMutex的组合,使用sync.RWMutex对读进行了优化,但是当并发量上来以后,还是变成了串行读,等待锁的goroutine就会block住。为了解决这个问题我们可以进行分桶,每个桶使用一把锁,减少竞争。分桶也可以理解为分片,每一个缓存对象都根据他的key做hash(key),然后在进行分片:hash(key)%N,N就是要分片的数量;理想情况下,每个请求都平均落在各自分片上,基本无锁竞争。
本文共计1879个文字,预计阅读时间需要8分钟。
前言,哈喽,大家好,我是asong。
上篇文章:动手实现一个localcache+设计篇,介绍了设计一个本地缓存要考虑的点,有读者朋友反馈可以借鉴bigcache的存储设计,可以减少GC压力。
前言
哈喽,大家好,我是asong。上篇文章:动手实现一个localcache - 设计篇 介绍了设计一个本地缓存要思考的点,有读者朋友反馈可以借鉴bigcache的存储设计,可以减少GC压力,这个是我之前没有考虑到的,这种开源的优秀设计值得我们学习,所以在动手之前我阅读了几个优质的本地缓存库,总结了一下各个开源库的优秀设计,本文我们就一起来看一下。
高效的并发访问
本地缓存的简单实现可以使用map[string]interface{} + sync.RWMutex的组合,使用sync.RWMutex对读进行了优化,但是当并发量上来以后,还是变成了串行读,等待锁的goroutine就会block住。为了解决这个问题我们可以进行分桶,每个桶使用一把锁,减少竞争。分桶也可以理解为分片,每一个缓存对象都根据他的key做hash(key),然后在进行分片:hash(key)%N,N就是要分片的数量;理想情况下,每个请求都平均落在各自分片上,基本无锁竞争。

