新聞中心
文件存儲
在默認(rèn)情況下,?ghttp.Server?的?Session?存儲使用了內(nèi)存+文件的方式,使用?StorageFile?對象實(shí)現(xiàn)。具體原理為:

創(chuàng)新互聯(lián)建站主營石城網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,重慶APP軟件開發(fā),石城h5小程序設(shè)計(jì)搭建,石城網(wǎng)站營銷推廣歡迎石城等地區(qū)企業(yè)咨詢
- ?
Session?的數(shù)據(jù)操作完全基于內(nèi)存; - 使用?
gcache?進(jìn)程緩存模塊控制數(shù)據(jù)過期; - 使用文件存儲持久化存儲管理?
Session?數(shù)據(jù); - 當(dāng)且僅有當(dāng)?
Session?被標(biāo)記為?dirty?時(shí)(數(shù)據(jù)有更新)才會執(zhí)行?Session?序列化并執(zhí)行文件持久化存儲; - 當(dāng)且僅當(dāng)內(nèi)存中的?
Session?不存在時(shí),才會從文件存儲中反序列化恢復(fù)?Session?數(shù)據(jù)到內(nèi)存中,降低IO調(diào)用; - 序列化/反序列化使用的是標(biāo)準(zhǔn)庫的?
json.Marshal?/?UnMarshal?方法;
從原理可知,當(dāng)?Session?為讀多寫少的場景中,?Session?的數(shù)據(jù)操作非常高效。
有個(gè)注意的細(xì)節(jié),由于文件存儲涉及到文件操作,為便于降低?IO?開銷并提高?Session?操作性能,并不是每一次?Session?請求結(jié)束后都會立即刷新對應(yīng)?Session?的?TTL?時(shí)間。而只有當(dāng)涉及到更新操作(被標(biāo)記為?dirty?)時(shí)才會立即刷新其?TTL?;針對于讀取請求,將會每隔一分鐘更新前一分鐘內(nèi)讀取操作對應(yīng)的?Session?文件?TTL?時(shí)間,以便于?Session?自動續(xù)活。
使用示例
package main
import (
"github.com/GOgf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/ghttp"
"github.com/gogf/gf/v2/os/gtime"
"time"
)
func main() {
s := g.Server()
s.SetConfigWithMap(g.Map{
"SessionMaxAge": time.Minute,
})
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()
}在該實(shí)例中,為了方便觀察過期失效,我們將?Session?的過期時(shí)間設(shè)置為1分鐘。執(zhí)行后,
- 首先,訪問 http://127.0.0.1:8199/set 設(shè)置一個(gè)?
Session?變量; - 隨后,訪問 http://127.0.0.1:8199/get 可以看到該?
Session?變量已經(jīng)設(shè)置并成功獲??; - 接著,我們停止程序,并重新啟動,再次訪問 http://127.0.0.1:8199/get ,可以看到?
Session?變量已經(jīng)從文件存儲中恢復(fù); - 等待1分鐘后,再次訪問 http://127.0.0.1:8199/get 可以看到已經(jīng)無法獲取該?
Session?,因?yàn)樵?Session?已經(jīng)過期;
名稱欄目:創(chuàng)新互聯(lián)GoFrame教程:GoFrame Session-File
路徑分享:http://m.5511xx.com/article/cochsoe.html


咨詢
建站咨詢
