使用Memcache API兼容商店删除/驱逐后持久缓存数据
题
这个问题与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作业,这些作业会定期检查已过期会话的会话存储,并移动数据。