首页 > 解决方案 > 如何同时使用redis和sequelize

问题描述

我使用redis作为我的orm进行缓存和续集。我想将每个查询缓存为键,并将结果作为值。
让我举一个例子说明我是如何尝试的

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

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

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);
                }
            });
        };
    }

如您所见,我有一个包含我拥有的每个模型的对象,它被命名为模型。首先我添加了用户,然后我添加了博客。我的问题是,当我尝试在用户模型上使用 myFindAll 函数时它不起作用,因为它尝试使用变量 m 的值设置 key.model ,这将是运行时的博客,我在传递模型名称时解决了它我的函数的一个参数,但我不希望那样,我认为应该有更好的方法,因为我找不到它,是否有某种方法可以通过这个对象访问正确的模型?

我尝试使用像 sequelize-redis-cache 之类的库的另一件事......但我想按我的方式做,我不想使用这个库

标签: node.jscachingredissequelize.js

解决方案


推荐阅读