golang中的cache使用对比
创始人
2024-05-29 19:42:21

go-cache

安装方法:go get github.com/patrickmn/go-cache
是一个运行在单机上的k/v缓存,相当于memcached,实现线程安全,可以带有过期时间访问清理。里面有cache和sharded cache两种,而且加入了单测可以去看怎么去使用,value支持有限的数据类型不过可扩展,是一个比较老的实现,go-cache实质上就是拥有过期时间并且线程安全的map,可以被多个goroutine安全访问。当成一个简单可用的demo是可以好的。

FreeCache - A cache library for Go with zero GC overhead and high concurrent performance.

https://github.com/coocood/freecache.git
0gc过剩,支持高并发,支持lru,支持过期清理get,严格限制内存使用量,同时具有审计平均access时间,hitcount等功能,现在仍有活跃开发

FreeCache 将缓存分成了 256 段,每段包括 256 个槽和一个 ring buffer 存储数据。set数据使用 hash 值下 8 位作为标识 id,通过使用 LSB 9-16 的值作为槽 ID。将数据分配到多个槽里面,有助于优化查询的时间 ( 分治策略 )。

数据被存储在 每个槽的ring buffer 中,相当于一个排序的数组里面。如果 ring buffer 内存不足,则会利用 LRU 的策略在 ring buffer 逐个扫描,如果缓存的最后访问时间小于平均访问的时间,就会被删掉。要找到一个缓存内容,在槽中是通过二分查找法对一个已经排好的数据进行查询。

BIGCache

https://github.com/allegro/bigcache.git

支持分片支持时间控制,支持最大cache空间限制,支持verbose开关 使用读写锁RWMUTEX读锁无消耗
参数如下,是个全面可控的golang cache

Shards
CleanWindow
MaxEntriesInWindow
MaxEntrySize
Verbose
HardMaxCacheSize
OnRemove
OnRemoveWithReason
BigCache 会通过 Hash 的方式进行分片。 每个分片都包含一个 map 和一个 ring buffer。无论如何添加元素,都会将它放置在对应的 ring buffer 中,并将位置保存在 map 中。如果多次设置相同的元素,则 ring buffer 中的旧值则会被标记为无效,如果 ring buffer 太小,则会进行扩容。

每个 map 的 key 都是一个 uint32 的 hash 值,每个值对应一个存储着元数据的 ring buffer。如果 hash 值碰撞了,BigCache 会忽略旧 key,然后把新的值存储到 map 中。预先分配更少,更大的 ring buffer,使用 map [uint32] uint32 是避免支付 GC 扫描成本的好方法

BigCache 不能有效地利用缓冲区,并且可能会在缓冲区中为同一个键存储多个条目。
BigCache 不更新访问 ( 读 ) 条目,因此会导致最近访问的键被删除

GroupCache

https://github.com/golang/groupcache.git
星标最多的cache 支持shardByKey,P2P形式形成一个分布式缓存,更好的cachefilling,得益于p2p,cache不命中时只需要在其中的某个cache添加data即可,同时抛弃版本号的概念并支持把super-hot key备份到所有节点

GroupCache 使用链表和 Map 实现了一个精准的 LRU 删除策略的缓存。为了进行公平的比较,我们在 GroupCache 的基础上,实现了一个包括 256 个分片的切片结构。

使用

根据实际情况,我只需要在Http服务器上加一个内存缓存以提高响应效率,首先使用的是 bigcache,它的过期时间是全局设置的,不能针对单个key来设置,另外一个就是,内存占用有点奇怪,本地看着没问题,线上将近300M,没有找到原因。然后就是,对象需要经过序列化来存储。

go-cache 支持针对单个key设置过期时间,可以存储任意类型不需要序列化,内部实现相对简单,内存未出现异常。

上一篇:第四章 opengl之变换

下一篇:焦虑的根源

相关内容

热门资讯

苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...