cari

Rumah  >  Soal Jawab  >  teks badan

php - Perbezaan antara incr dan incrBy dalam Redis

Saya membaca dalam talian tentang perbezaan mereka

Tetapi saya mencuba sendiri dan mendapati incr juga boleh menentukan kenaikan seperti incrby, jadi rasanya tiada bezanya. Gambar di bawah adalah hasil ujian saya.

PHP中文网PHP中文网2774 hari yang lalu1140

membalas semua(4)saya akan balas

  • 阿神

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

    Berikut ialah kod sumber Redis Sebenarnya, pelaksanaan asas incr dan incrBy adalah konsisten, tetapi incrBy perlu melakukan pengesahan parameter

    .
    //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);
    }

    Dapat dilihat dari sini bahawa incr tidak menyokong parameter berangka.

    Tetapi mengapa $redis disokong dalam PHP? Mungkin lapisan bawah perpustakaan ini menggunakan perintah incrBy redis

    balas
    0
  • 天蓬老师

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

    Kod sumber telah disiarkan secara salah sebentar tadi, sila ubah suainya


    Melihat melalui kod sumber sambungan phpredis, ia sepatutnya serasi bermula dari 2.0.9.

    Semasa memanggil incr, bawa nombor jenis panjang Jika nombor itu bukan 1, hubungi incrby.

    Dengan cara ini, apabila menggunakan incrBy, jika parameter berikut ialah 1, incr akan dipanggil.

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

    balas
    0
  • 習慣沉默

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

    http://redisdoc.com/string/in...
    http://redisdoc.com/string/in...
    Adakah pelaksanaan di dalam redis berbeza? Jika anda menggunakan incr untuk lulus parameter, anda perlu melaksanakan parameter masa yang ditentukan
    Tetapi jika anda menggunakan incrby, anda hanya perlu melakukan satu pengiraan, jadi anda perlu mengesahkannya semula

    balas
    0
  • PHPz

    PHPz2017-05-16 13:06:35

    Selepas ujian, tiada perbezaan dapat dilihat, masa berjalan adalah sama, dan tiada incr dilaksanakan beberapa kali. Jika nombor 23000000000000000000000000000000000 dilaksanakan beberapa kali, ia pasti akan mengambil masa tertentu, tetapi ia akan mengambil masa yang sama seperti Incrbys

    balas
    0
  • Batalbalas