Redis maxmemory-policy:volatile-lru与allkeys-lru的表现

时间:2012-10-15 09:07:19

标签: performance redis lru

假设redis实例中的所有键都有一个到期集,volatile-lru和allkeys-lru是相似的。但是当一个键被移除时,2之间是否存在显着的性能差异?

奖金问题:

在使用allkeys-lru策略配置的2个不同实例之间,具有相同的内容和相同的配置,但以下情况除外:

  • 实例A的所有键具有过期设置(不同的过期值)
  • 实例B的 none 键具有过期集

除了由于过期位而在实例A中的内存开销之外,当通过allkeys-lru算法删除密钥时,2之间是否存在性能差异?

在这两种情况下,我都在谈论linux 64位上的redis 2.4.x实例,当达到maxmemory时,maxmemory = 3Gb和4-5000个键(大多数键都是哈希值)。

由于

1 个答案:

答案 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都会看到相同的性能。