gin-session
- gin-session 一个为gin框架开发的session中间件, 使用redis储存数据, 并且底层维护了一个cache, 大量减小了对redis的读操作 。
- gin-session 保证请求前和请求后, session数据的一致性和完整性, 不保证请求执行过程中数据实时同步。
安装
go get github.com/loop-xxx/gin-session
架构


流程
if token, err := ctx.Cookie("gin-session-id"); err == nil{
if cacheBall, exist := pool.SearchCacheBall(token); exist {
ball = cacheBall
}else{
ball = cache_pool.MakeCacheBall(
fmt.Sprintf("gin-session:%s", token),
keeper,
expiration)
pool.AppendCacheBall(token, ball)
}
if ball.Sync(){
data = ball.Get()
}else{
data = make(map[string]string, sessionInitSize)
}
}
ctx.Next()
if ginSession.Check(){
ball.Commit(ginSession.Dump())
}
参数介绍
GinSessionManager(
keeper,
domain,
expiration,
poolMaxSize,
sessionMapInitSize,
)
简单使用
type User struct{
FirstName string
SecondName string
}
func main() {
if keeper, err := dao.DefaultRedis("192.168.20.130:6379", "toor", 0); err == nil {
engine := gin.Default()
engine.Use(session.DefaultGinSessionManager(keeper, "localhost"))
engine.GET("/login", func(ctx *gin.Context){
if s, exist := session.GetSession(ctx); exist {
s.Set("name", "loop")
_= s.SetStruct("user", User{"li", "loop"})
}
ctx.String(http.StatusOK, "ok")
})
engine.GET("/show", func(ctx *gin.Context){
if s, ok := session.GetSession(ctx); ok {
if name , ok := s.Get("name"); ok{
var u User
if err := s.GetStruct("user",&u); err == nil{
ctx.JSON(http.StatusOK, gin.H{"name": name, "user":u})
}
}
}
})
_ = engine.Run(":2333")
}
}