W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
文件存儲的方式在單節(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í)行后,
Session
?變量;
Session
?變量已經(jīng)設(shè)置并成功獲取;
Session
?變量已經(jīng)從?Redis
?存儲中恢復(fù);如果我們手動修改?Redis
?中的對應(yīng)鍵值數(shù)據(jù),頁面刷新時也會讀取到最新的值;
Session
?,因為該?Session
?已經(jīng)過期;Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: