由于众所周知的原因, 邪恶的企业优酷于九月的某一天开始禁止第三方播放器加载视频API, 我不得不设置一个反向代理来绕过Flash 的跨域限制. 自此服务器压力激增, 导致用户体验大为劣化. 为了减少服务器压力我费尽心思, 从原先的Apache2 + php 切换到nginx + php-fpm, 再到现在的nginx + nodejs, 充分利用了服务器有限的内存空间, 使并发性能得以不断优化, 每次播放的请求时间由原来的10s 缩短到 1~4s.

但这也到头了, 非缓存型反向代理受限于网络连接速率, 如果反向代理服务器与优酷服务器之间的传输速率不能有所突破, 很难把请求时间继续缩短. 如果要追求更高的性能, 把请求时间缩短到1s 以内, 必须在反向代理服务器上部署缓存数据库.

反向代理服务器的工作原理

于是我开始寻找一个适合做缓存的数据库, 根据服务器资源和应用场景, 对缓存数据库提出如下需求:

  1. NoSQL;
  2. 较高的读写速率;
  3. 过期机制;
  4. 能在512MB 内存的VPS 上工作.

根据这些需求, 我最后选择了MongoDB.

安装好MongoDB 后, 建立一个存放缓存的collection, 大小为150MB, TTL 为1 小时:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
db.createCollection('youkuApiCache',{size:150*1024*1024})
//缓存大小150MB
db.youkuApiCache.ensureIndex({
        retrievedAt:1
    }, {
        expireAfterSeconds: 60*60
    })
//retrievedAt 字段存放更新时间, 每条记录缓存1 小时
db.youkuApiCache.getIndexes() //看一下建好的索引
[
        {
                "v" : 1,
                "key" : {
                        "_id" : 1
                },
                "ns" : "test.youkuApiCache",
                "name" : "_id_"
        },
        {
                "v" : 1,
                "key" : {
                        "retrievedAt" : 1
                },
                "ns" : "test.youkuApiCache",
                "name" : "retrievedAt_1",
                "expireAfterSeconds" : 3600
        }
]
db.youkuApiCache.insert({
        _id: 'test',
        retrievedAt: new Date()
    }) //插入一条记录, 更新时间为当前时间
db.youkuApiCache.count() //现在youkuApiCache 中有1 条记录
1
db.youkuApiCache.count() //一小时后youkuApiCache 中有0 条记录
0

然后对反向代理的代码稍作改动, 就完成了缓存部署.

到现在为止, youkuApiCache 缓存了15,000 多条记录, 用掉100MB 空间, 性能得到了很大提高.

1
2
3
4
5
6
7
8
9
10
11
12
time wget "http://v.opengg.me/player/getPlayList/VideoIDS/XMTIwNDk2MTA0
/timezone/+08/version/5/source/video&password=" -O /dev/null -q
//第一次请求(Uncached request)
real    0m0.374s
user    0m0.000s
sys     0m0.004s
time wget "http://v.opengg.me/player/getPlayList/VideoIDS/XMTIwNDk2MTA0
/timezone/+08/version/5/source/video&password=" -O /dev/null -q
//第二次请求(Cached request)
real    0m0.007s
user    0m0.004s
sys     0m0.000s

