node.js - 对于 Node/Mongo/NginX 来说,哪一种缓存方法最快或者最轻?

  显示原文与译文双语对照的内容
0 0

我被安排项目进度,客户端就有一个网站,他是估计每天会收到1 2M击中了。 他58M的现有数据库的用户需要获取种子上逐个对注册新商标。 大多数网站的内容提供服务提供了从外部API数据与大部分数据存储在我们Mongo配置文件信息和保存安装程序完成API参数。

Nginx将端口80上和负载平衡到Node群集端口上8000 8010 。

我的问题是我们该怎么做缓存。 我来自LAMP背景所以我既用于编写静态HTML文件与PHP,服务那些最多减小MySQL负荷或使用Memcached这样,如果网站需要更高级别的缓存。 这种设置对我有点外国。

这是最理想至于最小响应时间和CPU加载

1: 页面级缓存与Nginx

参考: http://andytson .com/blog/2010/04/page级别缓存与nginx/

server {
    listen            80;
    servername        mysite.com;
    proxy_set_header  X-Real-IP  $remote_addr;
    proxy_set_header  Host       $host;
    location / {
        proxy_pass    http://localhost:8080/;
        proxy_cache   anonymous;
    }
    # don't cache admin folder, send all requests through the proxy
    location /admin {
        proxy_pass    http://localhost:8080/;
    }
    # handle static files directly. Set their expiry time to max, so they'll
    # always use the browser cache after first request
    location ~* (css|js|png|jpe?g|gif|ico)$ {
        root          /var/www/${host}/http;
        expires       max;
    }
}


2: redis作为缓存桶

hash()函数是 numbers()函数在该页面上: http://jsperf .com/hashing字符串

function hash(str) {
    var res = 0,
        len = str.length;
    for (var i = 0; i < len; i++) {
        res = res * 31 + str.charCodeAt(i);
    }
    return res;
}
var apiUrl = 'https://www.myexternalapi.com/rest/someparam/someotherparam/?auth=3dfssd6s98d7f09s8df98sdef';
var key    = hash(apiUrl).toString(); // 1.8006908172911553e+136
myRedisClient.set(key,theJSONresponse, function(err) {...});


3: 节点写入JSON文件

hash()函数是 numbers()函数在该页面上: http://jsperf .com/hashing字符串

function hash(str) {
    var res = 0,
        len = str.length;
    for (var i = 0; i < len; i++) {
        res = res * 31 + str.charCodeAt(i);
    }
    return res;
}
var fs     = require('fs');
var apiUrl = 'https://www.myexternalapi.com/rest/someparam/someotherparam/?auth=3dfssd6s98d7f09s8df98sdef';
var key    = hash(apiUrl).toString(); // 1.8006908172911553e+136
fs.writeFile('/var/www/_cache/' + key + '.json', theJSONresponse, function(err) {...});


4: varnish在前面

我做过研究,基准测试显示的那些一样。严禁身体的话我离开这个解决方案需要考虑,但我还是打开它进行了非常有意义: http://todsul .com/nginx varnish

时间:原作者:4个回答

0 0

我要做一个组合,并使用Redis缓存会话用户API的调用有一小TTL,并使用Nginx缓存长期RESTless数据和静态资源。 我还没对因为我想到IO的文件系统应该是最慢的,大多数处理器密集型(CPUIntensive) JSON文件列出的选项。

原作者:
0 0
  1. Nginx页级缓存并无缓存静态内容。 但是对于动态内容,这样可不好 例如,如果内容改变后如何使缓存在上游?

  2. redis尤其适合在内存中数据存储区。 但我不想将其用作缓存。 内存容量有限,我得不停地担心内存不足。 是的,你可以设置为过期策略redis中的键。 但那是额外的工作,还不如那孩子死了可缓存提供程序。

选项3 和4 上没有经验。

我很奇怪你这里没有包含memcache作为一个选项。 根据我的经验,这是实体作为缓存提供程序。 一个memcache redis没有的特性是它并不保证密钥不会过期由你指定的过期时间。 这并没给数据存储,但让memcache缓存完美的候选对象: 不需要你担心耗尽内存分配给memcache 。 memcache将删除缓存项的例子( 比较少用),即使这些键的过期时间还不满足。

Nginx memcache模块中提供此生成。 它是结实的。 很多在线的教程你可以搜索。

这张我最喜欢( 见以下链接) 。 缓存失效很简单: 例如,如果页更新主要来自上游的上游,就删除memcache中的应用程序服务器。 作者认为4 倍,响应时间的增加。 认为是一个很好的满足用户的使用情况。

http://www .igvita .com/2008/02/11/nginx和memcached是4 boost/

原作者:
0 0

至于varnish我不想辨认评测的站点上你但我可以告诉你他们是令人发指的错误数字和无关会象真正高流量实现( google varnish优化和请参阅基准测试显示100 200k req/s而不是8k ) 。

已经发布的页面缓存也是一个好选择,每天1 2M击中了你不需要极端性能。 所以跟哪个你能非常轻松地使用。

这两个节点是真的所犯的解决方案是最佳选择。 页面缓存应独立于动态应用程序,来提供可靠性和性能。

此外,最好redis/memcached将帮助你缩放应用程序如果使用它作为对象缓存或缓存常用反序列化数据。

原作者:
...