使用 Couchbase Server 2.0,您可以设置两个存储桶(如果您想分离物理资源,则可以设置两个单独的集群)。在会话集群上,您将存储 JSON 文档(键/值对中的值),可能如下所示:
{
"sessionId" : "some-guid",
"users" : [ "user1", "user2" ],
"chatData" : [ "message1", "message2"],
"isActive" : true,
"timestamp" : [2012, 8, 6, 11, 57, 00]
}
然后,您可以在会话数据库中编写一个 Map/Reduce 视图,为您提供所有过期项目的列表(注意下面带有 meta 参数的示例需要最近构建的 Couchbase Server 2.0 - 而不是 DP4。
function(doc, meta) {
if (doc.sessionId && ! doc.isActive) {
emit(meta.id, null);
}
}
然后,使用您喜欢的 Couchbase 客户端库,您可以执行查询视图、获取项目并将它们移动到分析集群(或存储桶)中的任务。所以在 C# 中,这看起来像:
var view = sessionClient.GetView("sessions", "all_inactive");
foreach(var item in view)
{
var doc = sessionClient.Get(item.ItemId);
analyticsClient.Store(StoreMode.Add, item.ItemId, doc);
sessionClient.Remove(item.ItemId);
}
相反,如果您想使用明确的时间戳或过期时间,您的视图可以根据时间戳进行索引:
function(doc) {
if (doc.sessionId && ! doc.isActive) {
emit(timestamp, null);
}
}
然后,您的任务可以通过包含一个 startkey 来查询视图,以返回 x 天内未触及的所有文档。
var view = sessionClient.GetView("sessions", "all_inactive").StartKey(new int[] { DateTime.Now.Year, DateTime.Now.Months, DateTime.Now.Days-1);
foreach(var item in view)
{
var doc = sessionClient.Get(item.ItemId);
analyticsClient.Store(StoreMode.Add, item.ItemId, doc);
sessionClient.Remove(item.ItemId);
}
查看http://www.couchbase.com/couchbase-server/next以获取有关 Couchbase Server 2.0 的更多信息,如果您需要对此方法的任何说明,请在此线程上告诉我。
- 约翰