如何使值不是键过期?

How to expire values not key?

现在我有了一些映射,A->(A1, A2, A3, A4), B->(B1, B2, B3)

我想设置A1,A2,A3...的过期时间为两天,所以我只能获取两天内的加值。并且如果A的所有值都过期了,key A也过期了,应该删除。

有什么解决方案或数据库可以实现这个功能? 非常感谢。

################################################## ##-

好吧,我应该更详细地描述这个问题。

Couchbase 中存储了很多键值对。而键值对是这样的:{id1_20170306-00:01:00 => value1} {id1_20170306-10:01:00 => value2} {id2_20170306-00:01:00 => value3}。所有键值对的过期时间都是两天。

当用户发送id1请求时,返回所有key以id1开头且未过期的键值对。

我有一个解决方案不是特别好。

将密钥转换为一天的开始。对于 20170306-00:01:0020170306-10:01:00,它是 20170306-00:00:00。创建这样的映射 id1_20170306-00:00:00 => (id1_20170306-00:01:00,id1_20170306-10:01:00).

设置id1_20170306-00:00:00的过期时间为上次修改后两天

当用户发送对 id1 的请求时,会生成 id1_20170305-00:00:00id1_20170306-00:00:00 等密钥,以访问存储在 Couchbase 中的真实密钥。

其实id1_20170306-00:01:00的存活时间超过两天

听起来你想要两种不同的东西:

  1. 仅 returns 个最近项目的查询
  2. 定期运行并删除过期项目的清理作业

这两项任务都很简单,可以使用任何关系数据库和许多 NoSQL 数据库完成。

摘要

使用应用层解决问题,而不是数据库层。根据您对问题的输入,我相信有两组实体 -S1(A, B) 和 S2(Ai, Bi)。 要进行清理,您可以实施一项作业,根据超时(缓存在实体存储结构本身中)定期清理 S2。并相应地清理 S1。 但实时的有效变化取决于整个系统的性能。

详细

数据库不会为您的特定问题提供现成的解决方案,因为它们旨在存储数据和查询,而不是通用的业务解决方案。

我相信,您寻求的结果可以通过以下方式获得:

Database/store 等级

您将需要扩展现有的开源数据库(因为您需要它的源代码)并相应地容纳您的功能。但根据您的具体解决方案,它始终是整体查询性能之间的权衡 - 取决于您希望它实时反映的程度。

应用级别

这是最好的解决方案。因为您可以通过多种最佳方式解决。最终目标是消除不再有效的记录。我会建议一个守护进程来查询和清理这些记录。您可以使用数据库提供跨多个客户端的高效查询和清理同步(只要您不读取脏数据)。 清理守护进程的优化取决于问题中未描述的许多因素。