Go 語言編寫的緩存及緩存過濾庫:groupcache
groupcache 是使用 Go 語言編寫的緩存及緩存過濾庫,作為 memcached 許多場景下的替代版本。 對比原始 memcached
首先,groupcache 與 memcached 的相似之處:通過 key 分片,并且通過 key 來查詢響應的 peer。
其次,groupcache 與 memcached 的不同之處:
1. 不需要對服務器進行單獨的設置,這將大幅度減少部署和配置的工作量。groupcache 既是客戶端庫也是服務器庫,并連接到自己的 peer 上。
2. 具有緩存過濾機制。眾所周知,在 memcached 出現“Sorry,cache miss(緩存丟失)”時,經常會因為不受控制用戶數量的請求而導致數據庫(或者其它組件)產生“驚群效應(thundering herd)”;groupcache 會協調緩存填充,只會將重復調用中的一個放于緩存,而處理結果將發送給所有相同的調用者。
3. 不支持多個版本的值。如果“foo”鍵對應的值是“bar”,那么鍵“foo”的值永遠都是“bar”。這里既沒有緩存的有效期,也沒有明確的緩存回收機制,因此同樣也沒有 CAS 或者 Increment/Decrement。
4. 基于上一點的改變,groupcache 就具備了自動備份“超熱”項進行多重處理,這就避免了 memcached 中對某些鍵值過量訪問而造成所在機器 CPU 或者 NIC 過載。
me := "http://10.0.0.1"
peers := groupcache.NewHTTPPool(me)
// Whenever peers change:
peers.Set("http://10.0.0.1", "http://10.0.0.2", "http://10.0.0.3")
var thumbNails = groupcache.NewGroup("thumbnail", 64<<20, groupcache.GetterFunc(
func(ctx groupcache.Context, key string, dest groupcache.Sink) error {
fileName := key
dest.SetBytes(generateThumbnail(fileName))
return nil
}))
var data []byte
err := thumbNails.Get(ctx, "big-file.jpg",
groupcache.AllocatingByteSliceSink(&data))
// ...
http.ServeContent(w, r, "big-file-thumb.jpg", modTime, bytes.NewReader(data))
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!