第四课 实战go语言改造php仿优酷-Redis改造优化接口

第四课 实战go语言改造php仿优酷-Redis改造优化接口

tags:

  • Beego
  • 慕课网

categories:

  • redis

第一节 Go操作Redis

  1. 安装Go redis的操作包
  2. 链接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()
}
  1. 调用一下
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改造具体内容

  1. 视频播放页中获取视频的详情信息和剧集接口可以通过redis来改造。

    • 用list列表改造
    • 剧集有顺序
    • 内容不会太多 不会超过1k
    • 减少数据库的压力
      在这里插入图片描述
  2. 评论列表中用户相关的内容可以通过redis来改造。
    在这里插入图片描述

  3. 改造排行榜的功能

    • 用zset
    • 不能重复
    • 需要有分数排序
      在这里插入图片描述

第三节 Redis改造视频详情

  1. 访问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改造评论列表接口

  1. 把评论信息的关联用户信息保存到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改造视频剧集列表

  1. 视频剧集列表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改造排行榜的接口

  1. 频道排行榜和类型排行榜。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
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值