这个问题与COUCBASE有关,但我相信它将适用于MEMCACHED API的任何东西。

令人忙,例如我正在创建客户端/服务器聊天应用程序,在我的服务器上,我在数据桶中存储聊天会话信息。好的聊天会话结束后,我将从数据桶中删除会话对象,但同时我还希望将其持续到永久的NoSQL数据存储区以进行报告和分析目的。当会话超时等时,我还希望在缓存驱逐时持续存在会话对象。

是有些“最佳实践”(甚至是我缺少的CouchBase的函数),使我能够有效地做到这一点,并在内存缓存系统中保持最佳性能?

有帮助吗?

解决方案

使用Couchbase Server 2.0,您可以设置两个存储桶(如果要分隔物理资源,则可以设置两个存储桶(或两个单独的群集)。在会话群集中,您可以存储JSON文档(键/值对中的值),也许如下:

{ 
  "sessionId" : "some-guid",
  "users" : [ "user1", "user2" ],
  "chatData" : [ "message1", "message2"],
  "isActive" : true,
  "timestamp" : [2012, 8, 6, 11, 57, 00]
}
.

然后,您可以在会话数据库中编写地图/ refure查看,为您提供所有过期项目的列表(请注意下面的使用元参数,需要最近构建CouchBase Server 2.0 - 而不是DP4。

function(doc, meta) {
  if (doc.sessionId && ! doc.isActive) {
    emit(meta.id, null);
  }
}
. 然后,使用您更喜欢的COWEBASE客户端库,您可以有一个任务来查询视图,获取项目并将它们移动到分析群集(或存储桶中。所以在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);
   }
}
.

您的任务可以通过包括启动键来查询视图,以返回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);
}
.

checkout http://www.couchbase.com/couchbase-server/next 有关Couchbase Server 2.0的更多信息,如果您需要任何关于此方法的澄清,请告诉我此线程。

- 约翰

其他提示

couchdb存储是(最终)持久性的,没有内置到期机制,所以无论您存储的内容都将保留存储,直到删除它 - 它在MEMCACHED中,您可以设置存储数据的超时。 因此,如果您在CouchDB中存储会话,您将在其到期时将它们删除,并且由于它不是自动机制,但您自己所做的事情就没有理由您不要在任何地方保存数据同时。

bth我没有看到在SQL上使用持久性NoSQL的优势,因为会话存储(反之亦然) - 两者的性能将是IO绑定。内存仅限密钥商店或混合解决方案是一个完整的故事。

为您的问题:在Apps会话到期/会话关闭机制中移动数据和/或运行Cron作业,这些作业会定期检查已过期会话的会话存储,并移动数据。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top