我使用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缓存库和。。。但我想用我自己的方式,我不想用这个图书馆
暂无答案!
目前还没有任何答案,快来回答吧!