GoFrame 緩存管理-基本介紹

2022-04-08 09:21 更新

基本介紹

?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

簡要介紹:

  1. ?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í)注意全局鍵名的覆蓋。
  2. ?gcache?使用的鍵名類型是?interface{}?,而不是?string?類型,這意味著我們可以使用任意類型的變量作為鍵名,但大多數(shù)時(shí)候建議使用?string?或者?[]byte?作為鍵名,并且統(tǒng)一鍵名的數(shù)據(jù)類型,以便維護(hù)。
  3. ?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)換。
  4. 另外需要注意的是,?gcache?的緩存過期時(shí)間參數(shù)?duration?的類型為?time.Duration?類型,在?Set?緩存變量時(shí),如果緩存時(shí)間參數(shù)?duration = 0?表示不過期,?duration < 0?表示立即過期,?duration > 0?表示超時(shí)過期。

注意事項(xiàng)

關(guān)于鍵名數(shù)據(jù)類型

大家可以發(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?無法獲取到鍵值。

關(guān)于獲取對(duì)象鍵值

由于鍵值的類型也是?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"}


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)