go內(nèi)存緩存BigCache使用入門(mén)詳解
一、介紹
bigcache是一個(gè)內(nèi)存緩存系統(tǒng),用于存儲(chǔ)鍵值對(duì)數(shù)據(jù)。沒(méi)有g(shù)c操作。使用的時(shí)候需要序列化(反)。
bigcache的源代碼在 https://github.com/allegro/bigcache幾個(gè)特征,存儲(chǔ)通過(guò)[]byte,沒(méi)有過(guò)期時(shí)間。
二、安裝
我們安裝最新的v3版本
go get -u github.com/allegro/bigcache/v3
安裝完成后,我們就可以在go語(yǔ)言中使用bigcache了。下面是一些簡(jiǎn)單的示例。
三、使用示例
func TestSetGet(t *testing.T) {
// new一個(gè)bigCache對(duì)象
cache, _ := bigcache.New(context.Background(), bigcache.DefaultConfig(10*time.Minute))
// get獲取一個(gè)無(wú)值的key
vNil, err := cache.Get("key")
t.Log(vNil, err) // [] Entry not found 值為空的[]字節(jié)slice
// set 存儲(chǔ)數(shù)據(jù)
cache.Set("key", []byte("value"))
// get 獲取數(shù)據(jù)
v, _ := cache.Get("key")
t.Log(v) // 輸出 [118 97 108 117 101]
t.Log(string(v)) // 輸出 value
}我們看一下 Set和Get方法的源代碼
// Set saves entry under the key
func (c *BigCache) Set(key string, entry []byte) error {
hashedKey := c.hash.Sum64(key)
shard := c.getShard(hashedKey)
return shard.set(key, hashedKey, entry)
}
// Get reads entry for the key.
// It returns an ErrEntryNotFound when
// no entry exists for the given key.
func (c *BigCache) Get(key string) ([]byte, error) {
hashedKey := c.hash.Sum64(key)
shard := c.getShard(hashedKey)
return shard.get(key, hashedKey)
}在Set()方法,存儲(chǔ)值為 []byte 字節(jié)slice類(lèi)型,所以我們保存的時(shí)候,需要序列化數(shù)據(jù)成[]byte。
而在Get()方法,獲取的值為[]byte,我們此時(shí)需要反序列化[]byte成原來(lái)的類(lèi)型。
3、1 string類(lèi)型的 存儲(chǔ)與獲取以及修改
string類(lèi)型可以用[]byte和類(lèi)型,互相的方便轉(zhuǎn)換。
func TestSetGet(t *testing.T) {
// new一個(gè)bigCache對(duì)象
cache, _ := bigcache.New(context.Background(), bigcache.DefaultConfig(10*time.Minute))
// get獲取一個(gè)無(wú)值的key
vNil, err := cache.Get("key")
t.Log(vNil, err) // [] Entry not found 值為空的[]字節(jié)slice
// set 存儲(chǔ)數(shù)據(jù)
cache.Set("key", []byte("value"))
// get 獲取數(shù)據(jù)
v, _ := cache.Get("key")
t.Log(v) // 輸出 [118 97 108 117 101]
t.Log(string(v)) // 輸出 value
}3、2 非string類(lèi)型的 存儲(chǔ)與獲取以及修改
非string類(lèi)型,轉(zhuǎn)成[]byte,比較復(fù)雜,在go內(nèi)置的庫(kù)中,唯有json庫(kù),提供了這樣的方法??梢园逊莝tring的任意類(lèi)型,轉(zhuǎn)成[]byte,如下。
func Marshal(v any) ([]byte, error) // 序列化 func Unmarshal(data []byte, v any) error // 反序列化
在這里我們也使用json的序列化(反)方法,來(lái)和[]byte互轉(zhuǎn)。
3、2、1 slice切片類(lèi)型的存儲(chǔ)與獲取以及修改
// TestSetGetSlice slice類(lèi)型
func TestSetGetSlice(t *testing.T) {
// new一個(gè)bigCache對(duì)象
cache, _ := bigcache.New(context.Background(), bigcache.DefaultConfig(10*time.Minute))
// slice 存儲(chǔ)數(shù)據(jù)
s := []string{"1", "2"}
bs, _ := json.Marshal(s)
cache.Set("s", bs)
// get獲取值
bsv, _ := cache.Get("s")
var s2 []string = make([]string, 0)
_ = json.Unmarshal(bsv, &s2)
t.Log(s2)
// 修改數(shù)據(jù),修改s2,查看是否會(huì)影響內(nèi)存中的值
// 答案是不影響
s2 = append(s2, "3")
t.Log(s2)
var s3 []string = make([]string, 0)
_ = json.Unmarshal(bsv, &s3)
t.Log(s3)
}3、2、2 struct結(jié)構(gòu)體類(lèi)型的存儲(chǔ)與獲取以及修改
// TestSetGetStruct 結(jié)構(gòu)體指針
func TestSetGetStruct(t *testing.T) {
// new一個(gè)bigCache對(duì)象
cache, _ := bigcache.New(context.Background(), bigcache.DefaultConfig(10*time.Minute))
// 結(jié)構(gòu)體struct 存儲(chǔ)數(shù)據(jù)
type st struct {
Value string
}
s := &st{
Value: "v1",
}
bs, _ := json.Marshal(s)
cache.Set("s", bs)
// get獲取值
bsv, _ := cache.Get("s")
var s2 st
_ = json.Unmarshal(bsv, &s2)
t.Log(s2) // {v1}
// 修改數(shù)據(jù),修改s2,查看是否會(huì)影響內(nèi)存中的值
// 答案是不影響
s2.Value = "v2"
t.Log(s2) // {v2}
var s3 st
_ = json.Unmarshal(bsv, &s3)
t.Log(s3) // {v1}
}結(jié)論
bigcache可以安全使用,修改獲取后的是,也不影響原來(lái)內(nèi)存中的值。
以上就是go內(nèi)存緩存BigCache使用入門(mén)詳解的詳細(xì)內(nèi)容,更多關(guān)于go內(nèi)存緩存BigCache的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Golang中的time.Duration類(lèi)型用法說(shuō)明
這篇文章主要介紹了Golang中的time.Duration類(lèi)型用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12
Go panic和recover函數(shù)使用細(xì)節(jié)深入探究
這篇文章主要為大家介紹了Go?的panic和recover函數(shù)使用細(xì)節(jié)深入探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
Go語(yǔ)言中的值類(lèi)型與引用類(lèi)型的使用
Go語(yǔ)言中的數(shù)據(jù)類(lèi)型可以分為值類(lèi)型和引用類(lèi)型,值類(lèi)型包括基本和復(fù)合數(shù)據(jù)類(lèi)型,特點(diǎn)是在傳遞時(shí)進(jìn)行復(fù)制,保證數(shù)據(jù)的安全性,引用類(lèi)型如slice、map等,傳遞的是引用副本,便于大型數(shù)據(jù)操作且提高性能,理解這些概念有助于編寫(xiě)更高效、安全的Go代碼2024-09-09
關(guān)于Golang中for-loop與goroutine的問(wèn)題詳解
這篇文章主要給大家介紹了關(guān)于Golang中for-loop與goroutine問(wèn)題的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用golang具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-09-09

