(转)用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 |
QQ:413708116 仅作技术交流