session - 使用非连接默认 session 存储有什么好处?

标签 session node.js redis express

对于快速应用程序,我看到有一个 connect-mongodb 和 connect-redis 中间件用于存储 session ,但我不明白为什么有必要 - 默认的内存中 session 存储有什么问题?它适用于需要跨多台机器同步 session 的大型应用程序吗?

此外,任何人都可以提供最快 session 存储的任何基准/技巧吗?我猜是 Redis,因为它的键/值存储更简单。

最佳答案

将 session 数据存储在数据库(MongoDB、Redis 等)中的唯一原因是它可以跨 Node 进程使用并且在发生故障时保持持久。在横向扩展架构中,非常希望拥有无状态服务器,这样无论特定用户连接到哪个服务器,一切都能正常运行,并且服务器可以在不丢失任何状态的情况下启动和关闭。

换句话说,假设您有 10 台服务器在处理传入请求的负载均衡器后面。用户 1 发出服务器 A 处理并登录的请求。您需要存储他们已登录的事实,以便将其存储在 session 中。下一个请求最终被路由到服务器 C,因为服务器 A 正忙于处理另一个请求。为了让服务器 C 知道用户已经登录,它需要 session 数据。那么它如何访问服务器 A 存储的 session 数据呢?

一种方法是将数据存储在客户端的 cookie 中,该 cookie 随每个请求一起提交,但这不是很安全。另一种方法是尝试跨 Node 服务器同步状态,这可以做到,但往往成本高昂且容易出错。最简单的方法是将 session ID 存储在 cookie 中,然后将实际的 session 数据存储在数据库中。然后每个 Node 服务器都可以访问同一个数据库,因此它们可以查找 session 数据。通过这种方式,您可以轻松地扩展和扩展 Node 服务器,并在服务器发生故障时对其进行负载平衡,而不会丢失任何数据。

在性能方面,内存存储将是最快的(但有上述缺点)。 Redis 将是下一个最快的,而 MongoDB 将是最慢的(通常比 Redis 慢 4 倍左右)。请记住,对于绝大多数网站来说,两者都足够快。

关于session - 使用非连接默认 session 存储有什么好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10467458/

相关文章:

python - 获取带分数的zrange

java - 转换为父对象会更改对象引用?

security - session ID 轮换是否可以增强安全性?

node.js - 如何使用node.js从数组中获取值?

python - 在 Python 中使用 requests.Session() 作为上下文管理器来处理可变数量的连续请求

javascript - timer._repeat 不是函数?

node.js - 找不到 nodemon 命令

redis - 如何清理redis中不活跃的玩家?

php - 为什么MySQL中这条记录会重复?

php - 授权用户上传