I have a simple API with basic CRUD operations where a User can have multiple Tasks and once user logged in can Update, Delete, Add and Fetch all the tasks.
I am using MongoDB with mLab as my main data store to store documents for User and Task Schemas.
I want to implement Redis caching in my app(Just for learning purposes) and a use case I can think of is to implement it when I fetch tasks for a particular user(on Homepage) when he logs in as that getAllUserTasks is very often used and called when there is any Delete/Update/Add happens.
As of now, the app works fine with MongoDB and documents are getting properly reflected in mLab.
Now coming to Redis part, I have a query that how should I structure my Redis Database. First, let me post what I have in my App so far :
User Schema :
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 }
});
Task Schema :
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 function:
async function getAllUserTasks(userParam) {
return await Task.find({ userAssigned: userParam.userId })
.lean()
.sort({ taskDueDate: "asc" });
}
Now getAllUserTasks returns me an Array of all the tasks for the User.
I googled a bit and found that I can use https://redislabs.com/ for my Redis Database. Now how should I structure my Redis database to fetch tasks performantly? 1. Should I just copy the above schema to Redis database and my tasks documents will live over there.
2. Should I have a key like 'Tasks' and a value will be an Array of Tasks that I am getting from .find in the getAllUserTasks call. If that's the case how will I make sure that once tasks are Deleted/Updated/Added the Redis Database will be updated accordingly? Just for reference below are my Update/Create/Delete methods :
createTask
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";
}
}
updateTask
async function updateTask(id, userParam) {
return await Task.findOneAndUpdate(
{ _id: id },
userParam,
{
new: true,
overwrite: true
},
function(err) {
if (err) return err;
}
);
}
deleteUserTask
async function deleteUserTask(id) {
return await Task.findByIdAndRemove(id, function(err) {
if (err) {
return err;
}
});
}
As I am new to Redis any help would be really appreciated. Thanks!