第四课 实战go语言改造php仿优酷-Redis改造优化接口
tags:
- Beego
- 慕课网
categories:
- redis
文章目录
第一节 Go操作Redis
- 安装Go redis的操作包
- 链接Redis 封装Redis命令
package redisClient
import (
"time"
"github.com/garyburd/redigo/redis"
)
// 直接连接 项目中不会用 因为频繁的连接断开会造成网络的压力
func Connect() redis.Conn {
pool, _ := redis.Dial("tcp", "192.168.242.142:6379")
return pool
}
// 连接池连接
func PoolConnect() redis.Conn {
// 设置密码
setPasswd := redis.DialPassword("123456")
pool := &redis.Pool{
MaxIdle: 1, //最大空闲连接数
MaxActive: 10, // 最大连接数
IdleTimeout: 180 * time.Second, // 空闲连接超时时间
Wait: true, // 超过最大连接数设置等待
Dial: func() (redis.Conn, error) {
c, err := redis.Dial("tcp", "192.168.242.142:6379", setPasswd)
if err != nil {
return nil, err
}
return c, nil
},
}
return pool.Get()
}
- 调用一下
package controllers
import (
redisClient "demo/service/redis"
"fmt"
"github.com/astaxie/beego"
"github.com/garyburd/redigo/redis"
)
type RedisDemoController struct {
beego.Controller
}
// @router /redis/demo [*]
func (this *RedisDemoController) Demo() {
c := redisClient.PoolConnect()
defer c.Close()
_, err := c.Do("SET", "username", "frog")
if err == nil {
//设置过期时间
c.Do("expire", "username", 1000)
}
r, err := redis.String(c.Do("get", "username"))
if err == nil {
fmt.Println(1)
fmt.Println(r)
//获取剩余过期时间
ttl, _ := redis.Int64(c.Do("ttl", "username"))
fmt.Println(ttl)
} else {
fmt.Println(2)
fmt.Println(err)
}
this.Ctx.WriteString("hello")
}
第二节 Redis改造具体内容
-
视频播放页中获取视频的详情信息和剧集接口可以通过redis来改造。
- 用list列表改造
- 剧集有顺序
- 内容不会太多 不会超过1k
- 减少数据库的压力

-
评论列表中用户相关的内容可以通过redis来改造。

-
改造排行榜的功能
- 用zset
- 不能重复
- 需要有分数排序

