Files
zt-closet-backend/internal/redisdao/collect.go
T
2026-09-11 01:41:52 +08:00

80 lines
2.4 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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
}