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

tags:

  • Beego
  • 慕课网

categories:

  • redis

文章目录

  • 第四课 实战go语言改造php仿优酷-Redis改造优化接口
    • 第一节 Go操作Redis
    • 第二节 Redis改造具体内容
    • 第三节 Redis改造视频详情
    • 第四节 Redis改造评论列表接口
    • 第五节 Redis改造视频剧集列表
    • 第六节 Redis改造排行榜的接口

第一节 Go操作Redis

  1. 安装Go redis的操作包
  2. 链接Redis 封装Redis命令
package redisClientimport ("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 controllersimport (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 Videoconn := redisClient.PoolConnect()defer conn.Close()//定义redis keyredisKey := "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 UserInfoconn := 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 []Episodesnum      int64err      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 Episodesfor _, 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 {//保存redisconn.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 []VideoDatanum    int64)conn := redisClient.PoolConnect()defer conn.Close()//定义RediskeyredisKey := "video:top:channel:channelId:" + strconv.Itoa(channelId)//判断是否存在exists, err := redis.Bool(conn.Do("exists", redisKey))if exists {num = 0res, _ := 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 VideoDatavideoDataInfo.Id = videoInfo.IdvideoDataInfo.Img = videoInfo.ImgvideoDataInfo.Img1 = videoInfo.Img1videoDataInfo.IsEnd = videoInfo.IsEndvideoDataInfo.SubTitle = videoInfo.SubTitlevideoDataInfo.Title = videoInfo.TitlevideoDataInfo.AddTime = videoInfo.AddTimevideoDataInfo.Comment = videoInfo.CommentvideoDataInfo.EpisodesCount = videoInfo.EpisodesCountvideos = 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 {//保存redisfor _, v := range videos {conn.Do("zadd", redisKey, v.Comment, v.Id)}conn.Do("expire", redisKey, 86400*30)}}return num, videos, err
}

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

  1. 第五课 实战go语言改造php仿优酷-RabbitMQ改造项目

    第五课 实战go语言改造php仿优酷-RabbitMQ改造项目 tags: Beego 慕课网 categories: RabbitMQ 五种工作模式 文章目录 第五课 实战go语言改造php仿优酷- ...

  2. 第三课 go语言改到php仿优酷-阿里云视频上传功能

    第三课 go语言改到php仿优酷-阿里云视频上传功能 tags: Beego 慕课网 categories: go环境安装 Beego框架 阿里云 视频点播服务 文章目录 第三课 go语言改到php仿 ...

  3. 第二课 Beego仿优酷-go环境安装和Beego框架基础

    第二课 Beego仿优酷-go环境安装和Beego框架基础 tags: Beego 慕课网 categories: go环境安装 Beego框架 文章目录 第二课 Beego仿优酷-go环境安装和Be ...

  4. 优酷IPv6改造纪实:视频行业首家拥抱下一代网络技术

    阿里妹导读:2018年双11前,优酷开启了IPv6的大门.9月份PC端业务开启灰度,迎来首位IPv6 VIP用户后,优酷移动客户端也马不停蹄地加入灰度大军.从0到1,花了几个月:从10到1000,花了 ...

  5. 优酷IPv6改造纪实:视频行业首家拥抱下一代网络技术...

    阿里妹导读:2018年双11前,优酷开启了IPV6的大门.9月份PC端业务开启灰度,迎来首位IPV6 VIP用户后,优酷移动客户端也马不停蹄地加入灰度大军.从0到1,花了几个月:从10到1000,花了 ...

  6. 优酷播放体验优化实战(四)--“三高”音频渲染引擎设计

    一. 背景 随着高清在用户观影过程中的深度普及,人们已经不仅仅满足于视的享受,更需要听的保证.如何稳定保障音质,甚至增加更多的音效玩法需要一套强大的系统将数据传输.音频实时处理技术.音频输出有效地整合 ...

  7. 优酷暗黑模式(四):设计标准化的技术实现

    本文讨论的是如何将 UED 的设计标准化体系在研发侧进行落地,以及我们对"超级 App 实现暗黑模式的最佳实践"这一问题的深度思考. 我们的目的是对 Android 和 iOS 的 ...

  8. C语言找出4个最大和4个最小数,济南大学C语言程序设计教案:C语言实验课程第四课.doc...

    济南大学C语言程序设计教案:C语言实验课程第四课 C语言实验课程第四课 实验一 数组与函数.数组与指针 一.实验目的 1 掌握数组名作为函数参数的含义.使用方法. 2 掌握多维数组作为函数参数的使用方 ...

  9. EDA实验课课程笔记(四)——TCL脚本语言的学习2

    EDA实验课课程笔记(四)--TCL脚本语言的学习2 控制流 if 循环命令 while for foreach break和continue命令 switch source 过程(procedure ...

最新文章

  1. GDAL算法进度条使用说明
  2. 为什么mysql与eclipse_为什么这个SQL在MySQL中而不是通过Eclipse执行?
  3. java.lang.OutOfMemoryError: Java heap space 错误及解决办法
  4. pm2 可视化在线监控平台 介绍 keymetrics
  5. java 继承调用_【JAVA学习】继承中函数调用机制
  6. (4)JavaScript之alert语句
  7. azure夜校培训第6场 3月22日 18:00---MYSQL
  8. MVC Json方法里的一个坑
  9. 矩池云上使用nvidia-smi命令教程
  10. k8s集群的搭建-云服务器
  11. 【Opencv实战】这是我见过的最强大“美颜滤镜”,代码美颜傻瓜式一键操作~(附源码)
  12. 秒杀系统设计与关键技术剖析
  13. Raman光谱——石墨烯表征神器
  14. 【全自动网盘扩容软件使用教程】百度网盘自助无限扩容+自助无限修复软件使用步骤说明
  15. spark学习系列——6 Historyserver配置
  16. iOS设置基于ikev2的协议连接企业虚拟专用网络
  17. 用HTML和JavaScript写的RSA加密小工具
  18. 普罗米修斯Prometheus手记
  19. SEO人员,为什么要做流量过滤,如何操作?
  20. 比周杰伦更受欢迎:黄圣依人气假得过分吹捧得更过分

热门文章

  1. 不想安装软件,.md文件用 chrome 打开
  2. 电商小程序有什么优势?
  3. 在ros使用for auto报错
  4. maven注册本地jar包
  5. 【ShoppingPeeker】-基于Webkit内核的爬虫蜘蛛引擎 ShoppingWebCrawler的姊妹篇-可视化任务Web管理...
  6. 正则表达式(记忆口诀)
  7. 南京工程学院计算机科学与技术专业怎么样,南京工程学院王牌专业
  8. 【二叉树经典习题讲解】
  9. 实现抖音哈哈镜效果---OpenCV-Python开发指南(47)
  10. 基于matlab仿真相控天线阵列在波束成形MIMO-OFDM系统中的使用(附源码)