第三节 Redis改造视频详情
- 访问127.0.0.1:8099/video/info?videold=1
func RedisGetVideoInfo(videoId int) (Video, error) {
var video Video
conn := redisClient.PoolConnect()
defer conn.Close()
//定义redis key
redisKey := "video:id:" + strconv.Itoa(videoId)
//判断redis中是否存在
exists, err := redis.Bool(conn.Do("exists", redisKey))
if exists {
res, _ := redis.Values(conn.Do("hgetall", redisKey))
err = redis.ScanStruct(res, &video)
} else {
o := orm.NewOrm()
err := o.Raw("SELECT * FROM video WHERE id=? LIMIT 1", videoId).QueryRow(&video)
if err == nil {
//保存redis
_, err := conn.Do("hmset", redis.Args{redisKey}.AddFlat(video)...)
if err == nil {
conn.Do("expire", redisKey, 86400)
}
}
}
return video, err
}
第四节 Redis改造评论列表接口
- 把评论信息的关联用户信息保存到redis中fyoukuapi\models\user.go
//增加redis缓存 - 根据用户ID获取用户信息
func RedisGetUserInfo(uid int) (UserInfo, error) {
var user UserInfo
conn := redisClient.PoolConnect()
defer conn.Close()
redisKey := "user:id:" + strconv.Itoa(uid)
//判断redis是否存在
exists, err := redis.Bool(conn.Do("exists", redisKey))
if exists {
res, _ := redis.Values(conn.Do("hgetall", redisKey))
err = redis.ScanStruct(res, &user)
} else {
o := orm.NewOrm()
err := o.Raw("SELECT id,name,add_time,avatar FROM user WHERE id=? LIMIT 1", uid).QueryRow(&user)
if err == nil {
//保存redis
_, err = conn.Do("hmset", redis.Args{redisKey}.AddFlat(user)...)
if err == nil {
conn.Do("expire", redisKey, 86400)
}
}
}
return user, err
}
第五节 Redis改造视频剧集列表
- 视频剧集列表fyoukuapi\models\video.go
//增加redis缓存 - 获取视频剧集列表
func RedisGetVideoEpisodesList(videoId int) (int64, []Episodes, error) {
var (
episodes []Episodes
num int64
err error
)
conn := redisClient.PoolConnect()
defer conn.Close()
redisKey := "video:episodes:videoId:" + strconv.Itoa(videoId)
//判断rediskey是否已存在
exists, err := redis.Bool(conn.Do("exists", redisKey))
if exists {
num, err = redis.Int64(conn.Do("llen", redisKey))
if err == nil {
values, _ := redis.Values(conn.Do("lrange", redisKey, "0", "-1"))
var episodesInfo Episodes
for _, v := range values {
err = json.Unmarshal(v.([]byte), &episodesInfo)
if err == nil {
episodes = append(episodes, episodesInfo)
}
}
}
} else {
o := orm.NewOrm()
num, err = o.Raw("SELECT id,title,add_time,num,play_url,comment,aliyun_video_id FROM video_episodes WHERE video_id=? order by num asc", videoId).QueryRows(&episodes)
if err == nil {
//遍历获取到的信息,把信息json化保存
for _, v := range episodes {
jsonValue, err := json.Marshal(v)
if err == nil {
//保存redis
conn.Do("rpush", redisKey, jsonValue)
}
}
conn.Do("expire", redisKey, 86400)
}
}
return num, episodes, err
}
第六节 Redis改造排行榜的接口
- 频道排行榜和类型排行榜。fyoukuapi\models\video.go
//增加redis缓存 - 频道排行榜
func RedisGetChannelTop(channelId int) (int64, []VideoData, error) {
var (
videos []VideoData
num int64
)
conn := redisClient.PoolConnect()
defer conn.Close()
//定义Rediskey
redisKey := "video:top:channel:channelId:" + strconv.Itoa(channelId)
//判断是否存在
exists, err := redis.Bool(conn.Do("exists", redisKey))
if exists {
num = 0
res, _ := redis.Values(conn.Do("zrevrange", redisKey, "0", "10", "WITHSCORES"))
for k, v := range res {
fmt.Println(string(v.([]byte)))
if k%2 == 0 {
videoId, err := strconv.Atoi(string(v.([]byte)))
videoInfo, err := RedisGetVideoInfo(videoId)
if err == nil {
var videoDataInfo VideoData
videoDataInfo.Id = videoInfo.Id
videoDataInfo.Img = videoInfo.Img
videoDataInfo.Img1 = videoInfo.Img1
videoDataInfo.IsEnd = videoInfo.IsEnd
videoDataInfo.SubTitle = videoInfo.SubTitle
videoDataInfo.Title = videoInfo.Title
videoDataInfo.AddTime = videoInfo.AddTime
videoDataInfo.Comment = videoInfo.Comment
videoDataInfo.EpisodesCount = videoInfo.EpisodesCount
videos = append(videos, videoDataInfo)
num++
}
}
}
} else {
o := orm.NewOrm()
num, err = o.Raw("SELECT id,title,sub_title,img,img1,add_time,episodes_count,is_end FROM video WHERE status=1 AND channel_id=? ORDER BY comment DESC LIMIT 10", channelId).QueryRows(&videos)
if err == nil {
//保存redis
for _, v := range videos {
conn.Do("zadd", redisKey, v.Comment, v.Id)
}
conn.Do("expire", redisKey, 86400*30)
}
}
return num, videos, err
}

被折叠的 条评论
为什么被折叠?



