🎨 实现 redis model 的基类,并能够很好的“组合”
This commit is contained in:
parent
18ef3f2bce
commit
af043befc2
@ -37,7 +37,7 @@ func (a *Animals) List(context *gin.Context) {
|
|||||||
mode := context.GetString(consts.ValidatorPrefix + "mode")
|
mode := context.GetString(consts.ValidatorPrefix + "mode")
|
||||||
|
|
||||||
// TAG prefer MODE 查询模式。
|
// TAG prefer MODE 查询模式。
|
||||||
var redis_selctedCatsId model_redis.SelectedAnimal4Prefer
|
redis_selctedCatsId := model_redis.CreateSelectedAnimal4Prefer()
|
||||||
var animalsWithLike []model.AnimalWithLikeList
|
var animalsWithLike []model.AnimalWithLikeList
|
||||||
if mode == consts.AnimalPreferMode {
|
if mode == consts.AnimalPreferMode {
|
||||||
key := int64(context.GetFloat64(consts.ValidatorPrefix + "key"))
|
key := int64(context.GetFloat64(consts.ValidatorPrefix + "key"))
|
||||||
@ -51,7 +51,7 @@ func (a *Animals) List(context *gin.Context) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if redis_selctedCatsId.Length() == skip {
|
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 {
|
if len(preferCats) > 0 {
|
||||||
animalsWithLike = preferCats
|
animalsWithLike = preferCats
|
||||||
}
|
}
|
||||||
|
59
app/model_redis/base_model.go
Normal file
59
app/model_redis/base_model.go
Normal file
@ -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
|
||||||
|
}
|
||||||
|
}
|
@ -1,19 +1,19 @@
|
|||||||
package model_redis
|
package model_redis
|
||||||
|
|
||||||
import (
|
|
||||||
"catface/app/global/variable"
|
|
||||||
"catface/app/utils/redis_factory"
|
|
||||||
"encoding/json"
|
|
||||||
)
|
|
||||||
|
|
||||||
// INFO 辅助 animal - list - prefer 模式下的查询特化。
|
// INFO 辅助 animal - list - prefer 模式下的查询特化。
|
||||||
|
|
||||||
type SelectedAnimal4Prefer struct {
|
func CreateSelectedAnimal4Prefer() *SelectedAnimal4Prefer { // 构造函数的必要性,这样才能调用【父类】的方法。
|
||||||
EncounteredCatsId []int64 `json:"encountered_cats_id"` // #1 对应第一阶段:近期路遇关联
|
return &SelectedAnimal4Prefer{
|
||||||
NewCatsId []int64 `json:"new_cats_id"` // #2 对应第二阶段:近期新增
|
BaseModel: NewBaseModel(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
key int64 `json:"-"` // redis 的 key 值
|
type SelectedAnimal4Prefer struct {
|
||||||
notPassNewCat bool `json:"-"`
|
*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 {
|
func (s *SelectedAnimal4Prefer) NotPassNew() bool {
|
||||||
@ -39,38 +39,22 @@ func (s *SelectedAnimal4Prefer) AppendEncIds(ids []int64) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// BASE CURD
|
// 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
|
s.notPassNewCat = true
|
||||||
return s.key
|
return s.BaseModel.GenerateKey()
|
||||||
}
|
|
||||||
|
|
||||||
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
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 调用 BaseModel 的 SetDataByKey 方法
|
||||||
func (s *SelectedAnimal4Prefer) SetDataByKey() (bool, error) {
|
func (s *SelectedAnimal4Prefer) SetDataByKey() (bool, error) {
|
||||||
redisClient := redis_factory.GetOneRedisClient()
|
return s.BaseModel.SetDataByKey(s)
|
||||||
defer redisClient.ReleaseOneRedisClient()
|
}
|
||||||
|
|
||||||
data, _ := json.Marshal(s)
|
// 调用 BaseModel 的 GetDataByKey 方法
|
||||||
if _, err := redisClient.Execute("set", s.key, data); err == nil {
|
func (s *SelectedAnimal4Prefer) GetDataByKey(key int64) (bool, error) {
|
||||||
return true, nil
|
return s.BaseModel.GetDataByKey(key, s)
|
||||||
} else {
|
|
||||||
return false, err
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user