Files
015/pkg/models/stat.go

70 lines
1.7 KiB
Go

package models
import (
"context"
"encoding/json"
"pkg/utils"
"github.com/redis/rueidis"
)
// 统计数据结构
type StatData struct {
FileSize int64 `json:"file_size"` // 文件大小
FileNum int64 `json:"file_num"` // 文件数量
ShareNum int64 `json:"share_num"` // 分享数量
DownloadNum int64 `json:"download_num"` // 下载数量
}
func GetRedisStat(key string) (*StatData, error) {
rdb := utils.GetRedisClient()
ctx := context.Background()
statUnmarshalData, err := rdb.Do(ctx, rdb.B().Hget().Key("015:stat").Field(key).Build()).ToString()
if rueidis.IsRedisNil(err) {
return nil, nil
}
if err != nil {
return nil, err
}
var stat StatData
if err := json.Unmarshal([]byte(statUnmarshalData), &stat); err != nil {
return nil, err
}
return &stat, nil
}
func SetRedisStat(key string, handler func(stat *StatData) *StatData) (*StatData, error) {
var updatedStat *StatData
err := utils.WithLocker(context.Background(), "015:stat:"+key, 0, func(ctx context.Context) error {
rdb := utils.GetRedisClient()
old_stat, err := GetRedisStat(key)
if err != nil {
return err
}
if old_stat == nil {
old_stat = &StatData{}
}
stat := handler(old_stat)
jsonData, err := json.Marshal(stat)
if err != nil {
return err
}
if err := rdb.Do(ctx, rdb.B().Hset().Key("015:stat").FieldValue().FieldValue(key, string(jsonData)).Build()).Error(); err != nil {
return err
}
updatedStat = stat
return nil
})
if err != nil {
return nil, err
}
return updatedStat, nil
}
func GetRedisStatAll() (map[string]string, error) {
rdb := utils.GetRedisClient()
ctx := context.Background()
return rdb.Do(ctx, rdb.B().Hgetall().Key("015:stat").Build()).AsStrMap()
}