Compare commits

..

4 Commits

Author SHA1 Message Date
zhangkun9038@dingtalk.com
dfb682c027 plate 2025-02-12 03:56:15 +08:00
zhangkun9038@dingtalk.com
62a37d7342 尝试:http://gitea.zjmod.xyz/phyer/core/issues/2#issue-2 2025-01-23 12:21:34 +08:00
zhangkun9038@dingtalk.com
1a7819e703 尝试:http://gitea.zjmod.xyz/phyer/core/issues/2#issue-2 2025-01-23 12:00:23 +08:00
zhangkun9038@dingtalk.com
97db2d80c8 http://gitea.zjmod.xyz/phyer/core/issues/1#issuecomment-1 2025-01-19 22:15:49 +08:00
3 changed files with 83 additions and 17 deletions

View File

@ -343,14 +343,14 @@ func (cl *Candle) ToStruct(core *Core) (*Candle, error) {
func (core *Core) SaveUniKey(period string, keyName string, extt time.Duration, tsi int64) {
refName := keyName + "|refer"
refRes, _ := core.RedisLocalCli.GetSet(refName, 1).Result()
// refRes, _ := core.RedisLocalCli.GetSet(refName, 1).Result()
core.RedisLocalCli.Expire(refName, extt)
// 为保证唯一性机制防止SaveToSortSet 被重复执行, ps: 不需要唯一此操作幂等在redis里
// founded, _ := core.findInSortSet(period, keyName, extt, tsi)
if len(refRes) != 0 {
logrus.Error("refName exist: ", refName)
return
}
// if len(refRes) != 0 {
// logrus.Error("refName exist: ", refName)
// return
// }
core.SaveToSortSet(period, keyName, extt, tsi)
}
@ -534,7 +534,9 @@ func (cl *Candle) SetToKey(core *Core) ([]interface{}, error) {
logrus.Error("err of PeriodToMinutes:", err)
}
// expf := float64(exp) * 60
expf := float64(exp) * 300
length, _ := core.Cfg.Config.Get("sortedSet").Get("length").String()
ln := ToFloat64(length)
expf := float64(exp) * ln
extt := time.Duration(expf) * time.Minute
curVolstr, _ := data[5].(string)
curVol, err := strconv.ParseFloat(curVolstr, 64)

View File

@ -699,7 +699,9 @@ func (cr *Core) GetExpiration(per string) (time.Duration, error) {
return 0, err
}
exp, err := cr.PeriodToMinutes(per)
dur := time.Duration(exp*300) * time.Minute
length, _ := cr.Cfg.Config.Get("sortedSet").Get("length").Int64()
logrus.Info("length of sortedSet: ", length)
dur := time.Duration(exp*length) * time.Minute
return dur, err
}

View File

@ -2,6 +2,7 @@ package core
import (
"encoding/json"
"fmt"
"time"
)
@ -20,23 +21,84 @@ func (pl *Plate) Init(instId string) {
}
// TODO 从redis里读出来已经存储的plate如果不存在就创建一个新的
// LoadPlate 加载或创建指定Instrument的Plate
// 1. 尝试从Redis加载已存储的Plate
// 2. 如果Redis中不存在则初始化一个新的Plate
// 3. 根据配置创建所有需要的Coaster
// 参数:
// - cr: 核心上下文对象
// - instId: Instrument ID
//
// 返回值:
// - *Plate: 加载或新建的Plate对象
// - error: 操作过程中发生的错误
func LoadPlate(cr *Core, instId string) (*Plate, error) {
// 初始化一个空的Plate对象
pl := Plate{}
// 构造Redis中存储Plate数据的key格式为"instId|plate"
plateName := instId + "|plate"
_, err := cr.RedisLocalCli.Exists().Result()
if err == nil {
str, _ := cr.RedisLocalCli.Get(plateName).Result()
json.Unmarshal([]byte(str), &pl)
} else {
pl.Init(instId)
prs := cr.Cfg.Config.Get("candleDimentions").MustArray()
for _, v := range prs {
pl.MakeCoaster(cr, v.(string))
// 尝试从Redis获取Plate数据
str, err := cr.RedisLocalCli.Get(plateName).Result()
// 如果Redis中存在数据且没有错误
if err == nil && str != "" {
// 将JSON字符串反序列化为Plate对象
if err := json.Unmarshal([]byte(str), &pl); err != nil {
// 反序列化失败时初始化一个新的Plate
// logrus.Warnf("failed to unmarshal plate data from redis, init new plate: %v", err)
pl.Init(instId)
}
// 返回从Redis加载的Plate对象
return &pl, nil
}
// Redis不可用或数据不存在时初始化一个新的Plate
pl.Init(instId)
// 从配置中获取candleDimentions配置项
prs := cr.Cfg.Config.Get("candleDimentions")
// 检查配置项是否存在
if prs == nil || prs.Interface() == nil {
return nil, fmt.Errorf("candleDimentions config not found")
}
// 将配置项转换为数组
periods := prs.MustArray()
// 遍历所有周期配置
for _, v := range periods {
// 将interface{}类型转换为string
period, ok := v.(string)
// 检查周期字符串是否有效
if !ok || period == "" {
continue // 跳过无效的周期配置
}
// 为每个周期创建Coaster
if err := pl.MakeCoaster(cr, period); err != nil {
// 如果创建失败,返回错误
return nil, fmt.Errorf("failed to create coaster for period %s: %v", period, err)
}
}
// 将新创建的Plate保存到Redis可选操作
if err := savePlateToRedis(cr, plateName, &pl); err != nil {
// 保存失败时记录警告日志
// logrus.Warnf("failed to save plate to redis: %v", err)
}
// 返回创建好的Plate对象
return &pl, nil
}
func savePlateToRedis(cr *Core, key string, pl *Plate) error {
data, err := json.Marshal(pl)
if err != nil {
return err
}
return cr.RedisLocalCli.Set(key, data, 0).Err()
}
func (pl *Plate) SetToKey(cr *Core) error {
js, _ := json.Marshal(*pl)
plateName := pl.InstID + "|plate"