php - Perbezaan antara incr dan incrBy dalam Redis
PHP中文网
PHP中文网 2017-05-16 13:04:35
0
4
1121

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中文网

认证0级讲师

membalas semua(4)
阿神

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

Peter_Zhu

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);
    }
}
習慣沉默

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

PHPzhong

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

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan