node.js - nodejs-express - 在主数据库上实现 Redis 缓存作为 mongodb
问题描述
我有一个简单的 API,CRUD operations
其中一个用户可以有多个任务,一旦用户登录就可以更新、删除、添加和获取所有任务。我使用MongoDB
withmLab
作为我的主要数据存储来存储用户和任务模式的文档。我想Redis caching
在我的应用程序中实现(仅用于学习目的),我能想到的一个用例是当我为特定用户(在主页上)登录时获取任务时实现它,因为它getAllUserTasks
经常被使用和调用有任何删除/更新/添加发生。截至目前,该应用程序可以正常工作,MongoDB
并且文档可以正确反映在mLab
. 现在来到 Redis 部分,我有一个查询,我应该如何构建我的 Redis 数据库。首先,让我发布到目前为止我的应用程序中的内容:
用户架构:
const userSchema = new Schema({
userName: { type: String, unique: true, required: true },
hashPassword: { type: String, required: true },
firstName: { type: String, required: true },
lastName: { type: String, required: true },
userAge: { type: Number, required: true },
userDetails: { type: String, required: true },
userCreatedOn: { type: Date, default: Date.now }
});
任务架构:
const taskSchema = new Schema({
//Below is userAssigned which is ref for above User document.
userAssigned: { type: Schema.Types.ObjectId, ref: User},
taskDesc: { type: String, required: true },
taskCreatedOn: { type: Date, default: Date.now },
taskDueDate: { type: Date, required: true }
});
getAllUserTasks 函数:
async function getAllUserTasks(userParam) {
return await Task.find({ userAssigned: userParam.userId })
.lean()
.sort({ taskDueDate: "asc" });
}
现在getAllUserTasks
返回给我一个Array
用户的所有任务。我用谷歌搜索了一下,发现我可以https://redislabs.com/
用于我的 Redis 数据库。现在我应该如何构建我的 Redis 数据库以高效地获取任务?1.我是否应该将上述模式复制到 Redis 数据库,我的任务文档将存在于那里。2. 我是否应该有一个key
类似的“任务”,并且 avalue
将是我从通话中的 .find 获得的任务数组getAllUserTasks
。如果是这种情况,我将如何确保一旦删除/更新/添加任务,Redis 数据库将相应更新?下面仅供参考是我的更新/创建/删除方法:
创建任务
async function createTask(userParam) {
if (await User.findOne({ _id: userParam.userAssigned })) {
const task = new Task(userParam);
await task.save();
} else {
throw "User does not exist";
}
}
更新任务
async function updateTask(id, userParam) {
return await Task.findOneAndUpdate(
{ _id: id },
userParam,
{
new: true,
overwrite: true
},
function(err) {
if (err) return err;
}
);
}
删除用户任务
async function deleteUserTask(id) {
return await Task.findByIdAndRemove(id, function(err) {
if (err) {
return err;
}
});
}
由于我是 Redis 的新手,任何帮助将不胜感激。谢谢!
解决方案
您不必将所有数据存储到 redis。缓存是一种捷径。有数据就好,没有也无所谓。
getAllUserTasks
调用时存储任务。密钥可以是用户 ID。值可以是具有身份标识的任务数组。
如果某人的任务发生了变异,只需从redis中清除某人的任务即可。
getAllUserTasks(param) {
1. Find tasks from redis by user key.
2. If they exist, return them.
3. If not, get data from db and store them to redis.
4. Return data.
}
推荐阅读
- wav - Import wav file in Tensorflow 2
- android - 如何处理okhttp3中的错误而不会崩溃
- asp.net-core - 即使在实现 IdentityServer 之后,ASP.Net Core 应用程序也会重定向到 /Account/Login
- javascript - 分隔线颜色变化 React Material Ui
- sql - sql 数据库为数据库中存在的值返回 0。搜索网址
- python - 为什么我在检查安装版本时会得到这个 PyPy 输出?
- c# - 尽管设计器页面中存在控件名称,但代码隐藏文件无法识别控件名称
- assembly - 在 gdb 中调试时获取 asm var
- pagespeed - 可重现:灯塔返回错误:NO_FCP
- typescript - 嵌套对象中的通用键和打字稿自动完成