javascript—将一致的数据从数据库传递给用户而无需重复查询的正确方法

aor9mmx1  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(327)

数据库存储了一些几乎从不改变的关于用户的数据。好吧,有时信息可能会改变,如果用户想编辑他的名字,例如。
数据信息是关于每个用户的名字,用户名和他的公司数据。
前两个一直显示在他的导航栏上 ejs ,就像 User_1 is logged in ,他需要创建发票时的公司配置文件数据。
我目前的方法是使用中间件获取用户数据 router.use 因此,提取的信息始终可通过所有路线/视图获得,例如:

router.use(function(req, res ,next) { // this block of code is called as middleware in every route

    req.getConnection(function(err,conn){      
      uid = req.user.id;

       if(err){
          console.log(err);
          return next("Mysql error, check your query");
        }

        var query = conn.query('SELECT * FROM user_profile WHERE uid = ? ', uid, function(err,rows){

          if(err){
              console.log(err);
              return next(err, uid, "Mysql error, check your query");
          }

          var userData = rows;

          return next();
       });
    });
})

.
我知道这不是将用户配置文件数据传递给每个路由/视图的最佳方式,因为它在用户每次浏览应用程序时都会进行新的db查询。
如果不在每个路由中重复相同的查询,而是在用户更改部分数据(如其全名)后重新获取这些数据,那么有什么更好的方法使这些数据可用?

m1m5dgzv

m1m5dgzv1#

你刚刚跌入“缓存”的世界,欢迎!缓存对于这样的用例和其他许多用例来说都是一种非常流行的选择。缓存本质上是存储数据的地方,您可以比执行完整的数据库查询或读取文件等更快地获取数据。
在我们进一步讨论之前,值得考虑您的用例。如果您只为少数用户提供服务,并且服务负载较低,那么缓存可能过于工程化,实际上发出db请求可能是最简单的方法。随着事情的发展,添加缓存会给代码增加很多复杂性,这不足以吓唬到您,但足以导致难以跟踪的bug。因此,请考虑一下您的服务负载,如果它不是很高(比如说,您工作的某个地方的内部应用程序可能每隔几分钟只处理几个请求),那么仅仅从db读取数据可能不会太慢请求。在这种情况下,从db读取数据是最简单的,也可能是最好的解决方案。但是,如果您注意到这个db请求减慢了应用程序的请求速度或使其更难扩展,那么缓存可能适合您。
一个非常流行的方法是获得类似“redis”的东西,它是一个保存内存(ram)中所有内容的键值数据库。redis可以像mysql一样作为一种服务,并且有一种非常基本的查询语言。它的速度快得让人目瞪口呆,而且可以扩展到巨大的负载。如果您使用的是express,那么有许多npm模块可以帮助您访问redis示例。只需输入您的凭证,然后就可以发出get和set请求(获取数据或设置数据)。
在您的示例中,您可能希望根据redis中的用户id或用户名以json格式存储用户配置文件。然后,创建一个名为 getUserProfile 其中包含id或用户名。这样就可以在redis中查找,如果找到了记录,就可以将其返回到主控制器逻辑。如果没有,它可以在mysql数据库中查找,保存在redis中,然后返回到控制器逻辑(这样下次就可以从缓存中获取)。
你的下一个问题是众所周知的一个非常讨厌的问题,在计算机科学。它是“缓存失效”,在这种情况下,如果您的用户配置文件更新,您想“失效”您的缓存。一种方法是在用户更新其配置文件(或保存的任何其他数据)时更新缓存的版本。或者,您也可以从redis中删除缓存的版本,然后在下次从redis请求时删除 getUserProfile ,它将从db fresh中取出,然后放入redis中供下次使用。
有许多其他的方法来解决这个问题,但是这很可能以最简单的方式解决您的问题,而不需要太多的开销。将来也很容易扩展!

相关问题