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

GoFrame框架gcache的緩存控制淘汰策略實踐示例

 更新時間:2022年06月13日 09:02:39   作者:王中陽Go  
這篇文章主要為大家介紹了GoFrame框架gcache的緩存控制淘汰策略的實踐示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

基本概念

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

基本使用

我們可以通過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()
   // 設(shè)置緩存,不過期
   _ = c.Set("k1", "v1", 0)
   // 獲取緩存
   v, _ := c.Get("k1")
   fmt.Println("k1對應(yīng)的值:", 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
   // 關(guān)閉緩存對象,讓GC回收資源
   _ = c.Close()
   // 當(dāng)然也可以便捷地直接使用gcache包方法,使用方式和上面的一樣
   _ = gcache.Set("k2", "v2", gtime.M*30) //半小時后到期
   k2Value, _ := gcache.Get("k2")
   fmt.Println("k2對應(yīng)的值:", k2Value) //v2
}

打印結(jié)果

緩存控制

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

當(dāng)鍵名不存在時寫入:SetIfNotExist

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

package main
import (
   "fmt"
   "github.com/gogf/gf/os/gcache"
   "time"
)
func main() {
   // 當(dāng)鍵名不存在時寫入,設(shè)置過期時間1秒
   _, _ = gcache.SetIfNotExist("k1", "v1", time.Second)
   // 打印當(dāng)前的鍵名列表
   keys, _ := gcache.Keys()
   fmt.Println("打印當(dāng)前的鍵名列表:", keys) //[k1]
   // 打印當(dāng)前的鍵值列表
   values, _ := gcache.Values()
   fmt.Println("打印當(dāng)前的鍵值列表:", values) //[v1]
   // 獲取指定鍵值,如果不存在時寫入,并返回鍵值;第三個參數(shù)設(shè)置為0表示永不過期
   v, _ := gcache.GetOrSet("k2", "v2", 0)
   fmt.Println("寫入的鍵值:", v) //v2
   // 打印當(dāng)前的鍵值對
   dataMap, _ := gcache.Data()
   fmt.Println("打印當(dāng)前的鍵值對:", dataMap) // map[k1:v1 k2:v2]
   // 等待1秒,以便k1:v1自動過期
   time.Sleep(time.Second)
   // 再次打印當(dāng)前的鍵值對,發(fā)現(xiàn)k1:v1已經(jīng)過期,只剩下k2:v2
   data2, _ := gcache.Data()
   fmt.Println("等待一秒后,打印當(dāng)前的鍵值對:", data2) // map[k2:v2]
}

打印結(jié)果

緩存淘汰策略

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

場景分析

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

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

往往新產(chǎn)生的新聞熱度和訪問量會更高,需要做緩存,而陳舊的新聞因為熱度不再,訪問量低就可以釋放緩存了。

設(shè)置緩存時間是一個解決思路,另外的思路就是設(shè)置緩存的淘汰策略。

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

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

代碼示例

下面舉個簡單的栗子:

package main
import (
   "fmt"
   "github.com/gogf/gf/os/gcache"
   "time"
)
func main() {
   // 設(shè)置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)
   }
}

打印結(jié)果

小技巧

GetOrSetFunc的使用

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

總結(jié)

這篇文章為大家介紹了gcache的基本使用、緩存控制以及淘汰策略。

單機項目可以使用gcache做緩存處理,簡單方便易上手;分布式應(yīng)用可以使用gredis做緩存處理,下一篇介紹gredis的使用,更多關(guān)于GoFrame gcache 緩存控制 淘汰策略的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Go語言并發(fā)之context標(biāo)準庫的使用詳解

    Go語言并發(fā)之context標(biāo)準庫的使用詳解

    Context的出現(xiàn)是為了解決在大型應(yīng)用程序中的并發(fā)環(huán)境下,協(xié)調(diào)和管理多個goroutine之間的通信、超時和取消操作的問題,本文就來和大家簡單聊聊它的具體用法,希望對大家有所幫助
    2023-06-06
  • 解決goland 導(dǎo)入項目后import里的包報紅問題

    解決goland 導(dǎo)入項目后import里的包報紅問題

    這篇文章主要介紹了解決goland 導(dǎo)入項目后import里的包報紅問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • golang使用信號量熱更新的實現(xiàn)示例

    golang使用信號量熱更新的實現(xiàn)示例

    這篇文章主要介紹了golang使用信號量熱更新的實現(xiàn)示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • 淺析Go語言中的Range關(guān)鍵字

    淺析Go語言中的Range關(guān)鍵字

    Range是go語言中很獨特的一個關(guān)鍵詞,也相當(dāng)好用。下面就跟著小編來再聊聊這個Range關(guān)鍵字,有需要的朋友們可以參考借鑒。
    2016-09-09
  • Golang中String,rune和byte的相互轉(zhuǎn)換

    Golang中String,rune和byte的相互轉(zhuǎn)換

    Go語言中,string就是只讀的采用utf8編碼的字節(jié)切片,rune是int32的別名,代表字符的Unicode編碼,這篇文章主要介紹了Golang中String,rune和byte的相互轉(zhuǎn)換,感興趣的小伙伴可以了解一下
    2023-10-10
  • GO語言Defer用法實例分析

    GO語言Defer用法實例分析

    這篇文章主要介紹了GO語言Defer用法,實例分析了Defer的使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02
  • Go語言中工作池的原理與實現(xiàn)

    Go語言中工作池的原理與實現(xiàn)

    工作池是一種并發(fā)編程模式,它使用一組固定數(shù)量的工作線程來執(zhí)行任務(wù)隊列中的工作單元,本文將介紹工作池的工作原理,并通過代碼示例演示其在實際應(yīng)用中的用途,有需要的可以參考下
    2023-10-10
  • go語言遍歷文件夾示例

    go語言遍歷文件夾示例

    這篇文章主要介紹了go語言遍歷文件夾示例,本文直接給出實現(xiàn)代碼,需要的朋友可以參考下
    2015-03-03
  • Golang命令行進行debug調(diào)試操作

    Golang命令行進行debug調(diào)試操作

    今天小編就為大家分享一篇關(guān)于,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • 在?Golang?中使用?Cobra?創(chuàng)建?CLI?應(yīng)用

    在?Golang?中使用?Cobra?創(chuàng)建?CLI?應(yīng)用

    這篇文章主要介紹了在?Golang?中使用?Cobra?創(chuàng)建?CLI?應(yīng)用,來看下?Cobra?的使用,這里我們使用的?go1.13.3?版本,使用?Go?Modules?來進行包管理,需要的朋友可以參考下
    2022-01-01

最新評論