我正在使用Node的Express w/ Connect中间件。Connect的内存会话存储不适合生产:
警告: connection.session() MemoryStore不是为生产环境设计的,因为它会泄漏内存,而且显然只能在单个进程中工作。
对于更大的部署,mongo或redis是有意义的。
但是,对于生产中的单主机应用程序,什么是一个好的解决方案?
发布于 2012-10-24 20:48:03
花了一天时间调查这件事。以下是我发现的选项。每秒请求数是通过我的本地计算机上的ab -n 100000 -c 1 http://127.0.0.1:9778/
执行的。
mongodb无会话-快速(438 req/sec)
maxAge
)
clear_interval
下面是我在cookieSession中使用的coffeescript:
server.use express.cookieSession({
secret: appConfig.site.salt
cookie: maxAge: 1000*60*60
})
下面是我在redis中使用的coffeescript:
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:
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将他们的本地数据库基准添加到混合中。
发布于 2013-11-06 04:05:38
因为可接受的答案是只连接到远程主机,所以很明显,它总是比本地主机慢。即使它是你家里的下一台计算机,从那台计算机读取数据也需要几毫秒,但本地内存只需要几纳秒。您应该使用本地安装的服务器对它们进行比较。
这是我在本地pc上的结果:你看,redis在高负载下几乎和内存中一样快。您可以克隆以下测试代码可用的存储库:https://github.com/mustafaakin/express-session-store-benchmark
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]
会话使用的页面是非常简单的页面;
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存储配置:
app.use(express.session({
store: new RedisStore({
host: 'localhost',
port: 6379,
db: 2,
}),
secret: 'hello'
}));
Mongo商店配置:
app.use(express.cookieParser());
app.use(express.session({
store: new MongoStore({
url: 'mongodb://localhost/test-session'
}),
secret: 'hello'
}));
发布于 2012-01-06 22:51:47
另一个很好的选择是memcached。如果重新启动memcached,会话状态就会丢失,但实际上从来没有任何理由这样做。即使在重启应用服务器时,也可以让缓存一直处于运行状态。对会话数据的访问几乎是瞬间的,并且memcached将在您提供的任何(适当)内存量下愉快地运行。我从来没有见过memcached崩溃(在Linux上)。
https://github.com/elbart/node-memcache
关于memcached,一般情况下需要记住的是:
对于会话存储来说,这些都不应该是问题;只是对于通用缓存而言。
https://stackoverflow.com/questions/8749907
复制相似问题