簡單好用的緩存庫 gcache
- 前言
開發時,如果你需要對數據進行臨時緩存,按照一定的淘汰策略,那麼 gcache 你一定不要錯過。gcache golang 的緩存庫。它支持可擴展的 Cache,可以選擇 LFU,LRU、ARC 等淘汰算法。
- 特性
gcache 有很多特性:
-
支持過期淘汰算法 Cache, 比如 LFU, LRU 和 ARC
-
Goroutine 安全
-
支持事件處理程序,淘汰、清除、添加 (可選)
-
自動加載緩存,如果它不存在 (可選)
-
… ….
更多功能特性請查看:gcache (文末鏈接點擊可直接跳轉哦~)
- 快速安裝
直接 get 即可使用。
$ go get -u https://github.com/bluele/gcache
- 簡單舉例
package main
import (
"github.com/bluele/gcache"
"fmt"
)
func main() {
gc := gcache.New(20).
LRU().
Build()
gc.Set("key", "ok")
value, err := gc.Get("key")
if err != nil {
panic(err)
}
fmt.Println("Get:", value)
}
執行,控制檯輸出如下:
Get: ok
- 設置淘汰時間舉例
package main
import (
"github.com/bluele/gcache"
"fmt"
"time"
)
func main() {
gc := gcache.New(20).
LRU().
Build()
gc.SetWithExpire("key", "ok", time.Second*10)
value, _ := gc.Get("key")
fmt.Println("Get:", value)
// Wait for value to expire
time.Sleep(time.Second*10)
value, err := gc.Get("key")
if err != nil {
panic(err)
}
fmt.Println("Get:", value)
}
執行,控制檯輸出如下:
Get: ok
panic: Key not found.
goroutine 1 [running]:
main.main()
/Users/laocheng/work/code/market-data-backend/utils/t/2.go:22 +0x21b
exit status 2
可以看到,一開始獲取成功;但是超時時間設定後,過期刪除,無法獲取到了。
- 其他算法舉例
6.1 最不經常使用(LFU)
func main() {
// size: 10
gc := gcache.New(10).
LFU().
Build()
gc.Set("key", "value")
}
6.2 最近使用最少的 (LRU)
func main() {
// size: 10
gc := gcache.New(10).
LRU().
Build()
gc.Set("key", "value")
}
6.3 自適應替換緩存 (ARC) 在 LRU 和 LFU 之間不斷平衡,以提高綜合結果。
func main() {
// size: 10
gc := gcache.New(10).
ARC().
Build()
gc.Set("key", "value")
}
- 添加 hanlder 使用
func main() {
gc := gcache.New(2).
AddedFunc(func(key, value interface{}) {
fmt.Println("added key:", key)
}).
Build()
for i := 0; i < 3; i++ {
gc.Set(i, i*i)
}
}
執行,控制檯輸出如下:
added key: 0
added key: 1
added key: 2
可以在 set 時候做一些額外的處理。
- 總結
gcache 是一個非常簡單,又好用的緩存庫,它支持 LFU,LRU、ARC 等淘汰算法。如果你在開發時候有這方面的需求,不妨試試看,相信一定會喜歡上的!
參考資料:
- gcache
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/8Vrps5OKZzXaBYP1PvdBVw