因为众所周知的缘由, 邪恶的企业优酷于九月的某一天开始禁止第三方播放器加载视频API, 我不得不设置一个反向代理来绕过Flash 的跨域限制. 自此服务器压力激增, 致使用户体验大为劣化. 为了减小服务器压力我费尽心思, 从原先的Apache2 + php 切换到nginx + php-fpm, 再到如今的nginx + nodejs, 充分利用了服务器有限的内存空间, 使并发性能得以不断优化, 每次播放的请求时间由原来的10s 缩短到 1~4s.php
但这也到头了, 非缓存型反向代理受限于网络链接速率, 若是反向代理服务器与优酷服务器之间的传输速率不能有所突破, 很难把请求时间继续缩短. 若是要追求更高的性能, 把请求时间缩短到1s 之内, 必须在反向代理服务器上部署缓存数据库.node
因而我开始寻找一个适合作缓存的数据库, 根据服务器资源和应用场景, 对缓存数据库提出以下需求:数据库
根据这些需求, 我最后选择了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
|
而后对反向代理的代码稍做改动, 就完成了缓存部署.bash
到如今为止, 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
|