From af043befc2302fd7dd07fc2806d47e661f4d4bf3 Mon Sep 17 00:00:00 2001 From: Havoc412 <2993167370@qq.com> Date: Mon, 18 Nov 2024 19:15:58 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=8E=A8=20=E5=AE=9E=E7=8E=B0=20redis=20mod?= =?UTF-8?q?el=20=E7=9A=84=E5=9F=BA=E7=B1=BB=EF=BC=8C=E5=B9=B6=E8=83=BD?= =?UTF-8?q?=E5=A4=9F=E5=BE=88=E5=A5=BD=E7=9A=84=E2=80=9C=E7=BB=84=E5=90=88?= =?UTF-8?q?=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/http/controller/web/animal_controller.go | 4 +- app/model_redis/base_model.go | 59 +++++++++++++++++ app/model_redis/selectedAnimal4Prefer.go | 66 ++++++++------------ 3 files changed, 86 insertions(+), 43 deletions(-) create mode 100644 app/model_redis/base_model.go diff --git a/app/http/controller/web/animal_controller.go b/app/http/controller/web/animal_controller.go index fad0f3d..c3ce39b 100644 --- a/app/http/controller/web/animal_controller.go +++ b/app/http/controller/web/animal_controller.go @@ -37,7 +37,7 @@ func (a *Animals) List(context *gin.Context) { mode := context.GetString(consts.ValidatorPrefix + "mode") // TAG prefer MODE 查询模式。 - var redis_selctedCatsId model_redis.SelectedAnimal4Prefer + redis_selctedCatsId := model_redis.CreateSelectedAnimal4Prefer() var animalsWithLike []model.AnimalWithLikeList if mode == consts.AnimalPreferMode { key := int64(context.GetFloat64(consts.ValidatorPrefix + "key")) @@ -51,7 +51,7 @@ func (a *Animals) List(context *gin.Context) { } if redis_selctedCatsId.Length() == skip { - preferCats, _ := getPreferCats(int(userId), num, attrs, &redis_selctedCatsId) + preferCats, _ := getPreferCats(int(userId), num, attrs, redis_selctedCatsId) if len(preferCats) > 0 { animalsWithLike = preferCats } diff --git a/app/model_redis/base_model.go b/app/model_redis/base_model.go new file mode 100644 index 0000000..acb4178 --- /dev/null +++ b/app/model_redis/base_model.go @@ -0,0 +1,59 @@ +package model_redis + +import ( + "catface/app/global/variable" + "catface/app/utils/redis_factory" + "encoding/json" +) + +func NewBaseModel() *BaseModel { + return &BaseModel{} +} + +type BaseModel struct { + key int64 `json:"-"` +} + +func (b *BaseModel) GenerateKey() int64 { + b.key = variable.SnowFlake.GetId() + return b.key +} + +func (b *BaseModel) GetKey() int64 { + return b.key +} + +// SetDataByKey 将子类的数据保存到 Redis 中 +func (b *BaseModel) SetDataByKey(data interface{}) (bool, error) { + redisClient := redis_factory.GetOneRedisClient() + defer redisClient.ReleaseOneRedisClient() + + jsonData, err := json.Marshal(data) + if err != nil { + return false, err + } + + if _, err := redisClient.Execute("set", b.key, jsonData); err == nil { + return true, nil + } else { + return false, err + } +} + +// GetDataByKey 从 Redis 中获取数据并解码到子类中 +func (b *BaseModel) GetDataByKey(key int64, data interface{}) (bool, error) { + b.key = key // 顺便保存 valid 中拿到的 key 值。 + + redisClient := redis_factory.GetOneRedisClient() + defer redisClient.ReleaseOneRedisClient() + + if res, err := redisClient.String(redisClient.Execute("get", key)); err == nil { + if err := json.Unmarshal([]byte(res), data); err == nil { + return true, nil + } else { + return false, err + } + } else { + return false, err + } +} diff --git a/app/model_redis/selectedAnimal4Prefer.go b/app/model_redis/selectedAnimal4Prefer.go index 5cff22e..1b0f366 100644 --- a/app/model_redis/selectedAnimal4Prefer.go +++ b/app/model_redis/selectedAnimal4Prefer.go @@ -1,19 +1,19 @@ package model_redis -import ( - "catface/app/global/variable" - "catface/app/utils/redis_factory" - "encoding/json" -) - // INFO 辅助 animal - list - prefer 模式下的查询特化。 -type SelectedAnimal4Prefer struct { - EncounteredCatsId []int64 `json:"encountered_cats_id"` // #1 对应第一阶段:近期路遇关联 - NewCatsId []int64 `json:"new_cats_id"` // #2 对应第二阶段:近期新增 +func CreateSelectedAnimal4Prefer() *SelectedAnimal4Prefer { // 构造函数的必要性,这样才能调用【父类】的方法。 + return &SelectedAnimal4Prefer{ + BaseModel: NewBaseModel(), + } +} - key int64 `json:"-"` // redis 的 key 值 - notPassNewCat bool `json:"-"` +type SelectedAnimal4Prefer struct { + *BaseModel `json:"-"` // TIP Go 中组合的概念。 + EncounteredCatsId []int64 `json:"encountered_cats_id"` // #1 对应第一阶段:近期路遇关联 + NewCatsId []int64 `json:"new_cats_id"` // #2 对应第二阶段:近期新增 + + notPassNewCat bool `json:"-"` } func (s *SelectedAnimal4Prefer) NotPassNew() bool { @@ -39,38 +39,22 @@ func (s *SelectedAnimal4Prefer) AppendEncIds(ids []int64) { } // BASE CURD -func (s *SelectedAnimal4Prefer) GenerateKey() int64 { // TODO 之后迁移到 model_redis 的基类去。 - s.key = variable.SnowFlake.GetId() + +/** + * @description: 实现重写,补充子类需要增加的操作。 + * @return {*} + */ +func (s *SelectedAnimal4Prefer) GenerateKey() int64 { s.notPassNewCat = true - return s.key -} - -func (s *SelectedAnimal4Prefer) GetKey() int64 { // TODO 同上 - return s.key -} - -func (s *SelectedAnimal4Prefer) GetDataByKey(key int64) (bool, error) { - s.key = key - - redisClient := redis_factory.GetOneRedisClient() - defer redisClient.ReleaseOneRedisClient() - - if res, err := redisClient.String(redisClient.Execute("get", key)); err == nil { - json.Unmarshal([]byte(res), s) - return true, nil - } else { - return false, err - } + return s.BaseModel.GenerateKey() } +// 调用 BaseModel 的 SetDataByKey 方法 func (s *SelectedAnimal4Prefer) SetDataByKey() (bool, error) { - redisClient := redis_factory.GetOneRedisClient() - defer redisClient.ReleaseOneRedisClient() - - data, _ := json.Marshal(s) - if _, err := redisClient.Execute("set", s.key, data); err == nil { - return true, nil - } else { - return false, err - } + return s.BaseModel.SetDataByKey(s) +} + +// 调用 BaseModel 的 GetDataByKey 方法 +func (s *SelectedAnimal4Prefer) GetDataByKey(key int64) (bool, error) { + return s.BaseModel.GetDataByKey(key, s) }