W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
?gcache
?是提供統(tǒng)一的緩存管理模塊,提供了開發(fā)者可自定義靈活接入的緩存適配接口,并默認(rèn)提供了高速內(nèi)存緩存適配實(shí)現(xiàn)。
使用方式:
import "github.com/gogf/gf/v2/os/gcache"
接口文檔:
https://pkg.go.dev/github.com/gogf/gf/v2/os/gcache
簡要介紹:
gcache
?默認(rèn)提供默認(rèn)的高速內(nèi)存緩存對(duì)象,可以通過包方法操作內(nèi)存緩存,也可以通過?New
?方法創(chuàng)建內(nèi)存緩存對(duì)象。在通過包方法使用緩存功能時(shí),操作的是?gcache
?默認(rèn)提供的一個(gè)?gcache.Cache
?對(duì)象,具有全局性,因此在使用時(shí)注意全局鍵名的覆蓋。
gcache
?使用的鍵名類型是?interface{}
?,而不是?string
?類型,這意味著我們可以使用任意類型的變量作為鍵名,但大多數(shù)時(shí)候建議使用?string
?或者?[]byte
?作為鍵名,并且統(tǒng)一鍵名的數(shù)據(jù)類型,以便維護(hù)。
gcache
?存儲(chǔ)的鍵值類型是?interface{}
?,也就是說可以存儲(chǔ)任意的數(shù)據(jù)類型,當(dāng)獲取數(shù)據(jù)時(shí)返回的也是?interface{}
?類型,若需要轉(zhuǎn)換為其他的類型可以通過?gcache
?的?Get*
?方法便捷獲取常見類型。注意,如果您確定知道自己使用的是內(nèi)存緩存,那么可以直接使用斷言方式對(duì)返回的?interface{}
?變量進(jìn)行類型轉(zhuǎn)換,否則建議通過獲取到的泛型對(duì)象對(duì)應(yīng)方法完成類型轉(zhuǎn)換。
gcache
?的緩存過期時(shí)間參數(shù)?duration
?的類型為?time.Duration
?類型,在?Set
?緩存變量時(shí),如果緩存時(shí)間參數(shù)?duration = 0
?表示不過期,?duration < 0
?表示立即過期,?duration > 0
?表示超時(shí)過期。大家可以發(fā)現(xiàn)緩存組件中關(guān)于鍵值對(duì)的數(shù)據(jù)類型都是?interface{}
?,這種設(shè)計(jì)主要是為了考慮通用性和易用性,但是使用上需要注意?interface{}
?的比較:只有數(shù)據(jù)和類型都相等才算真正匹配。我們來看個(gè)例子。
package main
import (
"fmt"
"github.com/gogf/gf/v2/os/gcache"
"github.com/gogf/gf/v2/os/gctx"
)
func main() {
var (
ctx = gctx.New()
key1 int32 = 1
key2 float64 = 1
value = `value`
)
_ = gcache.Set(ctx, key1, value, 0)
fmt.Println(gcache.MustGet(ctx, key1).Val())
fmt.Println(gcache.MustGet(ctx, key2).Val())
}
執(zhí)行后,終端輸出:
value
<nil>
可以看到,雖然?key1
?和?key2
?的數(shù)值都是相同的,但是兩者類型不同,因此通過?key2
?無法獲取到鍵值。
由于鍵值的類型也是?interface{}
?,往往在獲取后會(huì)通過類型轉(zhuǎn)換為需要的數(shù)據(jù)類型。常見的類型轉(zhuǎn)換是直接使用類型斷言,這種做法有種風(fēng)險(xiǎn),就是由于?gcache
?組件采用適配器接口設(shè)計(jì)模式,因此底層的實(shí)現(xiàn)上(除了默認(rèn)的內(nèi)存適配器)往往會(huì)改變?cè)械臄?shù)據(jù)類型(非內(nèi)存實(shí)現(xiàn)往往都會(huì)涉及到序列化/反序列化存儲(chǔ)),因此不推薦大家直接使用類型斷言進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換。
因此緩存組件在獲取鍵值上做了改進(jìn),并不是直接返回?interface{}
?的鍵值類型,而是以框架泛型?*gvar.Var
?對(duì)象返回,開發(fā)者根據(jù)業(yè)務(wù)場(chǎng)景轉(zhuǎn)換為所需的數(shù)據(jù)類型。特別是針對(duì)于對(duì)象緩存存儲(chǔ)和讀取的場(chǎng)景特別有用,我們來看一個(gè)示例:
package main
import (
"fmt"
"github.com/gogf/gf/v2/os/gcache"
"github.com/gogf/gf/v2/os/gctx"
)
func main() {
type User struct {
Id int
Name string
Site string
}
var (
ctx = gctx.New()
user *User
key = `UserKey`
value = &User{
Id: 1,
Name: "GoFrame",
Site: "https://goframe.org",
}
)
err := gcache.Set(ctx, key, value, 0)
if err != nil {
panic(err)
}
v, err := gcache.Get(ctx, key)
if err != nil {
panic(err)
}
if err = v.Scan(&user); err != nil {
panic(err)
}
fmt.Printf(`%#v`, user)
}
執(zhí)行后,終端輸出:
&main.User{Id:1, Name:"GoFrame", Site:"https://goframe.org"}
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: