Javascript 使用全局变量作为数据库缓存?
该站点正在使用nodejs+socketio+mysql。Javascript 使用全局变量作为数据库缓存?,javascript,node.js,database,global-variables,Javascript,Node.js,Database,Global Variables,该站点正在使用nodejs+socketio+mysql。 在启动我的应用程序之前创建一个全局对象来存储数据库中的所有内容是否正常?类似于用户密码哈希的东西对于非常快速的身份验证过程,比较给定的令牌+用户ID var GS= { users: { user1: { token: "Djaskdjaklsdjklasjd" } , user555: { token: "zxczx
在启动我的应用程序之前创建一个全局对象来存储数据库中的所有内容是否正常?类似于用户密码哈希的东西对于非常快速的身份验证过程,比较给定的令牌+用户ID
var GS= {
users: {
user1: {
token: "Djaskdjaklsdjklasjd"
}
,
user555: {
token: "zxczxczxczxc"
}
,
user1239: {
token: "ertertertertertret"
}
}
};
在连接时,使用给定的用户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 };
}
其他一切都是一样的,使用对象属性而不是查询数据库。因此,如果有人转到url
/gameinfo/id/1
,我只需查看变量GS[“game”+url\u param]=GS[“game”+1]=GS.game1
当然,我们不讨论数据库中的数百万行。最多50-70k。
我真的不想使用Redis或Tarantool之类的工具。您可以使用一个全局对象来存储这些信息,但需要考虑:
- 如果应用程序由多台计算机(实例)运行,则这些计算机之间不会共享此对象
- 这会导致一些功能上的缺陷,如:
- 您需要粘性会话来确保来自某个特定客户机的请求始终指向某个特定实例
- 无法检查数据存储在其他实例中的用户的状态
- 基本上,任何需要您访问用户会话数据的事情都很难做到(如果不是不可能的话)
- 如果服务器停机,所有会话数据都将丢失
- 拥有一个大而深的嵌套对象很容易搞乱