(转)用MongoDB 实现优酷API 缓存
由于众所周知的原因, 邪恶的企业优酷于九月的某一天开始禁止第三方播放器加载视频API, 我不得不设置一个反向代理来绕过Flash 的跨域限制. 自此服务器压力激增, 导致用户体验大为劣化. 为了减少服务器压力我费尽心思, 从原先的Apache2 + php 切换到nginx + php-fpm, 再到现在的nginx + nodejs, 充分利用了服务器有限的内存空间, 使并发性能得以不断优化, 每次播放的请求时间由原来的10s 缩短到 1~4s.
但这也到头了, 非缓存型反向代理受限于网络连接速率, 如果反向代理服务器与优酷服务器之间的传输速率不能有所突破, 很难把请求时间继续缩短. 如果要追求更高的性能, 把请求时间缩短到1s 以内, 必须在反向代理服务器上部署缓存数据库.

反向代理服务器的工作原理
于是我开始寻找一个适合做缓存的数据库, 根据服务器资源和应用场景, 对缓存数据库提出如下需求:
- NoSQL;
- 较高的读写速率;
- 过期机制;
- 能在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 缓存的更多相关文章
- 【API】获取优酷视频信息接口
序: 自己的网站中需要接入一个视频模块,虚拟主机的空间小所以只能引用第三方的链接.感觉国内优酷好不错,所以查了一下优酷的接口. 0x00: 先去优酷API开放中心申请一个开 ...
- Jquery Mobile实例--利用优酷JSON接口读取视频数据
本文将介绍,如何利用JqueryMobile调用优酷API JSON接口显示视频数据. (1)注册用户接口. 首页,到 http://open.youku.com 注册一个账户,并通过验证.然后找到A ...
- 优酷视频上传api及demo代码
1,优酷正常上传流程: 1). create:连接开放平台上传接口服务器,服务器端会返回upload_token以及upload_server_uri.2). create_file:连接上传服务器( ...
- 优酷、YouTube、Twitter及JustinTV视频网站架构设计笔记
本文是整理的关于优酷.YouTube.Twitter及JustinTV几个视频网站的架构或笔记,对于不管是视频网站.门户网站或者其它的网站,在架构上都有一定的参考意义,毕竟成功者的背后总有值得学习的地 ...
- 优酷、YouTube、Twitter及JustinTV几个视频网站的架构
优酷视频网站架构 一.网站基本数据概览据2010年统计,优酷网日均独立访问人数(uv)达到了8900万,日均访问量(pv)更是达到了17亿,优酷凭借这一数据成为google榜单中国内视频网站排名最 ...
- 写chrome插件---一个优酷自动加粉丝助手
写chrome插件主要就是写js , 我们要构造界面(HTML), 以及样式(CSS), 以及chrome给我们提供的jsAPI, 主要是chrome的API, 调试的话可以使用chrome的开发者 ...
- php 解析 视频 信息 封面 标题 图片 支持 优酷, 土豆 酷6 56 新浪 qq播客 乐视 乐视
原文地址:http://www.lianyue.org/2013/2497/ <?php /** * 解析 视频信息 类 * * 支持 优酷, 土豆 酷6 56 新浪 qq播客 乐视 乐视 ** ...
- Android-调用优酷SDK上传视频
最近在研究用优酷的SDK来进行视频上传的功能,由于优酷的SDK只是提供了一个上传的sample code,没有涉及到授权的过程,对于新手来说,可能非常棘手,现在分享一下我的思路: 程序实现前我们先 ...
- react-native绑定优酷SDK播放视频-附效果和git源码
ReactNative绑定优酷SDK需要用到两部分知识: 优酷本身的sdk绑定: RN与原生界面的交互: 效果: RN版本:0.49.3 代码更新日期:2017.10.26 下文也根据绑定优酷需要的两 ...
随机推荐
- C语言链队列
链队列类似于单链表,为了限制只能从两端操作数据,其结构体内有2个指针分别指向头尾,但队列里的节点用另一种结构体来表示,头尾指针则为指向该结构体的类型.只能通过操作头尾指针来操作队列. typedef ...
- c语言实验报告(四) 从键盘输入字符串a和字符串b,并在a串中的最小元素(不含结束符)后面插入字符串b.
a串中最小元素后的字符被舍弃了. #include<stdio.h>#include<string.h>void main(){ int i,min=0; char a[2 ...
- 论 Python Opencv 中文路径及中文文件名图像文件读取的两种方式
python 2中对于中文字符的处理可谓是诟病已久,虽然python 3 使用统一编码解决了中文字符串的问题,但在使用opencv中imread函数读取中文路径图像文件时仍会报错. 1) 借助nump ...
- 20155305乔磊2016-2017-2《Java程序设计》第四周学习总结
20155305乔磊2016-2017-2<Java程序设计>第四周学习总结 教材学习内容总结 继承 继承就是避免多个类间重复定义共同行为. 面向对象中,子类继承父类,就是把程序中相同的代 ...
- 回顾RAC安装过程中对ASM的处理
1 首先建立好节点间共享的磁盘,要注意从各节点看到的磁盘的序号.名称一致. 2 通过某一个节点,对共享磁盘进行格式化. 3 在Grid Infrastructure 中, 有一个为OCR选择存储介质的 ...
- [NOIp2018]铺设道路 贪心
LG传送门 考场上写的\(O(nlogn)\)做法,具体思想是把深度从低到高排个序,开一个标记数组,每次加入的时候标记当前位置并判断:如果当前加入的位置两边都被标记过,则下次的贡献-1,若两边都没有被 ...
- kettle 将job等导入导出成xml
一.导出 工具->资源库->探索资源库 就可以看见资源库里面的资源了. 如果要导出资源库里面的某个目录就右键就行了. 如果要导出全部资源库的文件就如下图所示 将资源库导出其实也是一个xml ...
- 如何运用 Powershell 修改Office365和AD账户
这段时间需要大量地修改AD用户的一些属性,例如邮件,UPN,登录名等等,以便和Office365的登录账号保持一致.写了个简单脚本进行批量修改. #Import AD ModuleImport-Mod ...
- 用MYSQLworkbench导出数据excel
步骤: 1.先从数据库中将表导出,右键需要导出的表格——>Table Data Export Wizard 2.点击Next,选择你需要把数据存放的文件路径.导出的数据格式(表格的话就默认选择C ...
- Qt-QML-电子罗盘
使用QML中的Canvas实现电子罗盘绘制,效果图如下 一个简单的电子罗盘,红色N极.其中中间飞机表示当前的指向, 还是比较简单的,直接上代码吧 /* 作者:张建伟 时间:2018年4月27日 简述: ...