recherche

Maison  >  Questions et réponses  >  le corps du texte

php - Différence entre incr et incrBy dans Redis

J'ai lu des articles en ligne sur leurs différences

Mais je l'ai essayé moi-même et j'ai découvert que incr pouvait aussi ressembler à incrby Si vous spécifiez le montant de l'augmentation ainsi, vous aurez l'impression qu'il n'y a aucune différence. L'image ci-dessous est le résultat de mon test.

PHP中文网PHP中文网2773 Il y a quelques jours1126

répondre à tous(4)je répondrai

  • 阿神

    阿神2017-05-16 13:06:35

    Ce qui suit est le code source de Redis. En fait, l'implémentation sous-jacente de incr et incrBy est cohérente, mais incrBy doit effectuer une vérification des paramètres

    //incr命令
    void incrCommand(redisClient *c) {
        incrDecrCommand(c,1);
    }
    //decr命令
    void decrCommand(redisClient *c) {
        incrDecrCommand(c,-1);
    }
    //incrBy命令
    void incrbyCommand(redisClient *c) {
        long long incr;
    
        if (getLongLongFromObjectOrReply(c, c->argv[2], &incr, NULL) != REDIS_OK) return;
        incrDecrCommand(c,incr);
    }
    //decrby命令
    void decrbyCommand(redisClient *c) {
        long long incr;
    
        if (getLongLongFromObjectOrReply(c, c->argv[2], &incr, NULL) != REDIS_OK) return;
        incrDecrCommand(c,-incr);
    }

    On peut voir d'ici que incr ne prend pas en charge les paramètres numériques.

    Mais pourquoi $redis est-il pris en charge en PHP ? Peut-être que la couche inférieure de cette bibliothèque utilise la commande incrBy de redis

    répondre
    0
  • 天蓬老师

    天蓬老师2017-05-16 13:06:35

    Le code source a été mal publié tout à l'heure, veuillez le modifier


    En parcourant le code source de l'extension phpredis, elle devrait être compatible à partir de la 2.0.9.

    Lorsque vous appelez incr, apportez éventuellement un numéro de type long. Si le numéro n'est pas 1, appelez incrby.

    À propos, lors de l'utilisation de incrBy, si le paramètre suivant est 1, incr sera appelé.

    PHP_METHOD(Redis, incr){
    
        zval *object;
        RedisSock *redis_sock;
        char *key = NULL;
        int key_len;
        long val = 1;
    
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os|l",
                                         &object, redis_ce,
                                         &key, &key_len, &val) == FAILURE) {
            RETURN_FALSE;
        }
    
        if(val == 1) {
            redis_atomic_increment(INTERNAL_FUNCTION_PARAM_PASSTHRU, "INCR", 1);
        } else {
            redis_atomic_increment(INTERNAL_FUNCTION_PARAM_PASSTHRU, "INCRBY", val);
        }
    }

    répondre
    0
  • 習慣沉默

    習慣沉默2017-05-16 13:06:35

    http://redisdoc.com/string/in...
    http://redisdoc.com/string/in...
    L'exécution à l'intérieur de Redis est-elle différente ? Si vous utilisez incr pour transmettre des paramètres, vous devez exécuter les heures spécifiées par le paramètre
    Mais si vous utilisez incrby, vous n'avez besoin d'effectuer qu'un seul calcul, vous devez donc le confirmer à nouveau

    répondre
    0
  • PHPz

    PHPz2017-05-16 13:06:35

    Après les tests, aucune différence n'est visible, la durée d'exécution est la même et aucune augmentation n'est exécutée plusieurs fois. Si le nombre 230000000000000000000000000000 est exécuté plusieurs fois, cela prendra certainement un certain temps, mais cela prendra le même temps qu'IncrBys

    répondre
    0
  • Annulerrépondre