(转)用MongoDB 实现优酷API 缓存的更多相关文章

  1. 【API】获取优酷视频信息接口

    序:        自己的网站中需要接入一个视频模块,虚拟主机的空间小所以只能引用第三方的链接.感觉国内优酷好不错,所以查了一下优酷的接口. 0x00:        先去优酷API开放中心申请一个开 ...

  2. Jquery Mobile实例--利用优酷JSON接口读取视频数据

    本文将介绍,如何利用JqueryMobile调用优酷API JSON接口显示视频数据. (1)注册用户接口. 首页,到 http://open.youku.com 注册一个账户,并通过验证.然后找到A ...

  3. 优酷视频上传api及demo代码

    1,优酷正常上传流程: 1). create:连接开放平台上传接口服务器,服务器端会返回upload_token以及upload_server_uri.2). create_file:连接上传服务器( ...

  4. 优酷、YouTube、Twitter及JustinTV视频网站架构设计笔记

    本文是整理的关于优酷.YouTube.Twitter及JustinTV几个视频网站的架构或笔记,对于不管是视频网站.门户网站或者其它的网站,在架构上都有一定的参考意义,毕竟成功者的背后总有值得学习的地 ...

  5. 优酷、YouTube、Twitter及JustinTV几个视频网站的架构

      优酷视频网站架构 一.网站基本数据概览据2010年统计,优酷网日均独立访问人数(uv)达到了8900万,日均访问量(pv)更是达到了17亿,优酷凭借这一数据成为google榜单中国内视频网站排名最 ...

  6. 写chrome插件---一个优酷自动加粉丝助手

    写chrome插件主要就是写js , 我们要构造界面(HTML), 以及样式(CSS),  以及chrome给我们提供的jsAPI, 主要是chrome的API, 调试的话可以使用chrome的开发者 ...

  7. php 解析 视频 信息 封面 标题 图片 支持 优酷, 土豆 酷6 56 新浪 qq播客 乐视 乐视

    原文地址:http://www.lianyue.org/2013/2497/ <?php /** * 解析 视频信息 类 * * 支持 优酷, 土豆 酷6 56 新浪 qq播客 乐视 乐视 ** ...

  8. Android-调用优酷SDK上传视频

    最近在研究用优酷的SDK来进行视频上传的功能,由于优酷的SDK只是提供了一个上传的sample code,没有涉及到授权的过程,对于新手来说,可能非常棘手,现在分享一下我的思路:   程序实现前我们先 ...

  9. react-native绑定优酷SDK播放视频-附效果和git源码

    ReactNative绑定优酷SDK需要用到两部分知识: 优酷本身的sdk绑定: RN与原生界面的交互: 效果: RN版本:0.49.3 代码更新日期:2017.10.26 下文也根据绑定优酷需要的两 ...

随机推荐

  1. pow函数(数学次方)在c语言的用法,两种编写方法实例( 计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值)

    关于c语言里面pow函数,下面借鉴了某位博主的一篇文章: 头文件:#include <math.h> pow() 函数用来求 x 的 y 次幂(次方),x.y及函数值都是double型 , ...

  2. C语言 编程练习22

    一.题目 1.编一个程序,输入x的值,按下列公式计算并输出y值: 2.已知数A与B,由键盘输入AB的值,交换它们的值,并输出. 3.给一个不多于5位的正整数,要求:一.求它是几位数,二.逆序打印出各位 ...

  3. 20155211 《Java程序设计》实验一(Java开发环境的熟悉)实验报告

    20155211 <Java程序设计>实验一(Java开发环境的熟悉)实验报告 一.实验内容及步骤 (一)使用JDK编译.运行简单的java程序 命令行下的程序开发 步骤一(新建文件夹): ...

  4. 20155235 2016-2017-2 《Java程序设计》第9周学习总结

    20155235 2016-2017-2 <Java程序设计>第9周学习总结 教材学习内容总结 第十六章 整合数据库 JDBC入门 JDBC简介 连接数据库 使用Statement.Res ...

  5. 2017-2018-1 20155308《信息安全技术》实验二——Windows口令破解

    2017-2018-1 20155308<信息安全技术>实验二--Windows口令破解 实验原理 口令破解主要有两种方法:字典破解和暴力破解. 字典破解是指通过破解者对管理员的了解,猜测 ...

  6. odoo学习之:在tree view中显示部分数据domain的使用

    只要在window.action中他添加相应东domain即可,如: <!-- 树型列表 --> <record model="ir.actions.act_window& ...

  7. OpenStack入门篇(二)之OpenStack架构

    1.OpenStack 架构 中间菱形是虚拟机,围绕 VM 的那些长方形代表 OpenStack 不同的模块(OpenStack 叫服务,后面都用服务这个术语),下面来分别介绍. Nova:管理 VM ...

  8. Hibernate各种主键生成策略与配置详解(转)

    原文链接:http://www.cnblogs.com/hoobey/p/5508992.html 1.assigned 主键由外部程序负责生成,在 save() 之前必须指定一个.Hibernate ...

  9. Unity标准材质官方教程合集

  10. spring 属性文件加载接口---PropertySourceLoader

    org.springframework.boot.config Interface PropertySourceLoader 实现类: PropertiesPropertySourceLoader, ...