詳解Golang中g(shù)cache模塊的基本使用
gcache提供統(tǒng)一的緩存管理模塊,提供了開發(fā)者可自定義靈活接入的緩存適配接口,并默認提供了高速內(nèi)存緩存適配實現(xiàn)。
先說結(jié)論
這篇文章通過結(jié)合商業(yè)項目的使用場景,為大家介紹了gcache的基本使用、緩存控制以及淘汰策略。
使用gcache做緩存處理,簡單方便易上手!
優(yōu)勢
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()
// 當然也可以便捷地直接使用gcache包方法,使用方式和上面的一樣
_ = gcache.Set("k2", "v2", gtime.M*30) //半小時后到期
k2Value, _ := gcache.Get("k2")
fmt.Println("k2對應(yīng)的值:", k2Value) //v2
}打印結(jié)果

緩存控制
下面介紹一些特殊場景的用法:
當鍵名不存在時寫入:SetIfNotExist
根據(jù)鍵名取不到值時寫入:GetOrSet
package main
import (
"fmt"
"github.com/gogf/gf/os/gcache"
"time"
)
func main() {
// 當鍵名不存在時寫入,設(shè)置過期時間1秒
_, _ = gcache.SetIfNotExist("k1", "v1", time.Second)
// 打印當前的鍵名列表
keys, _ := gcache.Keys()
fmt.Println("打印當前的鍵名列表:", keys) //[k1]
// 打印當前的鍵值列表
values, _ := gcache.Values()
fmt.Println("打印當前的鍵值列表:", values) //[v1]
// 獲取指定鍵值,如果不存在時寫入,并返回鍵值;第三個參數(shù)設(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]
}打印結(jié)果

緩存淘汰策略
之前做項目的時候也有這么設(shè)計過,現(xiàn)在gcache天然支持緩存淘汰策略
實戰(zhàn)舉例
給大家舉個項目中的栗子:
比如我有一個新聞網(wǎng)站,為了保證新聞詳情頁的加載速度,會把新聞詳情頁做緩存處理(內(nèi)容緩存,評論點贊等動態(tài)獲取。)
一般來說新產(chǎn)生的新聞熱度和訪問量會更高,需要做緩存,而陳舊的新聞因為熱度不再,訪問量較低就從緩存中釋放了。
解決上面的問題一般有2種思路:
- 設(shè)置緩存時間是一個解決思路
- 另外的思路就是設(shè)置緩存的淘汰策略。
比如:我一共允許緩存1萬個緩存詳情頁,當超過1萬個時,會淘汰掉最早緩存的數(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獲取一個緩存值,當緩存不存在時執(zhí)行指定的f func() (interface{}, error),緩存該f方法的結(jié)果值,并返回該結(jié)果。
總結(jié)
這篇文章通過結(jié)合商業(yè)項目的使用場景,為大家介紹了gcache的基本使用、緩存控制以及淘汰策略。
單機項目可以使用gcache做緩存處理,簡單方便易上手;
以上就是詳解Golang中g(shù)cache模塊的基本使用的詳細內(nèi)容,更多關(guān)于Golang gcache模塊的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
詳解Go語言如何利用高階函數(shù)寫出優(yōu)雅的代碼
高階函數(shù)(Hiher-order?Function)定義為:滿足下列條件之一的函數(shù):接收一個或多個函數(shù)作為參數(shù);返回值是一個函數(shù)。本文為大家介紹了如何利用高階函數(shù)寫出優(yōu)雅的代碼,希望對大家有所幫助2023-01-01
GoLang RabbitMQ TTL與死信隊列以及延遲隊列詳細講解
這篇文章主要介紹了GoLang RabbitMQ TTL與死信隊列以及延遲隊列,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧2022-12-12
Go語言實現(xiàn)簡單的一個靜態(tài)WEB服務(wù)器
這篇文章主要介紹了Go語言實現(xiàn)簡單的一個靜態(tài)WEB服務(wù)器,本文給出了實現(xiàn)代碼和運行效果,學習Golang的練手作品,需要的朋友可以參考下2014-10-10

