2012-07-03 75 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