我认为键值存储太大,无法遍历所有kv对以找出哪些可以过期。我还假设每次读取访问都会刷新到期时间戳,因此只有一段时间未访问的项目才会过期。
面临的挑战是如何有效地找到所有可以到期的记录(每当需要进行清理时),还要有效地刷新每个读取访问的到期时间戳(因此我们必须在用于到期的结构中找到键)。
我的建议:将expiry_timestamps分组到存储桶中;例如,如果物品使用寿命8小时,则每小时要制造一个水桶。这些存储桶保存在链接列表中;到期时,将清空第一个存储桶,并减少列表。桶数是寿命/清理间隔。每个存储桶均包含应过期的所有键的hashSet。对哈希集中的所有键进行迭代足够有效。
在读取访问期间,程序将检查密钥当前位于哪个存储桶以及它现在属于哪个存储桶。在大多数情况下,它是同一个存储桶,因此无需采取进一步措施。否则,请从旧存储桶中删除密钥(从散列集中删除是有效的),然后将其插入新存储桶中。
+--------------+ +--------------+ +--------------+
-->+ Expiry 08:00 +-->+ Expiry 09:00 +-->+ Expiry 10:00 +
| KeySet | | KeySet | | KeySet |
+--------------+ +--------------+ +--------------+