【发布时间】:2012-01-05 08:20:27
【问题描述】:
有人知道基于 Redis LRU 的驱逐/删除的内部结构吗?
Redis 如何确保首先删除旧的(较少使用的)密钥(以防我们没有易失性密钥并且我们没有设置 TTL 过期)?
我确定 Redis 有一个配置参数“maxmemory-samples”,它控制用于删除键的样本大小 - 因此,如果您将样本大小设置为 10,那么它会采样 10 个键并从中删除最旧的这些。
我不知道它是否完全随机地对这些密钥进行采样,或者它是否有某种机制允许它自动从相当于“较旧/较少使用的一代”中进行采样?
【问题讨论】:
-
据我所知,它随机采样键。
-
这是我在antirez.com/post/redis-as-LRU-cache.html 找到的——使用“样本三”算法的全部意义在于节省内存。我认为这比精度更有价值,特别是因为这种随机算法很少被很好地理解。一个例子:与 完美 LRU 算法相比,仅使用三个对象进行采样将使 999 个数据集中的 666 个对象失效,错误率仅为 14%。在剩下的 14% 中,几乎没有元素在非常常用的元素范围内。因此,毫无疑问,内存增益将为精度付出代价。
-
您应该将此作为答案发布并接受。 :-)
-
完成...按照建议添加了答案。