💌 这是我参与「第五届青训营」伴学笔记创作活动的第 15 天。
🧡 大项目开发
点赞
Service
💌 Service 层主要用到了 Redis 缓存及 RabbitMQ 消息队列技术,以当前用户是否点赞当前视频为例,使用两个 Redis 数据库 RdLikeUID 和 RdLikeVID 分别用 Set 集合保存用户点赞的所有视频和点赞视频的所有用户之间的对应关系。如果缓存中没有信息则从数据库更新同步。
// IsLike 当前用户 uid 是否点赞了当前视频 vid
func (like *LikeServiceImpl) IsLike(uid int, vid int) (bool, error) {
// 将 uid 转换为 string 类型
strUID := strconv.FormatInt(int64(uid), 10)
// 将 vid 转换为 string 类型
strVID := strconv.FormatInt(int64(vid), 10)
/*
step1: 查询 RdLikeUID 中是否存在 key:strUID - value:strVID
*/
isExistUID, err := redis.Bool(RdLikeUID.Server.Do("EXISTS", strUID))
if err != nil {
log.Println(err.Error())
return false, errors.New("查询是否存在 strUID 失败")
}
// 存在 strUID
var isExistVID bool
if isExistUID == true {
isExistVID, err := redis.Bool(RdLikeUID.Server.Do("SIsMember", strUID, strVID))
if err != nil {
log.Println(err.Error())
return false, errors.New("查询 strUID 中是否存在 strVID 失败")
}
// strUID 中存在 strVID
if isExistVID == true {
return isExistVID, nil
}
}
/*
step2: RdLikeUID 不存在 strUID 或是 strUID 中不存在 strVID,查询 RdLikeVID
*/
if isExistUID == false || isExistVID == false {
isExistVID, err = redis.Bool(RdLikeVID.Server.Do("EXISTS", strVID))
if err != nil {
log.Println(err.Error())
return false, errors.New("查询是否存在 strVID 失败")
}
// 存在 strVID
if isExistVID == true {
isExistUID, err = redis.Bool(RdLikeVID.Server.Do("SIsMember", strVID, strUID))
if err != nil {
log.Println(err.Error())
return false, errors.New("查询 strVID 中是否存在 strUID 失败")
}
// strVID 中存在 strUID
if isExistUID == true {
return isExistUID, nil
}
}
}
//// 给 strUID 设置有效期一个月
//_, err = RdLikeUID.Server.Do("Expire", strUID, time.Duration(OneMonth)*time.Second)
//if err != nil {
// RdLikeUID.Server.Do("Del", strUID)
// log.Println(err.Error())
// return false, errors.New("strUID 设置有效期失败")
//}
/*
step3: RdLikeUID RdLikeVID 中都没有对应 key-value,通过 uid 查询所有点赞 vid,并维护到 RdLikeUID 中
*/
vidList, err1 := dao.LikeList(uid)
if err1 != nil {
return false, err1
}
// 维护 RdLikeUID,遍历 vidList 加入
for _, likeVID := range vidList {
_, err = RdLikeUID.Server.Do("SAdd", strUID, likeVID)
if err != nil {
RdLikeUID.Server.Do("Del", strUID)
log.Println(err.Error())
return false, errors.New("添加喜欢视频失败")
}
}
// 查询 RdLikeUID strUID 中是否存在 strVID
isExistVID, err = redis.Bool(RdLikeUID.Server.Do("SIsMember", strUID, strVID))
if err != nil {
log.Println(err.Error())
return false, errors.New("查询 strUID 中是否存在 strVID 失败")
}
return isExistVID, nil
}