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



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

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

在连接时,节点检查用户是否具有给定的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 之类的东西。

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

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

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

相关内容

  • 没有找到相关文章

最新更新