假设redis实例中的所有键都具有过期集,则volatile-lru和allkeys-lru是相似的。但是,移除 key 后,两者之间在性能上有显着差异吗?

奖励问题:

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

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

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

    在这两种情况下,我都在谈论在达到最大内存时(最大键为散列),Linux 64位上的redis 2.4.x实例,其中maxmemory = 3Gb,具有4-5000个键。

    谢谢

    最佳答案

    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设置多少个 key 到期,或者是否有 key ,这没有什么区别。您的示例中的实例A和实例B在通过lru算法清除 key 时都将看到相同的性能。

    关于performance - Redis maxmemory-policy : performances of volatile-lru vs allkeys-lru,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12892396/

    10-15 10:01