2012-07-03 74 views
1

我正在寫一個簡單的程序測試的Redis:奇怪Redis的SET命令的行爲

#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); 
} 

應該把百萬鍵進入分貝,但輸出如下:

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停止添加記錄。什麼可能是這種行爲的原因?

回答

0

您不檢查代碼中的錯誤,因此很難診斷問題。假設在釋放回復對象之前分析輸出。

最可能的原因是您的Redis實例已配置maxmemory限制,並且您已達到此限制。您可能需要檢查配置文件,或使用以下命令:

config get maxmemory 

零值表示沒有限制。否則,限制以字節數表示。

+0

謝謝,這真的有幫助。 錯誤檢查是無用的 - 沒有錯誤。 – user1498131