first commit
This commit is contained in:
@@ -0,0 +1,79 @@
|
||||
package redisdao
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"git.lzcwy.cn/zhengchiliu/zt-closet-backend/global"
|
||||
"git.lzcwy.cn/zhengchiliu/zt-closet-backend/internal/redismodel"
|
||||
"github.com/redis/go-redis/v9"
|
||||
)
|
||||
|
||||
// collectSetTTL 收藏集合 key 的过期时间,避免长期驻留导致与 MySQL 弱一致漂移。
|
||||
const collectSetTTL = 7 * 24 * time.Hour
|
||||
|
||||
// CollectAdd 用户收藏(collect_type + target_id 分桶,成员为 user_id)
|
||||
func CollectAdd(ctx context.Context, collectType int8, targetID, userID int64) error {
|
||||
ctx, span := global.Tracer.Start(ctx, "redisdao.CollectAdd")
|
||||
defer span.End()
|
||||
|
||||
key := fmt.Sprintf(redismodel.KeyCollectSet, collectType, targetID)
|
||||
if err := global.RedisEngine.SAdd(ctx, key, userID).Err(); err != nil {
|
||||
span.RecordError(err)
|
||||
return err
|
||||
}
|
||||
// 设置 TTL(best-effort)。
|
||||
_ = global.RedisEngine.Expire(ctx, key, collectSetTTL).Err()
|
||||
return nil
|
||||
}
|
||||
|
||||
// CollectRemove 用户取消收藏
|
||||
func CollectRemove(ctx context.Context, collectType int8, targetID, userID int64) error {
|
||||
ctx, span := global.Tracer.Start(ctx, "redisdao.CollectRemove")
|
||||
defer span.End()
|
||||
|
||||
key := fmt.Sprintf(redismodel.KeyCollectSet, collectType, targetID)
|
||||
if err := global.RedisEngine.SRem(ctx, key, userID).Err(); err != nil {
|
||||
span.RecordError(err)
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// CollectIsMember 判断用户是否已收藏;集合 key 不存在(缓存过期/冷启动)时返回 redis.Nil,
|
||||
// 由调用方回落 MySQL 以区分「未命中」与「确实未收藏」。
|
||||
func CollectIsMember(ctx context.Context, collectType int8, targetID, userID int64) (bool, error) {
|
||||
ctx, span := global.Tracer.Start(ctx, "redisdao.CollectIsMember")
|
||||
defer span.End()
|
||||
|
||||
key := fmt.Sprintf(redismodel.KeyCollectSet, collectType, targetID)
|
||||
exists, err := global.RedisEngine.Exists(ctx, key).Result()
|
||||
if err != nil {
|
||||
span.RecordError(err)
|
||||
return false, err
|
||||
}
|
||||
if exists == 0 {
|
||||
return false, redis.Nil
|
||||
}
|
||||
ok, err := global.RedisEngine.SIsMember(ctx, key, userID).Result()
|
||||
if err != nil {
|
||||
span.RecordError(err)
|
||||
return false, err
|
||||
}
|
||||
return ok, nil
|
||||
}
|
||||
|
||||
// CollectCount 获取收藏总数
|
||||
func CollectCount(ctx context.Context, collectType int8, targetID int64) (int64, error) {
|
||||
ctx, span := global.Tracer.Start(ctx, "redisdao.CollectCount")
|
||||
defer span.End()
|
||||
|
||||
key := fmt.Sprintf(redismodel.KeyCollectSet, collectType, targetID)
|
||||
cnt, err := global.RedisEngine.SCard(ctx, key).Result()
|
||||
if err != nil {
|
||||
span.RecordError(err)
|
||||
return 0, err
|
||||
}
|
||||
return cnt, nil
|
||||
}
|
||||
Reference in New Issue
Block a user