欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

go內存緩存BigCache使用入門詳解

 更新時間:2023年09月06日 09:17:39   作者:海生  
這篇文章主要為大家介紹了go內存緩存BigCache使用入門詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

一、介紹

bigcache是一個內存緩存系統(tǒng),用于存儲鍵值對數(shù)據(jù)。沒有gc操作。使用的時候需要序列化(反)。
bigcache的源代碼在 https://github.com/allegro/bigcache幾個特征,存儲通過[]byte,沒有過期時間。

二、安裝

我們安裝最新的v3版本

go get -u github.com/allegro/bigcache/v3

安裝完成后,我們就可以在go語言中使用bigcache了。下面是一些簡單的示例。

三、使用示例

func TestSetGet(t *testing.T) {
    // new一個bigCache對象
    cache, _ := bigcache.New(context.Background(), bigcache.DefaultConfig(10*time.Minute))

    // get獲取一個無值的key
    vNil, err := cache.Get("key")
    t.Log(vNil, err) // [] Entry not found 值為空的[]字節(jié)slice

    // set 存儲數(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()方法,存儲值為 []byte 字節(jié)slice類型,所以我們保存的時候,需要序列化數(shù)據(jù)成[]byte。
而在Get()方法,獲取的值為[]byte,我們此時需要反序列化[]byte成原來的類型。

3、1 string類型的 存儲與獲取以及修改

string類型可以用[]byte和類型,互相的方便轉換。

func TestSetGet(t *testing.T) {
    // new一個bigCache對象
    cache, _ := bigcache.New(context.Background(), bigcache.DefaultConfig(10*time.Minute))
    // get獲取一個無值的key
    vNil, err := cache.Get("key")
    t.Log(vNil, err) // [] Entry not found 值為空的[]字節(jié)slice
    // set 存儲數(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類型的 存儲與獲取以及修改

非string類型,轉成[]byte,比較復雜,在go內置的庫中,唯有json庫,提供了這樣的方法。可以把非string的任意類型,轉成[]byte,如下。

func Marshal(v any) ([]byte, error) // 序列化
func Unmarshal(data []byte, v any) error // 反序列化

在這里我們也使用json的序列化(反)方法,來和[]byte互轉。

3、2、1 slice切片類型的存儲與獲取以及修改

// TestSetGetSlice slice類型
func TestSetGetSlice(t *testing.T) {
    // new一個bigCache對象
    cache, _ := bigcache.New(context.Background(), bigcache.DefaultConfig(10*time.Minute))
    // slice 存儲數(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,查看是否會影響內存中的值
    // 答案是不影響
    s2 = append(s2, "3")
    t.Log(s2)
    var s3 []string = make([]string, 0)
    _ = json.Unmarshal(bsv, &s3)
    t.Log(s3)
}

3、2、2 struct結構體類型的存儲與獲取以及修改

// TestSetGetStruct 結構體指針
func TestSetGetStruct(t *testing.T) {
    // new一個bigCache對象
    cache, _ := bigcache.New(context.Background(), bigcache.DefaultConfig(10*time.Minute))
    // 結構體struct 存儲數(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,查看是否會影響內存中的值
    // 答案是不影響
    s2.Value = "v2"
    t.Log(s2) // {v2}
    var s3 st
    _ = json.Unmarshal(bsv, &s3)
    t.Log(s3) // {v1}
}

結論

bigcache可以安全使用,修改獲取后的是,也不影響原來內存中的值。

以上就是go內存緩存BigCache使用入門詳解的詳細內容,更多關于go內存緩存BigCache的資料請關注腳本之家其它相關文章!

相關文章

  • 淺析Gin框架中路由參數(shù)的使用

    淺析Gin框架中路由參數(shù)的使用

    這篇文章主要為大家介紹了路由參數(shù)的基本語法,以及路由匹配和路由參數(shù)值提取等相關內容,以幫助讀者更好地對Gin?框架中路由參數(shù)進行使用,需要的可以參考下
    2023-08-08
  • Go關鍵字defer的使用和底層實現(xiàn)

    Go關鍵字defer的使用和底層實現(xiàn)

    defer是Go語言的關鍵字,一般用于資源的釋放和異常的捕捉,defer語句后將其后面跟隨的語句進行延遲處理,就是說在函數(shù)執(zhí)行完畢后再執(zhí)行調用,也就是return的ret指令之前,本文給大家介紹了Go關鍵字defer的使用和底層實現(xiàn),需要的朋友可以參考下
    2023-11-11
  • GO語言判斷一個網(wǎng)段是否屬于另一個網(wǎng)段的子網(wǎng)

    GO語言判斷一個網(wǎng)段是否屬于另一個網(wǎng)段的子網(wǎng)

    這篇文章主要介紹了GO語言判斷一個網(wǎng)段是否屬于另一個網(wǎng)段的子網(wǎng)的相關資料,內容介紹詳細,具有一定的參考價值,需要的朋友可任意參考一下
    2022-03-03
  • Go語言操作Excel利器之excelize類庫詳解

    Go語言操作Excel利器之excelize類庫詳解

    Excelize是Go語言編寫的用于操作Office Excel文檔基礎庫,基于ECMA-376,ISO/IEC 29500國際標準,可以使用它來讀取、寫入由Excel 2007及以上版本創(chuàng)建的電子表格文檔,下面這篇文章主要給大家介紹了關于Go語言操作Excel利器之excelize類庫的相關資料,需要的朋友可以參考下
    2022-10-10
  • Go語言os包用法詳解

    Go語言os包用法詳解

    本文主要介紹了Go語言os包用法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04
  • go sync.Map基本原理深入解析

    go sync.Map基本原理深入解析

    這篇文章主要為大家介紹了go sync.Map基本原理深入解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • 使用?pprof?進行性能分析的方法詳解

    使用?pprof?進行性能分析的方法詳解

    pprof?是?Go?語言中用于性能分析的一個強大工具,它可以幫助開發(fā)人員找到應用程序中的性能瓶頸,并提供詳細的分析報告,本文將介紹如何使用?pprof?進行性能分析,需要的朋友可以參考下
    2023-05-05
  • Go語言sync.Pool對象池使用場景基本示例

    Go語言sync.Pool對象池使用場景基本示例

    這篇文章主要為大家介紹了Go語言sync.Pool對象池使用場景的基本示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • GoLang string與strings.Builder使用對比詳解

    GoLang string與strings.Builder使用對比詳解

    這篇文章主要介紹了GoLang string與strings.Builder使用對比,Builder 用于使用 Write 方法有效地構建字符串。它最大限度地減少了內存復制。零值可以使用了。不要復制非零生成器
    2023-03-03
  • Go語言判斷文件或文件夾是否存在的方法

    Go語言判斷文件或文件夾是否存在的方法

    這篇文章主要介紹了Go語言判斷文件或文件夾是否存在的方法,結合具體實例形式對比分析了Go語言針對文件與目錄判斷的操作技巧與相關注意事項,需要的朋友可以參考下
    2017-05-05

最新評論