GoFrame框架gcache的緩存控制淘汰策略實(shí)踐示例
基本概念
gcache
模塊默認(rèn)提供的是一個(gè)高速的內(nèi)存緩存,操作效率非常高效,CPU
性能損耗在ns
納秒級(jí)別。使用簡(jiǎn)單易上手,非常適合單機(jī)應(yīng)用使用。
基本使用
我們可以通過gcache.New()
創(chuàng)建一個(gè)緩存對(duì)象
也可以直接使用gcache包方法,使用方式都是一樣的。
下面代碼段介紹了gcache的基本使用:
package main import ( "fmt" "github.com/gogf/gf/os/gcache" "github.com/gogf/gf/os/gtime" ) func main() { // 創(chuàng)建一個(gè)緩存對(duì)象, c := gcache.New() // 設(shè)置緩存,不過期 _ = c.Set("k1", "v1", 0) // 獲取緩存 v, _ := c.Get("k1") fmt.Println("k1對(duì)應(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)閉緩存對(duì)象,讓GC回收資源 _ = c.Close() // 當(dāng)然也可以便捷地直接使用gcache包方法,使用方式和上面的一樣 _ = gcache.Set("k2", "v2", gtime.M*30) //半小時(shí)后到期 k2Value, _ := gcache.Get("k2") fmt.Println("k2對(duì)應(yīng)的值:", k2Value) //v2 }
打印結(jié)果
緩存控制
下面介紹一些特殊場(chǎng)景的用法:
當(dāng)鍵名不存在時(shí)寫入:SetIfNotExist
根據(jù)鍵名取不到值時(shí)寫入:GetOrSet
package main import ( "fmt" "github.com/gogf/gf/os/gcache" "time" ) func main() { // 當(dāng)鍵名不存在時(shí)寫入,設(shè)置過期時(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í)寫入,并返回鍵值;第三個(gè)參數(shù)設(shè)置為0表示永不過期 v, _ := gcache.GetOrSet("k2", "v2", 0) fmt.Println("寫入的鍵值:", v) //v2 // 打印當(dāng)前的鍵值對(duì) dataMap, _ := gcache.Data() fmt.Println("打印當(dāng)前的鍵值對(duì):", dataMap) // map[k1:v1 k2:v2] // 等待1秒,以便k1:v1自動(dòng)過期 time.Sleep(time.Second) // 再次打印當(dāng)前的鍵值對(duì),發(fā)現(xiàn)k1:v1已經(jīng)過期,只剩下k2:v2 data2, _ := gcache.Data() fmt.Println("等待一秒后,打印當(dāng)前的鍵值對(duì):", data2) // map[k2:v2] }
打印結(jié)果
緩存淘汰策略
之前做項(xiàng)目的時(shí)候也有這么設(shè)計(jì)過,現(xiàn)在gcache天然支持緩存淘汰策略
場(chǎng)景分析
給大家舉個(gè)項(xiàng)目中的栗子:
比如我有一個(gè)新聞網(wǎng)站,為了保證新聞詳情頁的加載速度,會(huì)把新聞詳情頁做緩存處理(內(nèi)容緩存,評(píng)論點(diǎn)贊等動(dòng)態(tài)獲取。)
往往新產(chǎn)生的新聞熱度和訪問量會(huì)更高,需要做緩存,而陳舊的新聞因?yàn)闊岫炔辉?,訪問量低就可以釋放緩存了。
設(shè)置緩存時(shí)間是一個(gè)解決思路,另外的思路就是設(shè)置緩存的淘汰策略。
比如:我一共允許緩存100萬個(gè)緩存詳情頁,當(dāng)超過100萬個(gè)時(shí),會(huì)淘汰掉最早緩存的數(shù)據(jù),實(shí)現(xiàn)動(dòng)態(tài)且穩(wěn)定的緩存策略。
gcache天然支持這種緩存淘汰策略
代碼示例
下面舉個(gè)簡(jiǎn)單的栗子:
package main import ( "fmt" "github.com/gogf/gf/os/gcache" "time" ) func main() { // 設(shè)置LRU淘汰數(shù)量 c := gcache.New(2) // 添加10個(gè)元素,不過期 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) // 等待一定時(shí)間后(默認(rèn)1秒檢查一次), // 元素會(huì)被按照從舊到新的順序進(jìn)行淘汰 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
獲取一個(gè)緩存值,當(dāng)緩存不存在時(shí)執(zhí)行指定的f func() (interface{}, error)
,緩存該f
方法的結(jié)果值,并返回該結(jié)果。
總結(jié)
這篇文章為大家介紹了gcache的基本使用、緩存控制以及淘汰策略。
單機(jī)項(xiàng)目可以使用gcache做緩存處理,簡(jiǎn)單方便易上手;分布式應(yīng)用可以使用gredis做緩存處理,下一篇介紹gredis的使用,更多關(guān)于GoFrame gcache 緩存控制 淘汰策略的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Go語言并發(fā)之context標(biāo)準(zhǔn)庫的使用詳解
Context的出現(xiàn)是為了解決在大型應(yīng)用程序中的并發(fā)環(huán)境下,協(xié)調(diào)和管理多個(gè)goroutine之間的通信、超時(shí)和取消操作的問題,本文就來和大家簡(jiǎn)單聊聊它的具體用法,希望對(duì)大家有所幫助2023-06-06解決goland 導(dǎo)入項(xiàng)目后import里的包報(bào)紅問題
這篇文章主要介紹了解決goland 導(dǎo)入項(xiàng)目后import里的包報(bào)紅問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-05-05golang使用信號(hào)量熱更新的實(shí)現(xiàn)示例
這篇文章主要介紹了golang使用信號(hào)量熱更新的實(shí)現(xiàn)示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-04-04Golang中String,rune和byte的相互轉(zhuǎn)換
Go語言中,string就是只讀的采用utf8編碼的字節(jié)切片,rune是int32的別名,代表字符的Unicode編碼,這篇文章主要介紹了Golang中String,rune和byte的相互轉(zhuǎn)換,感興趣的小伙伴可以了解一下2023-10-10Golang命令行進(jìn)行debug調(diào)試操作
今天小編就為大家分享一篇關(guān)于,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-04-04在?Golang?中使用?Cobra?創(chuàng)建?CLI?應(yīng)用
這篇文章主要介紹了在?Golang?中使用?Cobra?創(chuàng)建?CLI?應(yīng)用,來看下?Cobra?的使用,這里我們使用的?go1.13.3?版本,使用?Go?Modules?來進(jìn)行包管理,需要的朋友可以參考下2022-01-01