* feat(metrics): grand update * feat(metrics): fixed missing part in ee tracer * feat(assets): added missing arg * feat(metrics): fixed naming problems
110 lines
2.9 KiB
Go
110 lines
2.9 KiB
Go
package sessions
|
|
|
|
import (
|
|
"encoding/json"
|
|
"errors"
|
|
"fmt"
|
|
"time"
|
|
|
|
"openreplay/backend/pkg/db/redis"
|
|
"openreplay/backend/pkg/metrics/database"
|
|
)
|
|
|
|
var ErrDisabledCache = errors.New("cache is disabled")
|
|
|
|
type cacheImpl struct {
|
|
db *redis.Client
|
|
metrics database.Database
|
|
}
|
|
|
|
func NewCache(db *redis.Client, metrics database.Database) Cache {
|
|
return &cacheImpl{db: db, metrics: metrics}
|
|
}
|
|
|
|
func (c *cacheImpl) SetCache(sessID uint64, data map[string]string) error {
|
|
if c.db == nil {
|
|
return ErrDisabledCache
|
|
}
|
|
if data == nil {
|
|
return errors.New("session is nil")
|
|
}
|
|
if sessID == 0 {
|
|
return errors.New("session id is 0")
|
|
}
|
|
start := time.Now()
|
|
sessionBytes, err := json.Marshal(data)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if _, err = c.db.Redis.Set(fmt.Sprintf("session:cache:id:%d", sessID), sessionBytes, time.Minute*120).Result(); err != nil {
|
|
return err
|
|
}
|
|
c.metrics.RecordRedisRequestDuration(float64(time.Now().Sub(start).Milliseconds()), "setCache", "session")
|
|
c.metrics.IncreaseRedisRequests("setCache", "sessions")
|
|
return nil
|
|
}
|
|
|
|
func (c *cacheImpl) GetCache(sessID uint64) (map[string]string, error) {
|
|
if c.db == nil {
|
|
return nil, ErrDisabledCache
|
|
}
|
|
if sessID == 0 {
|
|
return nil, errors.New("session id is 0")
|
|
}
|
|
start := time.Now()
|
|
result, err := c.db.Redis.Get(fmt.Sprintf("session:cache:id:%d", sessID)).Result()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
session := map[string]string{}
|
|
if err = json.Unmarshal([]byte(result), &session); err != nil {
|
|
return nil, err
|
|
}
|
|
c.metrics.RecordRedisRequestDuration(float64(time.Now().Sub(start).Milliseconds()), "getCache", "session")
|
|
c.metrics.IncreaseRedisRequests("getCache", "sessions")
|
|
return session, nil
|
|
}
|
|
|
|
func (c *cacheImpl) Set(session *Session) error {
|
|
if c.db == nil {
|
|
return ErrDisabledCache
|
|
}
|
|
if session == nil {
|
|
return errors.New("session is nil")
|
|
}
|
|
if session.SessionID == 0 {
|
|
return errors.New("session id is 0")
|
|
}
|
|
start := time.Now()
|
|
sessionBytes, err := json.Marshal(session)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if _, err = c.db.Redis.Set(fmt.Sprintf("session:id:%d", session.SessionID), sessionBytes, time.Minute*60).Result(); err != nil {
|
|
return err
|
|
}
|
|
c.metrics.RecordRedisRequestDuration(float64(time.Now().Sub(start).Milliseconds()), "set", "session")
|
|
c.metrics.IncreaseRedisRequests("set", "sessions")
|
|
return nil
|
|
}
|
|
|
|
func (c *cacheImpl) Get(sessionID uint64) (*Session, error) {
|
|
if c.db == nil {
|
|
return nil, ErrDisabledCache
|
|
}
|
|
if sessionID == 0 {
|
|
return nil, errors.New("session id is 0")
|
|
}
|
|
start := time.Now()
|
|
result, err := c.db.Redis.Get(fmt.Sprintf("session:id:%d", sessionID)).Result()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
session := &Session{}
|
|
if err = json.Unmarshal([]byte(result), session); err != nil {
|
|
return nil, err
|
|
}
|
|
c.metrics.RecordRedisRequestDuration(float64(time.Now().Sub(start).Milliseconds()), "get", "session")
|
|
c.metrics.IncreaseRedisRequests("get", "sessions")
|
|
return session, nil
|
|
}
|