我有一个简单的API,该API具有基本的CRUD operations
,其中用户可以具有多个任务,并且用户登录后可以更新,删除,添加和提取所有任务。
我将MongoDB
和mLab
用作主要数据存储区,用于存储用户和任务模式的文档。
我想在我的应用中实现Redis caching
(仅出于学习目的),我可以想到的一个用例是,当我以某个特定用户的身份登录{{ 1}}在删除/更新/添加发生时经常被使用和调用。
到目前为止,该应用程序可以在getAllUserTasks
上正常运行,并且文档已正确反映在MongoDB
中。
现在进入Redis部分,我有一个查询,该如何构造我的Redis数据库。首先,让我发布到目前为止应用程序中的内容:
用户架构:
mLab
任务架构:
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 }
});
getAllUserTasks函数:
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 }
});
现在async function getAllUserTasks(userParam) {
return await Task.find({ userAssigned: userParam.userId })
.lean()
.sort({ taskDueDate: "asc" });
}
为用户返回了getAllUserTasks
的所有任务。
我在Google上搜索了一下,发现可以对我的Redis数据库使用Array
。现在,我应该如何构造Redis数据库以高效地获取任务? 1.我是否应该将以上架构复制到Redis数据库中,并且我的任务文档将位于该数据库中。
2.如果我有一个像{Tasks'这样的https://redislabs.com/
,而一个key
就是我从value
调用中的.find获取的任务数组。如果是这种情况,我将如何确保一旦删除/更新/添加任务,Redis数据库将相应地更新?仅供参考,以下是我的Update / Create / Delete方法:
createTask
getAllUserTasks
updateTask
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";
}
}
deleteUserTask
async function updateTask(id, userParam) {
return await Task.findOneAndUpdate(
{ _id: id },
userParam,
{
new: true,
overwrite: true
},
function(err) {
if (err) return err;
}
);
}
由于我是Redis的新手,所以我们将不胜感激。谢谢!
答案 0 :(得分:1)
您不必将所有数据存储到Redis。缓存是一种捷径。有数据很好,但是没有也没关系。
在调用getAllUserTasks
时存储任务。密钥可以是用户ID。值可以是具有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.
}