我需要一个简单的缓存结构(用Python实现,但实际上并不重要),有一些特定的要求:
检索期间检查密钥是不够的(尽管仍应该这样做,以避免返回过期密钥) - 因为许多密钥可能永远不会被检索,然后它们将永远存在(或者存在时间太长)。
大多数解决此问题的答案建议使用memcached,但我认为这将浪费CPU,特别是因为我保存可以通过引用放置到字典中的对象,但是使用memcached时它们必须进行(反)序列化。
我有一些关于如何实现这个想法:将数据分成时间片,实际上有几个字典 - 例如,如果过期时间为60秒,则我们最多有4个字典,并且每20秒添加一个新字典 - 新密钥被放置在其中,并删除第四个字典-其中我们将拥有在60秒前添加的密钥。这使得清理非常快,代价是检索时间会增加,您需要在4个字典中查找而不是一个(RAM使用量增加了33%)。
所以最终的问题是:是否有更好的解决方案?或者也许我错了,提到的某些解决方案(逐个删除密钥)会更好,更快?我不想重新发明轮子,但在网络上找不到任何好的解决方案。
- 多达数百万个小对象(平均每个100字节)
- 速度至关重要(放置和获取),我希望操作时间在几微秒左右
- 只有一个线程访问此数据 - 因此可以全部保存在内存中(无需持久化)
- 密钥是MD5哈希(如果有影响)
- 有一个全局的过期时间,每个密钥应在过期时间后从缓存中删除,计算从第一次放置开始的时间
检索期间检查密钥是不够的(尽管仍应该这样做,以避免返回过期密钥) - 因为许多密钥可能永远不会被检索,然后它们将永远存在(或者存在时间太长)。
大多数解决此问题的答案建议使用memcached,但我认为这将浪费CPU,特别是因为我保存可以通过引用放置到字典中的对象,但是使用memcached时它们必须进行(反)序列化。
我有一些关于如何实现这个想法:将数据分成时间片,实际上有几个字典 - 例如,如果过期时间为60秒,则我们最多有4个字典,并且每20秒添加一个新字典 - 新密钥被放置在其中,并删除第四个字典-其中我们将拥有在60秒前添加的密钥。这使得清理非常快,代价是检索时间会增加,您需要在4个字典中查找而不是一个(RAM使用量增加了33%)。
所以最终的问题是:是否有更好的解决方案?或者也许我错了,提到的某些解决方案(逐个删除密钥)会更好,更快?我不想重新发明轮子,但在网络上找不到任何好的解决方案。