【问题标题】:How to expire values not key?如何使值过期而不是键?
【发布时间】:2017-03-06 11:00:15
【问题描述】:

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

我想将 A1、A2、A3... 的过期时间设置为两天,所以我只能在两天内获得添加的值。如果 A 的所有值都过期了,那么键 A 也过期了,应该删除。

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

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

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

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

当用户发送id1的请求时,所有以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的存活时间超过两天。

【问题讨论】:

  • 你说的是哪个 DBMS?
  • @a_horse_with_no_name 任何数据库都可以,只要我能达到这个目标
  • 我认为您的问题解决方案与此stackoverflow.com/questions/35407858/… 有关
  • @BrooklynKnightley *"我想将 A1、A2、A3... 的过期时间设置为两天,所以我只能在两天内获得添加的值。如果 A 的所有值已过期,密钥 A 已过期,应删除。”您不会发现任何具有“开箱即用”功能的数据库,您必须对其进行编程。

标签: java database couchbase


【解决方案1】:

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

  1. 只返回最近项目的查询
  2. 定期运行并删除过期项目的清理作业

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

【讨论】:

    【解决方案2】:

    摘要

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

    详细

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

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

    数据库/存储级别

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

    应用级别

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-22
      • 1970-01-01
      • 1970-01-01
      • 2015-09-22
      • 2016-10-12
      • 1970-01-01
      • 2021-01-18
      • 2019-12-07
      相关资源
      最近更新 更多