最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

go內(nèi)存緩存BigCache使用入門(mén)詳解

 更新時(shí)間:2023年09月06日 09:17:39   作者:海生  
這篇文章主要為大家介紹了go內(nèi)存緩存BigCache使用入門(mén)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jì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)文章

  • Go語(yǔ)言運(yùn)算符的具體使用

    Go語(yǔ)言運(yùn)算符的具體使用

    本文介紹了Go語(yǔ)言中常用的運(yùn)算符類(lèi)型及其使用方法,主要內(nèi)容包括: 算術(shù)運(yùn)算符,關(guān)系運(yùn)算符,邏輯運(yùn)算符,位運(yùn)算符,每種運(yùn)算符都通過(guò)表格形式展示了具體功能,感興趣的可以了解一下
    2026-06-06
  • golang進(jìn)行xml文件解析的操作方法

    golang進(jìn)行xml文件解析的操作方法

    本文介紹了Go語(yǔ)言中解析XML文件的幾種方法:小文件解析、大文件流式解析和復(fù)雜結(jié)構(gòu)解析,對(duì)于小文件,使用標(biāo)準(zhǔn)庫(kù)中的encoding/xml包;對(duì)于大文件,采用流式解析以避免內(nèi)存溢出,對(duì)于復(fù)雜結(jié)構(gòu)的XML文件,推薦使用第三方庫(kù)github.com/beevik/etree
    2024-11-11
  • 詳解Go語(yǔ)言中單鏈表的使用

    詳解Go語(yǔ)言中單鏈表的使用

    鏈表由一系列結(jié)點(diǎn)(鏈表中每一個(gè)元素稱(chēng)為結(jié)點(diǎn))組成,結(jié)點(diǎn)可以在運(yùn)行時(shí)動(dòng)態(tài)生成。本文將通過(guò)實(shí)例為大家詳解Go語(yǔ)言中單鏈表的常見(jiàn)用法,感興趣的可以了解一下
    2022-08-08
  • Golang?gin跨域解決方案示例

    Golang?gin跨域解決方案示例

    這篇文章主要為大家介紹了Golang?gin跨域解決方案,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • 聊聊golang的defer的使用

    聊聊golang的defer的使用

    這篇文章主要介紹了聊聊golang的defer的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Golang中的time.Duration類(lèi)型用法說(shuō)明

    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é)深入探究

    這篇文章主要為大家介紹了Go?的panic和recover函數(shù)使用細(xì)節(jié)深入探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Go語(yǔ)言中的值類(lèi)型與引用類(lèi)型的使用

    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
  • VS?Code安裝go插件失敗原因分析以及解決方案

    VS?Code安裝go插件失敗原因分析以及解決方案

    vscode安裝go插件時(shí),由于各種原因,在安裝插件時(shí)總是失敗,下面這篇文章主要給大家介紹了關(guān)于VS?Code安裝go插件失敗原因分析以及解決的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • 關(guān)于Golang中for-loop與goroutine的問(wèn)題詳解

    關(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

最新評(píng)論

吕梁市| 宜城市| 东港市| 大足县| 五莲县| 和平县| 通海县| 五家渠市| 虎林市| 无为县| 南涧| 平利县| 盈江县| 江都市| 乌审旗| 黄陵县| 玉树县| 尼木县| 汤阴县| 保康县| 漠河县| 清水河县| 东阿县| 宝鸡市| 南城县| 天门市| 库车县| 东山县| 阿鲁科尔沁旗| 龙胜| 景宁| 山丹县| 巨野县| 澜沧| 封丘县| 临邑县| 霍林郭勒市| 普定县| 兰溪市| 仁化县| 红桥区|