gpt4 book ai didi

nosql - 使用 Memcache API 兼容存储在删除/驱逐后保留缓存数据

转载 作者:行者123 更新时间:2023-12-02 00:19:08 26 4
gpt4 key购买 nike

这个问题专门针对 Couchbase,但我相信它适用于任何使用 memcached api 的东西。

假设我正在创建一个客户端/服务器聊天应用程序,并且在我的服务器上,我将每个用户的聊天 session 信息存储在一个数据桶中。聊天 session 结束后,我将从数据桶中删除 session 对象,但同时我还想将其保存到永久的 NoSQL 数据存储中,以用于报告和分析目的。我还希望在缓存逐出、 session 超时等情况下保留 session 对象。

是否有某种“最佳实践”(或者甚至是我缺少的 Couchbase 功能)使我能够高效地执行此操作并保持内存缓存系统的最佳性能?

最佳答案

使用 Couchbase Server 2.0,您可以设置两个存储桶(如果您想要分离物理资源,则可以设置两个单独的集群)。在 session 集群上,您将存储 JSON 文档(键/值对中的值),可能如下所示:

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

然后您可以在 session 数据库中编写一个 Map/Reduce View ,为您提供所有过期项目的列表(请注意下面带有 meta 参数的示例需要最新构建的 Couchbase Server 2.0 - 而不是 DP4。

function(doc, meta) {
if (doc.sessionId && ! doc.isActive) {
emit(meta.id, null);
}
}

然后,使用您喜欢的任何 Couchbase 客户端库,您可以执行一个任务来查询 View 、获取项目并将它们移动到分析集群(或存储桶)中。所以在 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);
}

如果您相反,想要使用显式时间戳或过期时间,您的 View 可以根据时间戳进行索引:

function(doc) {
if (doc.sessionId && ! doc.isActive) {
emit(timestamp, null);
}
}

然后您的任务可以通过包含一个开始键来查询 View ,以返回 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 的更多信息,如果您需要有关此方法的任何说明,请在此线程中告诉我。

-- 约翰

关于nosql - 使用 Memcache API 兼容存储在删除/驱逐后保留缓存数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11694398/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com