由于众所周知的原因, 邪恶的企业优酷于九月的某一天开始禁止第三方播放器加载视频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. 20155216 2016-2017-2 《Java程序设计》第四周学习总结

    教材学习内容总结 理解封装.继承.多态的关系 封装:使用类方法或函数将程序进行封装,并定义其内部的成员以及数据. 继承:子类继承父类,避免重复的行为定义. 多态:子类只能继承一个父类,即其中存在is- ...

  2. day1 HTML - <head>

    1.html是什么? 超文本标记语言(Hypertext Markup Language,HTML) <!DOCTYPE html> <html lang="en" ...

  3. Spring学习(十二)-----Spring @PostConstruct和@PreDestroy实例

    实现 初始化方法和销毁方法3种方式: 实现标识接口 InitializingBean,DisposableBean(不推荐使用,耦合性太高) 设置bean属性 Init-method destroy- ...

  4. MES与ERP的区别(转)

    MES和ERP有很大的不同,主要体现在以下几个方面: 1.管理的目标不同 ERP的重点在于财务,也就是从财务的角度出发来对企业的资源进行计划,相关的模块也是以财务为核心的展开,最终的管理数据也是集中到 ...

  5. 第五章Web应用与应用层协议

    Web应用与应用层协议 本篇博文中的主要参考文献是<计算机网络高级教程>,分别是吴功宜老先生和吴英教授合著.这部教程是我研究生老师所推荐的网络必读科目,由于该教程讲解的基础知识详细,但内容 ...

  6. 第六篇 native 版本的Postman如何通过代理服务器录制Web及手机APP请求

    第四篇主要介绍了chrome app版本的postman如何安装及如何录制Web脚本,比较简单. 但是chrome app 版本和native 版本相比,对应chrome app 版本官方已经放弃支持 ...

  7. NO.07--我跟“ 币乎 ”的那些事

    文章开头给大家安利一款app吧,就是我标题提到的,‘币乎’,一个近似于虚拟货币的论坛吧,大家可以下载试试,发文章点赞赚钱,... 好了,开始说一说今天的正题吧: 这些事情说起来其实挺惭愧的,但也不是什 ...

  8. Hbase 教程-安装

    HBase安装 安装前设置 安装Hadoop在Linux环境下之前,需要建立和使用Linux SSH(安全Shell).按照下面设立Linux环境提供的步骤. 创建一个用户 首先,建议从Unix创建一 ...

  9. win2003系统网络安装——基于linux+pxe+dhcp+tftp+samba+ris

    原文发表于:2010-09-16 转载至cu于:2012-07-21 一.原理简介 PXE(preboot execute environment)工作于Client/Server的网络模式,支持工作 ...

  10. scrapy+selenium+chromedriver解析动态渲染页面

    背景:动态页面是页面是通过js代码渲染出来的,无法直接使用scrapy爬虫,这是就需要先把js代码转为静态的html,再用scrapy爬虫就可以解决 解决办法:增加SeleniumMiddleware ...