我需要简单的缓存结构(在 python 中,但这并不重要),有一些特定的要求:
- 多达数百万个小对象(平均 100 字节)
- 速度是关键(放置和获取),我预计操作时间约为几微秒
- 只有一个线程访问它 - 所以它可以只在内存中(不需要持久性)
- 密钥是 MD5 哈希(如果重要)
- 缓存有一个全局的过期时间 - 每个键都应在过期时间后从缓存中删除,从第一次放置的时间开始计算
现在,重点是如何实现过期——因为其他所有事情都可以使用简单的字典来完成。最简单的解决方案 - 定期迭代所有数据并删除过期密钥 - 可能会锁定整个缓存太长时间。可以通过在每个清理过程中迭代部分数据来改进它 - 但仍然需要一些时间(或者清理速度不够快)。还一个一个地删除密钥看起来像是对 CPU 的浪费——因为它们可以分批删除(不必在过期后立即删除——我们可以提供一些额外的 RAM 来将过期的密钥保留更长时间)。
在检索期间检查密钥是不够的(尽管应该这样做,以不返回过期的密钥) - 因为许多密钥永远无法检索,然后它们将永远保留(或太久)。
该问题的大多数答案都建议使用 memcached,但我认为这会浪费 CPU,尤其是当我保留可以通过引用放入字典的对象时,但使用 memcached,它们必须被(反)序列化。
我有一些想法如何实现这一点:将数据拆分为时间片,实际上有几个字典 - 例如,如果过期时间是 60 秒,那么我们(最多)有 4 个字典,每 20 秒我们添加一个新字典 - 其中新放置密钥,然后删除第 4 个 - 我们将在 60 秒前添加密钥。这使得清理速度非常快,但以检索时间为代价,您需要在 4 个字典而不是一个字典中进行查找(并且 RAM 使用量增加了 33%)。
所以最后的问题是:有没有更好的解决方案?或者也许我错了,一些提到的解决方案(一个一个地删除键)会更好更快?我不想重新发明轮子,但在网上没有找到任何好的解决方案。