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

col*_*nux 5 performance lru redis

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

奖金问题:

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

  • 实例A的所有键都具有过期集(不同的过期值)
  • 实例B 没有具有过期集的密钥

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

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

谢谢

Mah*_*ahn 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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

似乎所有事情都是平等的allkeys-lru,严格来说会更快,但不是很重要.我们谈论的机会不会超过一分之一微秒.

第二个问题已经得到了很好的回答,但是以防万一:看起来allkeys-lru设置为过期的密钥数量或者是否有任何密钥没有区别.当lru算法清除密钥时,示例中的实例A和B都会看到相同的性能.