这是我参与「第五届青训营 」笔记创作活动的第16天。
引言
在这次青训营的后端专场中,大项目是实现极简版抖音服务端,在使用MySQL数据库做持久化的基础上,增加redis来增强服务端的性能。
设计
在抖音app中,用户可以对视频进行点赞(或取消点赞),点赞操作、查看用户对此视频是否点过赞、查看视频的点赞数量等操作都很频繁。
鉴于上述情况,采用redis中的set数据类型,设计redis中将字符串拼接视频id作为key,value存储对视频点过赞的用户id。当进行点赞(action_type=1),向对应key的value(set数据结构)进行SADD操作,当取消点赞(action_type=2),向对应key的value(set数据结构)进行SREM操作。为保证持久化存储,在redis存储点赞数据的同时,增加插入MySQL的操作。
实现
结合redis
下载go-redis
go get -u github.com/go-redis/redis/v8
初始化redis连接
var RDB *redis.Client
// InitRedis 初始化连接redis
func InitRedis() {
RDB = redis.NewClient(&redis.Options{
Addr: viper.GetString("redis.addr"),
Username: viper.GetString("redis.username"),
Password: viper.GetString("redis.password"),
DB: viper.GetInt("redis.db"),
})
_, err := RDB.Ping(context.TODO()).Result()
if err != nil {
log.Println("error= ", err)
}
}
初始化,从MySQL中获取点赞数据至redis中
// InitFavorite 初始化获取视频的点赞,构成set存于Redis中
func InitFavorite() {
daoHandle := dao.New()
var ctx = context.Background()
favoriteList, err := daoHandle.FavoriteList()
if err != nil {
return
}
for i := 0; i < len(favoriteList); i++ {
//组成键key
err = daoHandle.Rdb.SAdd(ctx, "VideoFavorite:"+strconv.Itoa(int(favoriteList[i].VideoID)), favoriteList[i].UserID).Err()
if err != nil {
log.Println("redis error = ", err)
fmt.Println("存储点赞数据至redis中错误!")
return
}
}
}
点赞操作
//根据action_type 针对redis中数据进行操作
var err error
if params.ActionType == 1 { //点赞
err = svc.dao.Rdb.SAdd(ctx, "VideoFavorite:"+strconv.Itoa(int(params.VideoId)), userId).Err()
} else if params.ActionType == 2 { //取消点赞
err = svc.dao.Rdb.SRem(ctx, "VideoFavorite:"+strconv.Itoa(int(params.VideoId)), userId).Err()
}
//针对数据库操作
err = svc.dao.FavoriteAction(userId, params.VideoId, uint8(params.ActionType))
定时任务
下载cron
go get github.com/robfig/cron/v3@v3.0.0
总结
目前这个我们小组实现的项目还有许多值得改善的地方,如对于关注操作(用户之前的关注),也可采用redis中的set数据结构进行存储,并且可以SINTER命令获取交集,得到共同关注的数据。在之后的学习中,我们小组会继续完善整个项目,共同进步。