У меня есть приложение nodejs, которое обрабатывает вложенные документы JSON, например:
var post = {
id: 123,
title: 'Sterling Archer',
comments: [
{text: 'Comment text', tags: ['tag1', 'tag2', 'tag3']},
{text: 'Comment test', tags: ['tag2', 'tag5']}
]
};
И сохраняет их в базе данных MongoDB. Мои документы требуют частых обновлений, но, как вы знаете, MongoDB очень медленно выполняет запись из-за своей природы. Чтобы решить эту проблему, я решил хранить документы в Redis и сбрасывать их в MongoDB через некоторое время (например, через 1-2 часа).
Итак, вот пример кода моего подхода к обновлению:
var redis_cli = require("redis").createClient();
app.post('/update/:id', function (req, res, next) {
var id = req.params.id
redis_cli.get(id, function (err, document) {
if (err) return next(err);
// If there is no key, try to get from MongoDB
if (!document) {
DocumentModel.findOneByid(id, function (err, document) {
if (err) return next(err);
if (!document) return next(new Error("Document with id " + id + " does not exists"));
// Document in MongoDB, so store in redis
redis_cli.set(id, JSON.stringify(document), function (err) {
if (err) return next(err);
updateDocument(document);
});
});
} else {
updateDocument(JSON.parse(document));
}
function updateDocument (document) {
// Do some updates ...
document.title = "Updated post title";
// Store to redis
redis_cli.set(id, JSON.strinfy(document), function (err) {
if (err) return next(err);
// Document updated successful
return res.status(200).send('OK');
});
}
});
});
Мой первый вопрос: что вы думаете о моем подходе к работе с документами? Есть ли проблемы с моим подходом?
И второй вопрос, как сбросить документы в Redis обратно в mongodb и удалить из redis? Моя цель заключается в следующем: я хочу хранить документы в Redis только тогда, когда это необходимо моим пользователям, поэтому, если они не работают с их документом, его следует хранить в MongoDB вместо Redis.