如何同时使用redis和sequelize

carvr3hs  于 2021-06-08  发布在  Redis
关注(0)|答案(0)|浏览(346)

我使用redis缓存和续集作为我的orm。我想缓存每个查询作为键,它的结果作为值。让我给你举个例子,说明我是如何做到这一点的
想象一下,用户对自己创建的所有博客的请求,通常我们会这样写

blogs.findAll({where:{author:req.params.id}})

当我想缓存这样的东西时,我添加了一个名为model的属性,对于这个示例,model将等于blog,之后我将字符串化这个对象并将其用作键。这样我可以很容易地创建密钥并检查是否缓存了用户响应,但我不想为每个检查redis和决定是否查询数据库的请求重写代码,我现在有两个模型,所以我编写了这段代码

for (m in models) {
        models[m].myFindAll = function (options = {}) {
            return new Promise(async function (resolve, reject) {
                try {
                    const key = Object.assign({}, options);
                    key.model = m;
                    key.method = "findAll";
                    var result = await redis.get(JSON.stringify(key));
                    if (result) {
                        resolve(JSON.parse(result));
                    }
                    result = await models[m].findAll(options);
                    redis.set(JSON.stringify(key), JSON.stringify(result));
                    resolve(result);
                } catch (err) {
                    reject(err);
                }
            });
        };
    }

如您所见,我有一个对象,它包含我拥有的每个模型,它被命名为models。首先我添加了用户,然后我添加了博客。我的问题是,当我尝试在用户模型上使用myfindall函数时,它不会起作用,因为它试图用变量m的值设置key.model,它将在运行时成为blog,我在向函数传递model name参数时解决了它,但我不希望这样,我认为应该有更好的方法,如果我找不到它,难道没有办法通过这个对象访问正确的模型吗?
另一件事,我试图使用像续集redis缓存库和。。。但我想用我自己的方式,我不想用这个图书馆

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题