首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >对于单主机Node.js生产应用程序来说,什么是一个好的会话存储?

对于单主机Node.js生产应用程序来说,什么是一个好的会话存储?
EN

Stack Overflow用户
提问于 2012-01-06 05:14:41
回答 8查看 49.4K关注 0票数 72

我正在使用Node的Express w/ Connect中间件。Connect的内存会话存储不适合生产:

警告: connection.session() MemoryStore不是为生产环境设计的,因为它会泄漏内存,而且显然只能在单个进程中工作。

对于更大的部署,mongo或redis是有意义的。

但是,对于生产中的单主机应用程序,什么是一个好的解决方案?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2012-10-24 20:48:03

花了一天时间调查这件事。以下是我发现的选项。每秒请求数是通过我的本地计算机上的ab -n 100000 -c 1 http://127.0.0.1:9778/执行的。

mongodb无会话-快速(438 req/sec)

  • cookieSession:不需要外部服务,对速度的影响较小(311请求/秒)-最快,会话将与cookie一起过期(由maxAge)

  • connect-redis:定制需要redis服务器,大的速度影响(使用redis2go和redisgreen时为4请求/秒)-比快,会话将在一段时间后被删除)(由mongodb定制-需要mongodb服务器,大的速度影响(使用mongohq的2请求/秒)-比redis慢,需要将手动会话设置为cleanup clear_interval

下面是我在cookieSession中使用的coffeescript:

代码语言:javascript
复制
server.use express.cookieSession({
    secret: appConfig.site.salt
    cookie: maxAge: 1000*60*60
})

下面是我在redis中使用的coffeescript:

代码语言:javascript
复制
RedisSessionStore ?= require('connect-redis')(express)
redisSessionStore ?= new RedisSessionStore(
    host: appConfig.databaseRedis.host
    port: appConfig.databaseRedis.port
    db: appConfig.databaseRedis.username
    pass: appConfig.databaseRedis.password
    no_ready_check: true
    ttl: 60*60  # hour
)
server.use express.session({
    secret: appConfig.site.salt
    cookie: maxAge: 1000*60*60
    store: redisSessionStore
})

以下是我为mongo编写的coffeescript:

代码语言:javascript
复制
server.use express.session({
    secret: appConfig.site.salt
    cookie:
        maxAge: 100*60*60
    store: new MongoSessionStore({
        db: appConfig.database.name
        host: appConfig.database.host
        port: appConfig.database.port
        username: appConfig.database.username
        password: appConfig.database.password
        auto_reconnect: appConfig.database.serverOptions.auto_reconnect
        clear_interval: 60*60  # hour
    })
})

当然,现在远程redis和mongo数据库将比本地数据库慢。我只是不能让本地等效物工作,特别是考虑到与托管远程替代方案相比,我的安装和维护时间远远超过我愿意投资的时间,我觉得其他人也是如此,所以为什么这些托管远程数据库服务一开始就存在!

有关本地数据库的benhmarks,请参阅@Mustafa's answer

很高兴有人edit this answer将他们的本地数据库基准添加到混合中。

票数 87
EN

Stack Overflow用户

发布于 2013-11-06 04:05:38

因为可接受的答案是只连接到远程主机,所以很明显,它总是比本地主机慢。即使它是你家里的下一台计算机,从那台计算机读取数据也需要几毫秒,但本地内存只需要几纳秒。您应该使用本地安装的服务器对它们进行比较。

这是我在本地pc上的结果:你看,redis在高负载下几乎和内存中一样快。您可以克隆以下测试代码可用的存储库:https://github.com/mustafaakin/express-session-store-benchmark

代码语言:javascript
复制
Concurrency: 1
none       4484.86 [#/sec] 
memory     2144.15 [#/sec] 
redis      1891.96 [#/sec] 
mongo      710.85 [#/sec] 
Concurrency: 10
none       5737.21 [#/sec] 
memory     3336.45 [#/sec] 
redis      3164.84 [#/sec] 
mongo      1783.65 [#/sec] 
Concurrency: 100
none       5500.41 [#/sec] 
memory     3274.33 [#/sec] 
redis      3269.49 [#/sec] 
mongo      2416.72 [#/sec] 
Concurrency: 500
none       5008.14 [#/sec] 
memory     3137.93 [#/sec] 
redis      3122.37 [#/sec] 
mongo      2258.21 [#/sec] 

会话使用的页面是非常简单的页面;

代码语言:javascript
复制
app.get("/", function(req,res){
    if ( req.session && req.session.no){
        req.session.no = req.session.no + 1;
    } else {
        req.session.no = 1;
    }
    res.send("No: " + req.session.no);
});

Redis存储配置:

代码语言:javascript
复制
app.use(express.session({
    store: new RedisStore({
        host: 'localhost',
        port: 6379,
        db: 2,
        }),
    secret: 'hello'
}));

Mongo商店配置:

代码语言:javascript
复制
app.use(express.cookieParser());
app.use(express.session({
    store: new MongoStore({
        url: 'mongodb://localhost/test-session'
    }),
    secret: 'hello'
}));
票数 77
EN

Stack Overflow用户

发布于 2012-01-06 22:51:47

另一个很好的选择是memcached。如果重新启动memcached,会话状态就会丢失,但实际上从来没有任何理由这样做。即使在重启应用服务器时,也可以让缓存一直处于运行状态。对会话数据的访问几乎是瞬间的,并且memcached将在您提供的任何(适当)内存量下愉快地运行。我从来没有见过memcached崩溃(在Linux上)。

https://github.com/elbart/node-memcache

关于memcached,一般情况下需要记住的是:

  • 永远不会在缓存键中包含空格
  • 请注意,缓存键长度有一个最大值,包括可能使用的任何名称空间前缀。如果您的缓存键太长,请使用它的单向散列。

对于会话存储来说,这些都不应该是问题;只是对于通用缓存而言。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8749907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档