2012-07-03 3 views
1

Je vous écris un programme simple pour tester Redis:comportement de commande étrange 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); 
} 

Il faut mettre 1000000 clés dans db, mais la sortie est la suivante:

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 

Ainsi, dans un moment (généralement après environ 600000) Redis arrête d'ajouter des enregistrements. Quelle peut être la raison d'un tel comportement?

Répondre

0

Vous ne vérifiez pas les erreurs dans votre code, il est donc difficile de diagnostiquer le problème. Vous êtes supposé analyser la sortie avant de libérer l'objet réponse.

La raison la plus probable est que votre instance Redis a été configurée avec une limite maxmemory et que vous avez atteint cette limite. Vous souhaiterez peut-être vérifier le fichier de configuration ou utiliser la commande suivante:

config get maxmemory 

Une valeur nulle signifie qu'il n'y a pas de limite. Sinon, la limite est exprimée en nombre d'octets.

+0

Merci, cela m'a vraiment aidé. La vérification des erreurs était inutilisable - il n'y avait pas d'erreurs. – user1498131