5

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

奖金问题:

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

  • 实例 A 的所有键都设置了过期时间(过期值不同)
  • 实例 B没有设置过期时间的键

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

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

谢谢

4

1 回答 1

12

redis.c,第 2311 行,不稳定分支

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

于 2012-10-15T11:23:52.983 回答