您的方法似乎很合理。
要“刷新”文档,请在Redis中保留已排序文档ID的排序集,其得分设置为更新时间戳。定期(例如,每分钟)对该集合进行一次ZRANGE处理,以获取“旧”文件(例如,一个小时前的最新更新),然后对每个ID进行一次GET *** 作,将其写入Mongo,然后删除该文档,来自订购集的ZREM。
*在伪Node.js中 *编辑 未经测试且完全组成的代码示例:
function updatedocument (document) { // Do some updates ... document.title = "Updated post title"; // Store to redis multi = redis_cli.multi(); multi.set(id, JSON.strinfy(document); multi.zadd('last_update', time(), id); multi.exec(), function (err, replies) { if (err) return next(err); // document updated successful return res.status(200).send('OK'); }); } // call this function periodically, e.g. every minute or so function flushOlddocuments () { fromTime = time()-3600; while (redis_cli.zcount('last_update', '-inf', fromTime) > 0) { id = redis_cli.zrangebyscore('last_update', '-inf', fromTime, false, 0, 1); // no scores, offset 0, limit 1 -> get the oldest document redis_cli.watch(id); Mongo.write(JSON.parse(redis_cli.get(id))); // or something like that multi = redis_cli.multi(); multi.zrem('last_update', id); multi.del(id); multi.exec(), function(err, replies) { // if the watch fails the exec, no harm done and the document will be flushed in an hour ... }; }; }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)