Golang基于內(nèi)存的鍵值存儲緩存庫go-cache
go-cache是一種內(nèi)存中的key:value store/cache庫,類似于Memcached,適用于在一臺機(jī)器上運行的應(yīng)用程序(單機(jī)應(yīng)用程序)。
文檔
https://pkg.go.dev/github.com/patrickmn/go-cache
https://github.com/patrickmn/go-cache
https://patrickmn.com/projects/go-cache/
安裝
go get github.com/patrickmn/go-cache
方法
func New(defaultExpiration, cleanupInterval time.Duration) *Cache
func (c *cache) Set(k string, x interface{}, d time.Duration)
func (c *cache) Get(k string) (interface{}, bool)示例1
import (
"fmt"
"time"
"github.com/patrickmn/go-cache"
)
func main() {
// 設(shè)置默認(rèn)過期時間10秒;清理間隔30分鐘
caching := cache.New(<strong>10*time.Second</strong>, 30*time.Minute)
// 設(shè)置過期時間
caching.Set("k1", "v1", 10*time.Second)
<strong>time.Sleep(</strong><strong>5 * time.Second)
</strong> // 獲取數(shù)據(jù)
value, ok := caching.Get("k1")
if !ok {
fmt.Println("ok值為", ok)
}
fmt.Printf("k1對應(yīng)的值是: %v\n", value)
}
示例2
import (
"fmt"
"time"
"github.com/patrickmn/go-cache"
)
func main() {
// 設(shè)置默認(rèn)過期時間10秒;清理間隔30分鐘
caching := cache.New(<strong>10*time.Second</strong>, 30*time.Minute)
// 設(shè)置過期時間
caching.Set("k1", "v1", 10*time.Second)
<strong>time.Sleep(</strong><strong>15 * time.Second)
</strong> // 獲取數(shù)據(jù)
value, ok := caching.Get("k1")
if !ok {
fmt.Println("ok值為", ok)
}
fmt.Printf("k1對應(yīng)的值是: %v\n", value)
}
使用注意點
1)盡量存放那些相對不怎么變化的數(shù)據(jù), 適用于所有的 local cache(包括 map, sync.map)
2)go-cache 的過期檢查時間要設(shè)置相對較小, 也不能過小
3)那些高 QPS 的接口盡量不要去直接 Set 數(shù)據(jù), 如果必須 Set 可以采用異步操作
4)監(jiān)控 go-cache 里面 key 的數(shù)量, 如果過多時, 需要及時調(diào)整參數(shù)
優(yōu)點
(主要優(yōu)點:本質(zhì)上是一個具有過期時間的線程安全的 map[string]interface{},它不需要序列化或通過網(wǎng)絡(luò)傳輸其內(nèi)容)
1)簡單易用,適合快速集成到現(xiàn)有項目中;
2)支持過期時間,可以自動淘汰過期的緩存項;
3)支持多種數(shù)據(jù)類型的緩存;
缺點
1)性能略低于其他庫,不適合高并發(fā)讀寫的場景;
2)不支持分布式緩存。
注意
go-cache是一個內(nèi)存緩存庫,它主要用于單進(jìn)程內(nèi)的緩存操作。這意味著如果在服務(wù) A 中設(shè)置了某個鍵值對,服務(wù) B 無法直接訪問服務(wù) A 的緩存實例,因為它們是獨立的進(jìn)程,每個進(jìn)程都有自己的緩存實例。
如果希望在多個服務(wù)之間共享緩存數(shù)據(jù),需要使用一個分布式的緩存解決方案,例如 Redis、Memcached 或其他支持分布式緩存的系統(tǒng)。這些系統(tǒng)可以在多個服務(wù)之間共享數(shù)據(jù),并且支持跨服務(wù)的數(shù)據(jù)一致性。
go-cache 和 redis 緩存對比
1)功能特性:
Go Cache 是一個 Go 語言的內(nèi)存緩存庫,使用起來非常簡單,適合處理輕量級緩存需求。它提供了基本的 Get、Set、Delete 等緩存操作接口,并支持緩存過期時間和自動清理過期緩存。但是,它只能存儲在內(nèi)存中,無法持久化到磁盤,不適用于大規(guī)模數(shù)據(jù)和高并發(fā)場景。
Redis 是一個基于內(nèi)存的高性能鍵值存儲系統(tǒng),支持多種數(shù)據(jù)結(jié)構(gòu)、高并發(fā)訪問和持久化等功能。Redis 除了支持基本的 Get、Set、Delete 等操作外,還支持多種高級特性,如發(fā)布/訂閱、事務(wù)、Lua 腳本等。Redis 的持久化機(jī)制包括 RDB 和 AOF 兩種方式,可以保證數(shù)據(jù)不會因服務(wù)器重啟或宕機(jī)而丟失。Redis 還支持分布式架構(gòu),可以通過主從復(fù)制和集群等方式進(jìn)行數(shù)據(jù)分片和高可用性保障。
2)性能表現(xiàn):
由于 Go Cache 是一個純內(nèi)存緩存,因此在處理輕量級數(shù)據(jù)時,性能較為優(yōu)秀,適合處理小規(guī)模數(shù)據(jù)和短期存儲需求。
Redis 的性能則相對更為出色,尤其是在處理大規(guī)模數(shù)據(jù)和高并發(fā)訪問時,Redis 的性能表現(xiàn)更為卓越。Redis 的數(shù)據(jù)結(jié)構(gòu)支持多種類型,包括字符串、列表、哈希、集合和有序集合等,可以滿足不同應(yīng)用場景的需求。
3)適用場景:
Go Cache 適用于輕量級的應(yīng)用場景,比如 Web 應(yīng)用中的頁面片段、會話信息等短期存儲數(shù)據(jù)。
Redis 則適用于更加復(fù)雜的應(yīng)用場景,比如高并發(fā)的 Web 應(yīng)用、數(shù)據(jù)分析、實時計算、消息隊列等。
綜上所述,Go Cache 和 Redis 都是優(yōu)秀的緩存解決方案,但是它們的功能特性、性能表現(xiàn)和適用場景略有不同。如果應(yīng)用場景是輕量級的、短期存儲的數(shù)據(jù),可以選擇 Go Cache;如果需要處理大規(guī)模的、高并發(fā)訪問的數(shù)據(jù),可以選擇 Redis。
到此這篇關(guān)于Golang基于內(nèi)存的鍵值存儲緩存庫 go-cache的文章就介紹到這了,更多相關(guān)Golang緩存庫 go-cache內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
go+redis實現(xiàn)消息隊列發(fā)布與訂閱的詳細(xì)過程
這篇文章主要介紹了go+redis實現(xiàn)消息隊列發(fā)布與訂閱,redis做消息隊列的缺點:沒有持久化,一旦消息沒有人消費,積累到一定程度后就會丟失,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-09-09
GOLANG使用Context管理關(guān)聯(lián)goroutine的方法
這篇文章主要介紹了GOLANG使用Context管理關(guān)聯(lián)goroutine的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-01-01
Go語言中的goroutine和channel如何協(xié)同工作
在Go語言中,goroutine和channel是并發(fā)編程的兩個核心概念,它們協(xié)同工作以實現(xiàn)高效、安全的并發(fā)執(zhí)行,本文將詳細(xì)探討goroutine和channel如何協(xié)同工作,以及它們在并發(fā)編程中的作用和優(yōu)勢,需要的朋友可以參考下2024-04-04
go語言實現(xiàn)簡易比特幣系統(tǒng)錢包的原理解析
這篇文章主要介紹了go語言實現(xiàn)簡易比特幣系統(tǒng)錢包的原理解析,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-04-04

