GoFrame Session-Redis-KeyValue

2022-04-14 10:26 更新

Redis KeyValue Storage

文件存儲的方式在單節(jié)點(diǎn)的場景下非常不錯,但是涉及到對應(yīng)用進(jìn)行多節(jié)點(diǎn)部署的場景下,各個節(jié)點(diǎn)的?Session?無法共享,因此需要將?Session?存儲單獨(dú)剝離出來管理,?Redis?服務(wù)器是比較常見的一個選擇。

?gsession?的?Redis?存儲使用?StorageRedis?對象實現(xiàn),與文件存儲比較類似,為了提高執(zhí)行效率,也是采用了內(nèi)存+?Redis?的方式。與文件存儲唯一不同的是,在每一次請求中如果需要對?Session?進(jìn)行操作時,將會從?Redis?中拉取一次最新的?Session?數(shù)據(jù)(而文件存儲只會在?Session?不存在時讀取一次文件)。在每一次請求結(jié)束之后,將全量的?Session?數(shù)據(jù)通過?JSON?序列化之后通過?KeyValue?方式更新到?Redis?服務(wù)中。

如果單個用戶下(以用戶維度舉例)?Session?數(shù)據(jù)量不大的業(yè)務(wù)場景中,都推薦使用這種?Storage?方式。如果單個用戶?Session?數(shù)據(jù)量較大(例如>10MB),可以參考?HashTable?的?Storage?方式:?Session-Redis-HashTable?

使用示例

package main

import (
	"github.com/gogf/gf/v2/frame/g"
	"github.com/gogf/gf/v2/net/ghttp"
	"github.com/gogf/gf/v2/os/gsession"
	"github.com/gogf/gf/v2/os/gtime"
	"time"
)

func main() {
	s := g.Server()
	s.SetConfigWithMap(g.Map{
		"SessionMaxAge":  time.Minute,
		"SessionStorage": gsession.NewStorageRedis(g.Redis()),
	})
	s.Group("/", func(group *ghttp.RouterGroup) {
		group.ALL("/set", func(r *ghttp.Request) {
			r.Session.Set("time", gtime.Timestamp())
			r.Response.Write("ok")
		})
		group.ALL("/get", func(r *ghttp.Request) {
			r.Response.Write(r.Session.Map())
		})
		group.ALL("/del", func(r *ghttp.Request) {
			r.Session.Clear()
			r.Response.Write("ok")
		})
	})
	s.SetPort(8199)
	s.Run()
}

在該實例中,為了方便觀察過期失效,我們將?Session?的過期時間設(shè)置為1分鐘。執(zhí)行后,

  1. 首先,訪問 http://127.0.0.1:8199/set 設(shè)置一個?Session?變量;
  2. 隨后,訪問 http://127.0.0.1:8199/get 可以看到該?Session?變量已經(jīng)設(shè)置并成功獲取;
  3. 接著,我們停止程序,并重新啟動,再次訪問 http://127.0.0.1:8199/get ,可以看到?Session?變量已經(jīng)從?Redis?存儲中恢復(fù);如果我們手動修改?Redis?中的對應(yīng)鍵值數(shù)據(jù),頁面刷新時也會讀取到最新的值;
  4. 等待1分鐘后,再次訪問 http://127.0.0.1:8199/get 可以看到已經(jīng)無法獲取該?Session?,因為該?Session?已經(jīng)過期;


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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號