• (转)用MongoDB 实现优酷API 缓存


          由于众所周知的原因, 邪恶的企业优酷于九月的某一天开始禁止第三方播放器加载视频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
  • 相关阅读:
    Chapter 7 Integrity(完整性), Views(视图), Security(安全性), and Catalogs(目录)
    Qt计时器
    linux命令:linux文件处理命令
    JSON.stringify()的不常见用法
    flex知识点归纳
    css伪类
    开发资源汇总
    Math.cbrt() Math.sqrt() Math.pow()
    代码开发注意事项和规范
    关于数组数据容易忽略的点
  • 原文地址:https://www.cnblogs.com/ywcz060/p/3578018.html
Copyright © 2020-2023  润新知