当前位置: 首页 > 面试题库 >

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

梁宪
2023-03-14
问题内容

我正在使用带有连接中间件的Node’s Express。Connect的内存会话存储不适合生产:

Warning: connection.session() MemoryStore is not designed for a

production environment, as it will leak memory, and obviously only work
within a single process.


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

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


问题答案:

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

  • 无会话-快速(438 req / sec)
  • cookieSession:不需要外部服务,对速度的影响不大(311 req / sec)-最快,会话将随着cookie过期(由定制maxAge
  • connect-redis:需要redis服务器,对速度有较大影响(redis2go和redisgreen为4 req / sec)-比mongo快,会话将在一段时间后删除(由定制ttl
  • connect-mongo-需要mongodb服务器,对速度有较大影响(mongohq的速度为2 req / sec)-比redis慢,需要手动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
})

这是我给蒙哥写的咖啡稿:

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数据库将比其本地等效数据库慢。
我只是无法让当地的同类设备正常工作,特别是考虑到与托管远程替代产品相比,我的安装和维护时间远远超过了我愿意投资的时间,我对其他人也是如此,因此为什么这些托管远程替代产品也是如此数据库服务首先存在!



 类似资料:
  • 众所周知,创建NSDate格式器是“昂贵的” 甚至苹果的数据格式指南(2014-02年更新)也指出: 创建日期格式化程序并不是一项廉价的操作。如果您可能经常使用格式化程序,缓存单个实例通常比创建和处理多个实例更有效。一种方法是使用静态变量。 但该文档似乎并不是swift的最新版本,我在最新的NSDateFormatter类参考中也找不到任何关于缓存格式化程序的信息,所以我只能假设swift和obj

  • 问题内容: 我想编写一个执行屏幕操作的Java终端应用程序。有没有好的图书馆可以让您像* nix / C世界中的诅咒一样操纵屏幕? 我正在寻找的最小功能是窗口和用户输入支持。 在功能方面,我想在终端的区域中定期更新一些数据,同时(同时)用户可以在屏幕的其他部分输入命令/文本。 问题答案: 有Charva,它链接到本机代码,但是具有基于Swing的api

  • sessionStorage 会话存储 存储针对QQ帐号隔离 数据存储于内存中,当前游戏结束后被清空 函数 key( index ) 获取对应索引的key 手q 版本7.8.5 参数 参数名 类型 说明 index number 索引值 返回值 类型 说明 string 说明 示例 var stringKey = BK.sessionStorage.key(0); getItem( key )

  • 问题内容: 我想用Spring来实现一个购物车,所以我需要在会话中保存一个对象(该对象具有product,paymentType和deliveryType之类的属性)。我尝试使用bean并将属性“ scope”设置为“ session”来创建它,但是它不起作用,我应该在控制器或类中使用一些其他注释吗?任何示例用法都将非常有帮助:-)预先感谢。 问题答案: 然后 如果它在Web上下文(dispatc

  • 问题内容: 我知道我可以使用localstorage或SQLite,但是我不确定如何准确地做到这一点。 在我的应用程序中,我在登录控制器中获取会话令牌,在该控制器中,我向服务器发出发布请求,并获得会话令牌。 我不确定如何使此令牌在全局范围内可访问。 PS:我是AngularJs的新手。 问题答案: 从服务器获取令牌后,在控制器中 你可以说 然后,当您想获取令牌(例如在另一个控制器中)时,您所要做的

  • 问题内容: 我正在尝试在我的Express应用程序中使用redis进行会话。 我执行以下操作: 稍后,在我的应用程序中,如果执行以下操作: 我得到: 无法读取未定义的属性“ someProperty” 这表明req.session是未定义的 (我可以从config部分的console.log条目中看到) 我肯定有redis运行,并且可以看到我的应用最初连接到它(使用redis-cli监视器) 问题