golang 每日一庫之 bluele-gcache
bluele/gcache
是一個 高性能、功能豐富的 Go 語言緩存庫,支持多種緩存策略,如 LRU(最近最少使用)、LFU(最少使用頻率)、ARC(自適應緩存替換)等,可以靈活選擇適合的緩存模式。
1. 安裝
使用 go get
下載安裝:
go get github.com/bluele/gcache
然後在代碼中導入:
import "github.com/bluele/gcache"
2. 主要特性
-
支持多種緩存策略
-
LRU(Least Recently Used,最近最少使用)
-
LFU(Least Frequently Used,最少使用頻率)
-
ARC(Adaptive Replacement Cache,自適應緩存替換)
-
Simple(普通緩存)
-
可選自動過期(TTL)
-
支持回調函數(OnEvicted)
-
支持從數據源(如數據庫)自動加載數據
-
併發安全
3. 快速入門
3.1 創建一個 LRU 緩存
package main
import (
"fmt"
"github.com/bluele/gcache"
)
func main() {
// 創建一個 LRU 緩存,容量爲 10
cache := gcache.New(10).
LRU().
Build()
// 存入數據
cache.Set("key1", "value1")
// 獲取數據
value, err := cache.Get("key1")
if err != nil {
fmt.Println("Key not found!")
} else {
fmt.Println("Cache value:", value) // 輸出:Cache value: value1
}
}
解析:
-
gcache.New(10)
:創建一個容量爲
10
的緩存。 -
.LRU()
:使用 LRU 緩存策略。
-
.Build()
:構建緩存對象。
-
cache.Set("key1", "value1")
:存入鍵值對。
-
cache.Get("key1")
:獲取緩存值。
4. 進階用法
4.1 設置緩存過期時間(TTL)
import (
"time"
)
// 創建帶 TTL 的緩存
cache := gcache.New(10).
LRU().
Expiration(5 * time.Second). // 5秒後自動過期
Build()
cache.Set("temp", "data")
time.Sleep(6 * time.Second)
_, err := cache.Get("temp")
fmt.Println(err) // 輸出: "key not found"
解析:
-
.Expiration(5 * time.Second)
設置緩存 5 秒後過期。
-
time.Sleep(6 * time.Second)
後
Get("temp")
失效,返回key not found
。
4.2 使用 LFU(最少使用頻率)緩存
cache := gcache.New(10).
LFU().
Build()
LFU 適用於訪問模式偏向熱點數據 的場景,例如 熱點商品推薦。
4.3 使用 ARC(自適應緩存替換)
cache := gcache.New(10).
ARC().
Build()
ARC(Adaptive Replacement Cache) 結合了 LRU 和 LFU 的優點,能更智能地適應不同的訪問模式。
4.4 自動加載(從數據庫等數據源獲取數據)
cache := gcache.New(10).
LRU().
LoaderFunc(func(key interface{}) (interface{}, error) {
// 模擬數據庫查詢
return "data_for_" + key.(string), nil
}).
Build()
value, _ := cache.Get("user_123")
fmt.Println(value) // 輸出: data_for_user_123
解析:
-
.LoaderFunc()
設置一個回調,當
Get()
訪問不存在的 key 時,自動從數據源加載數據。
4.5 監聽緩存淘汰(Eviction Callback)
cache := gcache.New(2).
LRU().
OnEvicted(func(key, value interface{}) {
fmt.Println("Evicted:", key, value)
}).
Build()
cache.Set("a", "A")
cache.Set("b", "B")
cache.Set("c", "C") // "a" 被淘汰
解析:
-
.OnEvicted()
註冊回調,當緩存 超過容量並淘汰數據 時觸發回調。
5. 適用場景
6. 對比 gcache
與 golang/groupcache
如果需要分佈式緩存,可以考慮 groupcache
,如果只需本地緩存,gcache
更靈活。
7. 總結
✅ bluele/gcache
是一個 功能豐富、支持多種策略、併發安全 的本地緩存庫,適用於 高性能緩存、自動數據加載、LRU/LFU 需求 等場景。
📌 推薦使用場景:
-
本地緩存
(例如數據庫查詢緩存)
-
LRU/LFU 需求
(例如熱點數據存儲)
-
自動數據加載
(避免
nil
結果) -
支持 TTL(自動過期)
如果你需要高效、靈活的 Go 語言緩存庫,gcache
是一個非常不錯的選擇!🚀
標題:golang 每日一庫之 bluele/gcache
作者:mooncakeee
地址:http://blog.dd95828.com/articles/2025/03/10/1741581153508.html
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/1yChKKoTV9CqToW63zrn9Q