假设redis实例中的所有键都有一个到期集,volatile-lru和allkeys-lru是相似的。但是当一个键被移除时,2之间是否存在显着的性能差异?
奖金问题:
在使用allkeys-lru策略配置的2个不同实例之间,具有相同的内容和相同的配置,但以下情况除外:
除了由于过期位而在实例A中的内存开销之外,当通过allkeys-lru算法删除密钥时,2之间是否存在性能差异?
在这两种情况下,我都在谈论linux 64位上的redis 2.4.x实例,当达到maxmemory时,maxmemory = 3Gb和4-5000个键(大多数键都是哈希值)。
由于
答案 0 :(得分:12)
redis.c, line 2311, unstable branch:
/* volatile-lru and allkeys-lru policy */
else if (server.maxmemory_policy == REDIS_MAXMEMORY_ALLKEYS_LRU ||
server.maxmemory_policy == REDIS_MAXMEMORY_VOLATILE_LRU)
{
for (k = 0; k < server.maxmemory_samples; k++) {
sds thiskey;
long thisval;
robj *o;
de = dictGetRandomKey(dict);
thiskey = dictGetKey(de);
/* When policy is volatile-lru we need an additonal lookup
* to locate the real key, as dict is set to db->expires. */
if (server.maxmemory_policy == REDIS_MAXMEMORY_VOLATILE_LRU)
de = dictFind(db->dict, thiskey);
o = dictGetVal(de);
thisval = estimateObjectIdleTime(o);
/* Higher idle time is better candidate for deletion */
if (bestkey == NULL || thisval > bestval) {
bestkey = thiskey;
bestval = thisval;
}
}
}
似乎所有事情都是平等的allkeys-lru
严格来说会更快,但不的重要性。我们谈论的机会不会超过微秒的一小部分。
第二个问题几乎已经得到了解答,但以防万一:看起来allkeys-lru
设置为过期的密钥数量是多少也没有区别。当lru算法清除密钥时,示例中的实例A和B都会看到相同的性能。