如何使值不是键过期?
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:00
和 20170306-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:00
和 id1_20170306-00:00:00
等密钥,以访问存储在 Couchbase 中的真实密钥。
其实id1_20170306-00:01:00
的存活时间超过两天
听起来你想要两种不同的东西:
- 仅 returns 个最近项目的查询
- 定期运行并删除过期项目的清理作业
这两项任务都很简单,可以使用任何关系数据库和许多 NoSQL 数据库完成。
摘要
使用应用层解决问题,而不是数据库层。根据您对问题的输入,我相信有两组实体 -S1(A, B) 和 S2(Ai, Bi)。
要进行清理,您可以实施一项作业,根据超时(缓存在实体存储结构本身中)定期清理 S2。并相应地清理 S1。
但实时的有效变化取决于整个系统的性能。
详细
数据库不会为您的特定问题提供现成的解决方案,因为它们旨在存储数据和查询,而不是通用的业务解决方案。
我相信,您寻求的结果可以通过以下方式获得:
Database/store 等级
您将需要扩展现有的开源数据库(因为您需要它的源代码)并相应地容纳您的功能。但根据您的具体解决方案,它始终是整体查询性能之间的权衡 - 取决于您希望它实时反映的程度。
应用级别
这是最好的解决方案。因为您可以通过多种最佳方式解决。最终目标是消除不再有效的记录。我会建议一个守护进程来查询和清理这些记录。您可以使用数据库提供跨多个客户端的高效查询和清理同步(只要您不读取脏数据)。
清理守护进程的优化取决于问题中未描述的许多因素。
现在我有了一些映射,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:00
和 20170306-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:00
和 id1_20170306-00:00:00
等密钥,以访问存储在 Couchbase 中的真实密钥。
其实id1_20170306-00:01:00
的存活时间超过两天
听起来你想要两种不同的东西:
- 仅 returns 个最近项目的查询
- 定期运行并删除过期项目的清理作业
这两项任务都很简单,可以使用任何关系数据库和许多 NoSQL 数据库完成。
摘要
使用应用层解决问题,而不是数据库层。根据您对问题的输入,我相信有两组实体 -S1(A, B) 和 S2(Ai, Bi)。 要进行清理,您可以实施一项作业,根据超时(缓存在实体存储结构本身中)定期清理 S2。并相应地清理 S1。 但实时的有效变化取决于整个系统的性能。
详细
数据库不会为您的特定问题提供现成的解决方案,因为它们旨在存储数据和查询,而不是通用的业务解决方案。
我相信,您寻求的结果可以通过以下方式获得:
Database/store 等级
您将需要扩展现有的开源数据库(因为您需要它的源代码)并相应地容纳您的功能。但根据您的具体解决方案,它始终是整体查询性能之间的权衡 - 取决于您希望它实时反映的程度。
应用级别
这是最好的解决方案。因为您可以通过多种最佳方式解决。最终目标是消除不再有效的记录。我会建议一个守护进程来查询和清理这些记录。您可以使用数据库提供跨多个客户端的高效查询和清理同步(只要您不读取脏数据)。 清理守护进程的优化取决于问题中未描述的许多因素。