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

时间:2018-01-01 02:59:56

标签: javascript node.js database global-variables

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

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

/gameinfo/id/1


与其他一切相同,使用对象属性而不是查询数据库。因此,如果有人转到网址GS["game"+url_param] = GS["game"+1] = GS.game1,我只会查看变量The following actions will be performed: - install lambda-term 1.12.0 [required by utop] - install utop 2.0.2 ===== 2 to install ===== Do you want to continue ? [Y/n] y =-=- Gathering sources =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= [lambda-term] Archive in cache [utop] Archive in cache =-=- Processing actions -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= [ERROR] The compilation of lambda-term failed at "jbuilder build -p lambda-term -j 4". #=== ERROR while installing lambda-term.1.12.0 ================================# # opam-version 1.2.2 # os linux # command jbuilder build -p lambda-term -j 4 # path /home/se/.opam/4.05.0/build/lambda-term.1.12.0 # compiler 4.05.0 # exit-code 1 # env-file /home/se/.opam/4.05.0/build/lambda-term.1.12.0/lambda-term-1999-58c514.env # stdout-file /home/se/.opam/4.05.0/build/lambda-term.1.12.0/lambda-term-1999-58c514.out # stderr-file /home/se/.opam/4.05.0/build/lambda-term.1.12.0/lambda-term-1999-58c514.err ### stderr ### # Warning 3: deprecated: module Lwt_sequence # [...] # File "src/lTerm_widget_callbacks.ml", line 48, characters 2-21: # Warning 3: deprecated: module Lwt_sequence # This module is an implementation detail of Lwt. See # https://github.com/ocsigen/lwt/issues/361 # ocamlc src/lTerm_unix.{cmo,cmt} (exit 2) # (cd _build/default && /home/se/.opam/4.05.0/bin/ocamlc.opt -w -40 -safe-string -g -bin-annot -I /home/se/.opam/4.05.0/lib/bytes -I /home/se/.opam/4.05.0/lib/camomile -I /home/se/.opam/4.05.0/lib/lwt -I /home/se/.opam/4.05.0/lib/lwt_react -I /home/se/.opam/4.05.0/lib/ocaml -I /home/se/.opam/4.05.0/lib/ocaml/threads -I /home/se/.opam/4.05.0/lib/react -I /home/se/.opam/4.05.0/lib/result -I /home/se/.opam/4.05.0/lib/zed -no-alias-deps -I src -o src/lTerm_unix.cmo -c -impl src/lTerm_unix.ml) # File "src/lTerm_unix.ml", line 342, characters 32-51: # Error: This expression has type bytes but an expression was expected of type # string =-=- Error report -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= The following actions were aborted - install utop 2.0.2 The following actions failed - install lambda-term 1.12.0 No changes have been performed 当然,我们不会谈论数据库中数百万行。最多50-70k。不要真的想使用像Redis或Tarantool这样的东西。

1 个答案:

答案 0 :(得分:1)

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

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

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