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

詳解Golang中gcache模塊的基本使用

 更新時間:2022年11月02日 08:23:15   作者:王中陽Go  
這篇文章主要通過結合商業(yè)項目的使用場景,為大家介紹了gcache的基本使用、緩存控制以及淘汰策略。使用gcache做緩存處理,簡單方便易上手

gcache提供統(tǒng)一的緩存管理模塊,提供了開發(fā)者可自定義靈活接入的緩存適配接口,并默認提供了高速內存緩存適配實現(xiàn)。

先說結論

這篇文章通過結合商業(yè)項目的使用場景,為大家介紹了gcache的基本使用、緩存控制以及淘汰策略。

使用gcache做緩存處理,簡單方便易上手!

優(yōu)勢

gcache模塊默認提供的是一個高速的內存緩存,操作效率非常高效,CPU性能損耗在ns納秒級別。使用簡單易上手,非常適合單機應用使用。

基本使用

我們可以通過gcache.New()創(chuàng)建一個緩存對象

也可以直接使用gcache包方法,使用方式都是一樣的。

下面代碼段介紹了gcache的基本使用:

package main

import (
   "fmt"
   "github.com/gogf/gf/os/gcache"
   "github.com/gogf/gf/os/gtime"
)

func main() {
   // 創(chuàng)建一個緩存對象,
   c := gcache.New()
   // 設置緩存,不過期
   _ = c.Set("k1", "v1", 0)

   // 獲取緩存
   v, _ := c.Get("k1")
   fmt.Println("k1對應的值:", v) //v1

   // 獲取緩存大小
   n, _ := c.Size()
   fmt.Println("緩存大?。?, n) //1

   // 緩存中是否存在指定鍵名
   b, _ := c.Contains("k1")
   fmt.Println("是否存在k1:", b)         //true
   isContains, _ := c.Contains("k2") //false
   fmt.Println("是否存在k2:", isContains)

   // 刪除并返回被刪除的鍵值
   fmt.Println(c.Remove("k1")) //v1

   // 關閉緩存對象,讓GC回收資源
   _ = c.Close()

   // 當然也可以便捷地直接使用gcache包方法,使用方式和上面的一樣
   _ = gcache.Set("k2", "v2", gtime.M*30) //半小時后到期
   k2Value, _ := gcache.Get("k2")
   fmt.Println("k2對應的值:", k2Value) //v2
}

打印結果

緩存控制

下面介紹一些特殊場景的用法:

當鍵名不存在時寫入:SetIfNotExist

根據(jù)鍵名取不到值時寫入:GetOrSet

package main

import (
   "fmt"
   "github.com/gogf/gf/os/gcache"
   "time"
)

func main() {
   // 當鍵名不存在時寫入,設置過期時間1秒
   _, _ = gcache.SetIfNotExist("k1", "v1", time.Second)

   // 打印當前的鍵名列表
   keys, _ := gcache.Keys()
   fmt.Println("打印當前的鍵名列表:", keys) //[k1]

   // 打印當前的鍵值列表
   values, _ := gcache.Values()
   fmt.Println("打印當前的鍵值列表:", values) //[v1]

   // 獲取指定鍵值,如果不存在時寫入,并返回鍵值;第三個參數(shù)設置為0表示永不過期
   v, _ := gcache.GetOrSet("k2", "v2", 0)
   fmt.Println("寫入的鍵值:", v) //v2

   // 打印當前的鍵值對
   dataMap, _ := gcache.Data()
   fmt.Println("打印當前的鍵值對:", dataMap) // map[k1:v1 k2:v2]

   // 等待1秒,以便k1:v1自動過期
   time.Sleep(time.Second)

   // 再次打印當前的鍵值對,發(fā)現(xiàn)k1:v1已經(jīng)過期,只剩下k2:v2
   data2, _ := gcache.Data()
   fmt.Println("等待一秒后,打印當前的鍵值對:", data2) // map[k2:v2]
}

打印結果

緩存淘汰策略

之前做項目的時候也有這么設計過,現(xiàn)在gcache天然支持緩存淘汰策略

實戰(zhàn)舉例

給大家舉個項目中的栗子:

比如我有一個新聞網(wǎng)站,為了保證新聞詳情頁的加載速度,會把新聞詳情頁做緩存處理(內容緩存,評論點贊等動態(tài)獲取。)

一般來說新產(chǎn)生的新聞熱度和訪問量會更高,需要做緩存,而陳舊的新聞因為熱度不再,訪問量較低就從緩存中釋放了。

解決上面的問題一般有2種思路:

  • 設置緩存時間是一個解決思路
  • 另外的思路就是設置緩存的淘汰策略。

比如:我一共允許緩存1萬個緩存詳情頁,當超過1萬個時,會淘汰掉最早緩存的數(shù)據(jù),實現(xiàn)動態(tài)且穩(wěn)定的緩存策略。

gcache天然支持這種緩存淘汰策略

代碼示例

下面舉個簡單的栗子:

package main

import (
   "fmt"
   "github.com/gogf/gf/os/gcache"
   "time"
)

func main() {
   // 設置LRU淘汰數(shù)量
   c := gcache.New(2)

   // 添加10個元素,不過期
   for i := 0; i < 10; i++ {
      _ = c.Set(i, i, 0)
   }
   n, _ := c.Size()
   fmt.Println("緩存大?。?, n)
   keys, _ := c.Keys()
   fmt.Println("緩存鍵值:", keys)

   // 讀取鍵名1,保證該鍵名是優(yōu)先保留
   v, _ := c.Get(1)
   fmt.Println("讀取鍵名1的值:", v)

   // 等待一定時間后(默認1秒檢查一次),
   // 元素會被按照從舊到新的順序進行淘汰
   for i := 0; i < 10; i++ {
      time.Sleep(2 * time.Second)
      n, _ = c.Size()
      fmt.Println("緩存大?。?, n)
      keys, _ = c.Keys()
      fmt.Println("緩存鍵值:", keys)
   }
}

打印結果

小技巧

GetOrSetFunc的使用

GetOrSetFunc獲取一個緩存值,當緩存不存在時執(zhí)行指定的f func() (interface{}, error),緩存該f方法的結果值,并返回該結果。

總結

這篇文章通過結合商業(yè)項目的使用場景,為大家介紹了gcache的基本使用、緩存控制以及淘汰策略。

單機項目可以使用gcache做緩存處理,簡單方便易上手;

以上就是詳解Golang中gcache模塊的基本使用的詳細內容,更多關于Golang gcache模塊的資料請關注腳本之家其它相關文章!

相關文章

  • golang的Pseudo-versions使用問題解析

    golang的Pseudo-versions使用問題解析

    這篇文章主要為大家介紹有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪了golang的Pseudo-versions使用問題解析,
    2023-07-07
  • 一文教你如何快速學會Go的切片和數(shù)組數(shù)據(jù)類型

    一文教你如何快速學會Go的切片和數(shù)組數(shù)據(jù)類型

    數(shù)組是屬于同一類型的元素的集合。切片是數(shù)組頂部的方便、靈活且功能強大的包裝器。本文就來和大家聊聊Go中切片和數(shù)組的使用,需要的可以參考一下
    2023-03-03
  • 一文帶你深入理解Golang中的泛型

    一文帶你深入理解Golang中的泛型

    Go?在泛型方面一直被詬病,因為它在這方面相對比較落后。但是,在?Go?1.18?版本中,泛型已經(jīng)被正式引入,成為了?Go?語言中一個重要的特性。本文將會詳細介紹?Go?泛型的相關概念,語法和用法,希望能夠幫助大家更好地理解和應用這一特性
    2023-05-05
  • Go通過SJSON實現(xiàn)動態(tài)修改JSON

    Go通過SJSON實現(xiàn)動態(tài)修改JSON

    在Go語言 json 處理領域,在 json 數(shù)據(jù)處理中,讀取與修改是兩個核心需求,本文我們就來看看如何使用SJSON進行動態(tài)修改JSON吧,有需要的小伙伴可以了解下
    2025-03-03
  • GO語言基本類型String和Slice,Map操作詳解

    GO語言基本類型String和Slice,Map操作詳解

    這篇文章主要為大家介紹了GO語言基本類型String和Slice,Map操作示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • 一文搞懂Go語言中條件語句的使用

    一文搞懂Go語言中條件語句的使用

    這篇文章主要介紹了Go語言中五個常用條件語句的使用,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • go語言串口通信的項目實踐

    go語言串口通信的項目實踐

    在Go語言可以使用github.com/tarm/serial包來進行串口通信,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-11-11
  • 使用Golang如何實現(xiàn)簡易的令牌桶算法

    使用Golang如何實現(xiàn)簡易的令牌桶算法

    這篇文章主要介紹了使用Golang如何實現(xiàn)簡易的令牌桶算法問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • golang高并發(fā)之本地緩存詳解

    golang高并發(fā)之本地緩存詳解

    這篇文章主要為大家詳細介紹了golang高并發(fā)中本地緩存的相關知識,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-10-10
  • GoLang中panic和recover作用詳解

    GoLang中panic和recover作用詳解

    panic?和?recover?是?Go?語言中用于處理異常和錯誤的機制,能夠幫助我們應對意外情況并使程序更加健壯,這篇文章主要介紹了GoLang中panic和recover作用詳解,需要的朋友可以參考下
    2024-05-05

最新評論

开远市| 建湖县| 泽州县| 宿州市| 威海市| 靖江市| 彭水| 轮台县| 象州县| 浙江省| 龙里县| 许昌市| 吉木萨尔县| 明水县| 韩城市| 长沙县| 芷江| 横山县| 扬中市| 南京市| 监利县| 平南县| 库尔勒市| 和平区| 白河县| 瓮安县| 汉沽区| 三江| 阆中市| 嘉禾县| 肥东县| 阿城市| 辽阳县| 高雄县| 武穴市| 微山县| 宣城市| 长治县| 建宁县| 兴安县| 康马县|