node.js - 如何同时使用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 之类的库的另一件事......但我想按我的方式做,我不想使用这个库
解决方案
推荐阅读
- couchbase - 使用 Couchbase SDK 与 Sync Gateway API
- c# - 在 .net 核心中安全地释放依赖注入的 wcf 客户端
- javascript - 如何在Javascript中用点替换逗号
- postgresql - PostgreSQL - 将输出导出到 CSV
- mysql - 在 Node JS Handlebars JS MySql 中发送值
- python - PIP 不会安装 Tensorflow
- selenium - Selenium WebDriverException:会话 [null] 不可用并且不在最后 1000 个终止会话中
- java - 检测 Websphere Liberty 是否安全?
- apache-kafka - 如何在启用 SASL 的 Zookeeper 上创建 Kafka 主题?
- c++ - 如何初始化一个很长的数组?