1

Redis をテストするための簡単なプログラムを作成しています。

#include <hiredis.h>
#include <cstdio>

int main()
{
    redisContext * c = redisConnect("127.0.0.1", 6379);

    redisReply * reply;

    reply = redisCommand(c, "FLUSHALL");
    freeReplyObject(reply);

    for(long int i = 0; i <= 1000000; i++)
    {   
        char query[64];
        sprintf(query, "SET %ld \"string%ld\"", i, i); 

        reply = redisCommand(c, query);
        freeReplyObject(reply);

        if( !(i % 100000) )
        {   
            reply = redisCommand(c, "DBSIZE");
            int res = reply->integer;
            freeReplyObject(reply);

            printf("%s\n", query);
            printf("dbsize: %d\n", res);
        }   
    }   

    redisFree(c);
}

1000000 個のキーを db に配置する必要がありますが、出力は次のようになります。

SET 0 "string0"
dbsize: 1
SET 100000 "string100000"
dbsize: 100001
SET 200000 "string200000"
dbsize: 200001
SET 300000 "string300000"
dbsize: 300001
SET 400000 "string400000"
dbsize: 400001
SET 500000 "string500000"
dbsize: 500001
SET 600000 "string600000"
dbsize: 600001
SET 700000 "string700000"
dbsize: 700001
SET 800000 "string800000"
dbsize: 779479
SET 900000 "string900000"
dbsize: 779479
SET 1000000 "string1000000"
dbsize: 779479

そのため、すぐに (通常は 600000 キーの後)、Redis はレコードの追加を停止します。そのような行動の理由は何ですか?

4

1 に答える 1

0

コード内のエラーをチェックしないため、問題を診断するのは困難です。応答オブジェクトを解放する前に、出力を分析することを想定しています。

最も可能性の高い理由は、Redis インスタンスが maxmemory 制限で構成されており、この制限に達したことです。構成ファイルを確認するか、次のコマンドを使用することをお勧めします。

config get maxmemory

ゼロの値は、制限がないことを意味します。それ以外の場合、制限はバイト数で表されます。

于 2012-07-03T12:49:07.770 に答える