这是我参与「第五届青训营 」伴学笔记创作活动的第 9 天
本文记录golang项目中运用redis的结构和相关知识
redis作为高性能、轻便的key-value数据库,同时具有强大的分布式功能,在抖音极简版项目中对于分布式用户对数据的修改有很大运用空间
连接redis:
import (
"github.com/go-redis/redis/v8"
)
userlist = redis.NewClient(&redis.Options{
Addr: "127.0.0.1:6379",//redis端口
Password: "xxx",
DB: 0,//通过此接口操作的数据存入DB0
})
func main() {
conn, err := redis.Dial("tcp", "127.0.0.1:6379")//一般连接方式
if err != nil {
fmt.Println("connect redis failed,", err)
return
}
defer conn.Close()
}
对于流媒体软件普遍的分布式操作,如点赞、关注、评论,可使用redis来存储喜欢列表、关注列表、评论列表等
例:对于评论列表的构建,可使用key-value对应的string存储评论内容和评论ID,对于评论与视频的一对多关系,使用set存储视频IP和评论IP列表,对于golang使用redis的查询,和orm类似,可先在redis数据库中对相应数据类型先存储一个值,如-1,防止第一次读取到脏值,而后根据评论信息对评论内容进行拼接
var commentInfo Comment
commentInfo.VideoId = comment.VideoId //评论视频id传入
commentInfo.UserId = comment.UserId //评论用户id传入
commentInfo.CommentText = comment.CommentText //评论内容传入
commentInfo.Cancel = config.ValidComment //评论状态,0,有效
commentInfo.CreateDate = comment.CreateDate //评论时间
在查询评论列表信息时,先查询评论ID,同时可在评论对应数据库中添加创建时间字段,嵌套查询而方便评论按照时间排序,查询评论完成后,查询对应的用户信息
删除评论时,先查询redis,若有则删除,返回客户端-再go协程删除数据库;无则在数据库中删除,返回客户端。在缓存中有此值,则找出来删除,然后返回,由于多协程会造成数据库读取压力大,因此可使用chan来减少压力。
目前抖音项目中运用redis的结构仍在开发中,目前将高并发和分布式的简单操作交由内存型数据库,同样需要服务器硬件的支撑,项目开发仍在功能和可用性方面进行平衡