go是一個很是高效的語言, 對併發的處理很是的好, 對於內存方面沿用相似java的GC方式進行內存的回收. 可是GO的GC的回收很是的耗時.因此提出了高效緩存的機制. 如今高效緩存包括:Bigcache Freecache, groupCahce.下面對三種方式的實現機制作一個解析:java
下面這段是原文的介紹:git
Fast, concurrent, evicting in-memory cache written to keep big number of entries without impact on performance. BigCache keeps entries on heap but omits GC for them. To achieve that operations on bytes arrays take place, therefore entries (de)serialization in front of the cache will be needed in most use cases.
意思是Bigcache是一個快速,同步,內存外的緩存, 其保證大條目數據而不影響性能, Bigcahche保證全部數據都在堆上而忽略系統的GC. 使用bytes arrays完成操做. 所以在使用前須要進行序列化和反序列話.github
Bigcache使用map[uint64]uint32做爲hash的key值以及vaule的全局偏移量.算法
官方的介紹以下:後端
FreeCache avoids GC overhead by reducing the number of pointers. No matter how many entries stored in it, there are only 512 pointers. The data set is sharded into 256 segments by the hash value of the key. Each segment has only two pointers, one is the ring buffer that stores keys and values, the other one is the index slice which used to lookup for an entry. Each segment has its own lock, so it supports high concurrent access.
Freechche 經過減小指針的數量從而避免過多的GC. 無論系統保存多少指針, 這裏只有512個指針. 數據利用key-value的形式被分配到256個段中. 每一個段中包含兩個指針,一個是循環鏈用於存儲key-values,另一個是片的索引用於全局的搜索. 每一個段都有其獨立的鎖, 所以它支持高併發訪問.緩存
FreeCache是一個近似LRU的算法, 什麼是LRU算法? LRU是內存管理的一種方式,即內存頁置換方式, 對於已經分配的可是沒有使用的數據進行緩存, 當緩存滿了以後,按照必定的規則順序對存儲的數據進行置換.併發
目前Groupcache僅支持go語言,經常做爲memcache的替換方案. Groupcache不須要額外的設置,高併發
Groupcache便是客戶端的lib也是服務端的lib.性能
GroupCache不支持更改和刪除的功能,當value的值設定以後不能更改, 即沒有過時的時間,也沒有刪除的功能.ui
從這三種方式github上面go語言的start的數量來看,Groupcache是最高的.
最近在研究開源的mattermost代碼,其 後端也是使用的Groupchce實現的.
目前對這三種緩存尚未實際的使用經驗,後續若是繼續作研究,再寫新的總結.
博客連接:http://114.116.145.166:5897/blogs/amei/articles/2019/04/01/1554090839751