You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
165 lines
3.7 KiB
165 lines
3.7 KiB
package comm
|
|
|
|
import (
|
|
"context"
|
|
"yunyan/lego/utils"
|
|
"fmt"
|
|
"sync"
|
|
)
|
|
|
|
// session Session 临时数据key
|
|
const (
|
|
SessionMeta_SessionId = "sessionid" //会话Id
|
|
SessionMeta_IP = "ip" //IP地址
|
|
SessionMeta_UserId = "userid" //用户id
|
|
SessionMeta_ServiceTag = "servicetag" //集群标签
|
|
)
|
|
|
|
func NewUserSession() IUserSession {
|
|
return &UserSession{
|
|
meta: make(map[string]string),
|
|
cache: make(map[string]interface{}),
|
|
}
|
|
}
|
|
|
|
// 用户会话
|
|
type UserSession struct {
|
|
context.Context
|
|
metalock sync.RWMutex
|
|
meta map[string]string
|
|
cachelock sync.RWMutex
|
|
cache map[string]interface{}
|
|
}
|
|
|
|
// 重置
|
|
func (this *UserSession) SetSession(ctx context.Context, meta map[string]string) {
|
|
this.Context = ctx
|
|
for k, v := range meta {
|
|
this.meta[k] = v
|
|
}
|
|
}
|
|
|
|
// 重置
|
|
func (this *UserSession) Reset() {
|
|
this.meta = make(map[string]string)
|
|
this.cache = make(map[string]interface{})
|
|
}
|
|
|
|
func (this *UserSession) GetMateToString(key string) string {
|
|
value, _ := this.GetMate(key)
|
|
return value
|
|
}
|
|
func (this *UserSession) GetMateToInt64(key string) int64 {
|
|
value, _ := this.GetMate(key)
|
|
return utils.StringToInt64(value)
|
|
}
|
|
func (this *UserSession) GetMateToUInt64(key string) uint64 {
|
|
value, _ := this.GetMate(key)
|
|
return utils.StringToUInt64(value)
|
|
}
|
|
func (this *UserSession) GetMateToInt32(key string) int32 {
|
|
value, _ := this.GetMate(key)
|
|
return int32(utils.StringToInt64(value))
|
|
}
|
|
|
|
func (this *UserSession) GetMateToFloat64(key string) float64 {
|
|
value, _ := this.GetMate(key)
|
|
return utils.StringToFloat64(value)
|
|
}
|
|
func (this *UserSession) SetMateForFloat64(key string, value float64) {
|
|
this.SetMate(key, fmt.Sprintf("%f", value))
|
|
}
|
|
|
|
func (this *UserSession) SetMateForInt64(key string, value int64) {
|
|
this.SetMate(key, fmt.Sprintf("%d", value))
|
|
}
|
|
func (this *UserSession) GetMateToBool(key string) bool {
|
|
value, _ := this.GetMate(key)
|
|
return utils.StringToInt64(value) == 1
|
|
}
|
|
|
|
// 获取IP
|
|
func (this *UserSession) GetIP() string {
|
|
value, _ := this.GetMate(SessionMeta_IP)
|
|
return value
|
|
}
|
|
|
|
// 获取用户id
|
|
func (this *UserSession) GetServiceTag() string {
|
|
value, _ := this.GetMate(SessionMeta_ServiceTag)
|
|
return value
|
|
}
|
|
|
|
// 获取用户id
|
|
func (this *UserSession) GetSessionId() string {
|
|
value, _ := this.GetMate(SessionMeta_SessionId)
|
|
return value
|
|
}
|
|
func (this *UserSession) GetUserId() string {
|
|
value, _ := this.GetMate(SessionMeta_UserId)
|
|
return value
|
|
}
|
|
|
|
// 写入元数据
|
|
func (this *UserSession) SetMate(name, value string) {
|
|
this.metalock.Lock()
|
|
this.meta[name] = value
|
|
this.metalock.Unlock()
|
|
}
|
|
|
|
func (this *UserSession) SetMates(meta map[string]string) {
|
|
this.metalock.Lock()
|
|
for k, v := range meta {
|
|
this.meta[k] = v
|
|
}
|
|
this.metalock.Unlock()
|
|
}
|
|
|
|
// 写入元数据
|
|
func (this *UserSession) GetMate(name string) (value string, ok bool) {
|
|
this.metalock.RLock()
|
|
value, ok = this.meta[name]
|
|
this.metalock.RUnlock()
|
|
return
|
|
}
|
|
|
|
// 写入元数据
|
|
func (this *UserSession) SetCache(name string, value interface{}) {
|
|
this.cachelock.Lock()
|
|
this.cache[name] = value
|
|
this.cachelock.Unlock()
|
|
}
|
|
|
|
// 写入元数据
|
|
func (this *UserSession) GetCache(name string) (value interface{}, ok bool) {
|
|
this.cachelock.RLock()
|
|
value, ok = this.cache[name]
|
|
this.cachelock.RUnlock()
|
|
return
|
|
}
|
|
|
|
// 克隆
|
|
func (this *UserSession) Clone() (session IUserSession) {
|
|
session = NewUserSession()
|
|
this.metalock.RLock()
|
|
for k, v := range this.meta {
|
|
session.SetMate(k, v)
|
|
}
|
|
this.metalock.RUnlock()
|
|
this.cachelock.RLock()
|
|
for k, v := range this.cache {
|
|
session.SetCache(k, v)
|
|
}
|
|
this.cachelock.RUnlock()
|
|
return
|
|
}
|
|
|
|
func (this *UserSession) GetMetas() (meta map[string]string) {
|
|
meta = make(map[string]string)
|
|
this.metalock.RLock()
|
|
for k, v := range this.meta {
|
|
meta[k] = v
|
|
}
|
|
this.metalock.RUnlock()
|
|
return
|
|
}
|
|
|