5

redisインスタンスのすべてのキーに有効期限が設定されていると仮定すると、volatile-lruとallkeys-lruは類似しています。しかし、キーが削除されたときの2つの間に大きなパフォーマンスの違いはありますか?

ボーナス質問:

allkeys-lruポリシーで構成され、同じコンテンツと同じ構成を持つ2つの異なるインスタンス間。ただし、次の点を除きます。

  • インスタンスAには、すべてのキーに有効期限が設定されています(expireの値が異なります)
  • インスタンスBには、有効期限が設定されたキーがありません

期限切れビットによるインスタンスAのメモリのオーバーヘッドは別として、allkeys-lruアルゴリズムによってキーが削除された場合の2つの間にパフォーマンスの違いはありますか?

どちらの場合も、maxmemoryに達したときにmaxmemory = 3Gbで4-5000キーのLinux64ビット上のredis2.4.xのインスタンスについて話しています(ほとんどのキーはハッシュです)。

ありがとう

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は、厳密に言えばより速くなるように思われますが、それほど大きくはありません。たぶん、私たちが話しているのは、ほんの一マイクロ秒の速さです。

2番目の質問はすでにほぼ回答済みですが、念のために言ってallkeys-lruおきます。期限切れに設定されているキーの数、または有効期限が設定されているキーの数に違いはないようです。この例のインスタンスAとBはどちらも、キーがlruアルゴリズムによってパージされたときに同じパフォーマンスを示します。

于 2012-10-15T11:23:52.983 に答える