beego Session redis源码解读

本文深入解析了beego框架中Session与Redis的存储机制。SessionStore的Get、Set、Delete和Flush操作在内存中进行,不会导致数据串扰。Session的真正加载在Provider的SessionRead方法中,而保存则在SessionRelease中完成。在beego的ControllerRegister ServeHTTP方法里,SessionStart启动会话并在请求结束时保存。通过示例代码和HTML交互,展示了在并发请求中Session的正确保存流程。
摘要由CSDN通过智能技术生成

在文章beego Session redis存储以及是否阻塞 我们说到session 是无阻塞的,session的接口对用户来说是一个字典(C# diction, Go是map), 存储所有的ssion也是一个字典(类似于C# Dictionary<string【sessionid 用于区分用户】,Dictionary<string【用户设置的key】,object>> )

首先我们来看看redis session (ledis_session.go)的源码吧,和C#相同, 有一个SessionStore负责存储和Provider;

package redis

import (
	"net/http"
	"strconv"
	"strings"
	"sync"
	"time"

	"github.com/astaxie/beego/session"

	"github.com/gomodule/redigo/redis"
)

var redispder = &Provider{}

// MaxPoolSize redis max pool size
var MaxPoolSize = 100

// SessionStore redis session store
type SessionStore struct {
	p           *redis.Pool
	sid         string
	lock        sync.RWMutex
	values      map[interface{}]interface{}
	maxlifetime int64
}

// Set value in redis session
func (rs *SessionStore) Set(key, value interface{}) error {
	rs.lock.Lock()
	defer rs.lock.Unlock()
	rs.values[key] = value
	return nil
}

// Get value in redis session
func (rs *SessionStore) Get(key interface{}) interface{} {
	rs.lock.RLock()
	defer rs.lock.RUnlock()
	if v, ok := rs.values[key]; ok {
		return v
	}
	return nil
}

// Delete value in redis session
func (rs *SessionStore) Delete(key interface{}) error {
	rs.lock.Lock()
	defer rs.lock.Unlock()
	delete(rs.values, key)
	return nil
}

// Flush clear all values in redis session
func (rs *SessionStore) Flush() error {
	rs.lock.Lock()
	defer rs.lock.Unlock()
	rs.values = make(map[interface{}]interface{})
	return nil
}

// SessionID get redis session id
func (rs *SessionStore) SessionID() string {
	return rs.sid
}

// SessionRelease save session values to redis
func (rs *SessionStore) SessionRelease(w http.ResponseWriter) {
	b, err := session.EncodeGob(rs.values)
	if err != nil {
		retur
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值