使用全局变量作为数据库缓存?

问题描述 投票:1回答:1

网站正在使用nodejs + socketio + mysql。 在启动我的应用程序之前创建一个全局对象以存储我在数据库中的所有内容是否正常?像用户的密码哈希值,用于非常快速的身份验证过程,比较给定的令牌+用户ID。

var GS= {
    users: {
        user1: {
            token: "Djaskdjaklsdjklasjd"
        }
        ,
        user555: {
            token: "zxczxczxczxc"
        }
        ,
        user1239: {
            token: "ertertertertertret"
        }
    }
};

在连接时,节点使用gived user_id检查用户。

if (GS.hasOwnPropery("user"+user_id)) {
  //compare gived token GS["user"+user_id].token
} else {
  //go to database to get unknown id and then store it in GS
  GS["user"+user_id] = { token: database_result };
}

而其他一切都是相同的,使用对象属性而不是查询数据库。所以,如果有人去网址/gameinfo/id/1,我只是看看变量GS["game"+url_param] = GS["game"+1] = GS.game1当然,我们不会谈论数据库中的数百万行。最多50-70k 真的不想使用像Redis或Tarantool这样的东西。

javascript node.js database global-variables
1个回答
1
投票

您可以使用全局对象来存储这些信息,但需要考虑以下事项:

  • 如果您的应用程序由多台计算机(实例)运行,则不会在这些对象之间共享此对象。
  • 这导致一些功能缺点,如: 您需要粘性会话以确保来自一个特定客户端的请求始终指向一个特定实例 您无法检查具有存储在另一个实例中的数据的用户的状态... 基本上,任何需要您访问用户会话数据的内容都很难(如果不是不可能的话)
  • 如果您的服务器出现故障,所有会话数据都将丢失
  • 拥有一个大而深的嵌套对象很容易搞砸

如果您确信可以处理这些缺点,或者您在应用程序中不会遇到它们,那么请继续。否则,您应该考虑使用真正的缓存库框架。

© www.soinside.com 2019 - 2024. All rights reserved.