Node-redis: Pemipaan

Dibuat pada 13 Jan 2014  ·  9Komentar  ·  Sumber: NodeRedis/node-redis

Halo kawan-kawan,

bagaimana cara mengaktifkan pipelining di node_redis secara terprogram?

Saya melihat dokumentasi mengatakan itu terjadi secara otomatis dalam banyak kasus - dan saya ingin memahami apakah ada cara untuk memaksanya dari kode aplikasi secara terprogram di node_redis

[ ec2-user@devops ~]$ redis-benchmark -n 100000 -t set, dapatkan -P 16 -q -h 10.0.1.10
SET: 199600.80 permintaan per detik
DAPATKAN: 193050.19 permintaan per detik

[ ec2-user@devops ~]$ redis-benchmark -n 100000 -t set, dapatkan -q -h 10.0.1.12
SET: 14098.41 permintaan per detik
DAPATKAN: 13743,82 permintaan per detik

itu lebih dari 10 kali perbedaan pada Redis node.

Terima kasih,
Dmitry

Feature Request fixed / done

Komentar yang paling membantu

Semua perintah dikirim "melalui pipa" tetapi ini tidak akan pernah dikirim dalam kerangka tulis pipa yang sama karena satu atau dua alasan:

  1. Panggilan balik untuk sismember adalah apa yang memanggil panggilan hgetall -- oleh karena itu Anda secara implisit mencegah perintah-perintah ini untuk disalurkan bersama-sama untuk panggilan sismember yang diberikan. Callback tidak dipanggil sampai Redis membalas.
  2. Jika base dan client adalah klien Redis yang berbeda, mereka dapat _NEVER_ berbagi saluran yang sama.

Perintah harus dijalankan dari konteks yang sama* untuk melihat manfaat apa pun dari pipelining. Misalnya mirip dengan contoh PING di redis pipelining docs:

// These commands will all be pipelined together:
client.ping()
client.ping()
client.ping()
client.ping(function () {
  // This would *NEVER* be in the same pipeline frame as the other four because it requires a reply to be received first
  client.ping()
})

* atau dari konteks terpisah jika dikirim lebih cepat daripada yang dibalas Redis, tetapi jangan pernah membalas konteks yang bergantung

Semua 9 komentar

Apakah itu dilakukan melalui perintah client.multi & multi.exec?

Hai @saritasa -- pipeliningnya otomatis. Itu selalu terjadi di dalam klien. Anda tidak perlu menggunakan multi atau exec untuk mengaktifkannya.

Hai Bryce,

  1. Saya bingung, apa gunanya fungsi "multi" di dalam node_redis?
  2. Apa algoritma yang digunakan untuk menyalurkan perintah secara otomatis?

Terima kasih,
Dmitry

Operasi multi berasal dari spesifikasi protokol Redis, mereka memiliki tujuan transaksional di luar pipelining: http://redis.io/commands/multi

Dalam hal cara kerja pipelining: http://redis.io/topics/pipelining ini hanya masalah klien menulis perintah ke Redis secepat Anda mengirimnya tanpa menunggu tanggapan sebelum menulis yang berikutnya. Klien melacak perintah yang dikirim dan kemudian menyelaraskan balasan dengan perintah yang dikirim setelah Redis membalas.

Terima kasih Bryce, saya mengerti cara kerja http://redis.io/topics/pipelining . dalam aplikasi node.js - bagaimana kode harus disusun sehingga permintaan disalurkan?

jadi pada contoh di bawah ini

hgetall & kedaluwarsa - apakah disalurkan atau tidak? Salah satu panggilan adalah panggilan balik di dalam.


fungsi getByID(tabel, id, selanjutnya) {
if (!sukses) mengembalikan setTimeout(fungsi () {
getByID(tabel, id, selanjutnya);
}, 2000);

var end = utils.getEndTime(),
    base = getBase(),
    client = getClient(PK2str(table, id)),
    key = getHashID(table, id);

base.sismember(table, key, function (err, val) {
    if (err || !val) return next();

    client.hgetall(key, function (err, val) {
        if (err || !val) return next(new Error('Expired'), id);

        val = arrays_parse(table, val);
        next(null, val);
        client.expire(key, cfg.ttl.shards);

        if (!exports.silent) {
            profiler.log('cache', {
                'table': table,
                'id': key,
                'method': 'getByID',
                'data': val,
                'time': end()
            });
        }
    });  
});

}

Semua perintah dikirim "melalui pipa" tetapi ini tidak akan pernah dikirim dalam kerangka tulis pipa yang sama karena satu atau dua alasan:

  1. Panggilan balik untuk sismember adalah apa yang memanggil panggilan hgetall -- oleh karena itu Anda secara implisit mencegah perintah-perintah ini untuk disalurkan bersama-sama untuk panggilan sismember yang diberikan. Callback tidak dipanggil sampai Redis membalas.
  2. Jika base dan client adalah klien Redis yang berbeda, mereka dapat _NEVER_ berbagi saluran yang sama.

Perintah harus dijalankan dari konteks yang sama* untuk melihat manfaat apa pun dari pipelining. Misalnya mirip dengan contoh PING di redis pipelining docs:

// These commands will all be pipelined together:
client.ping()
client.ping()
client.ping()
client.ping(function () {
  // This would *NEVER* be in the same pipeline frame as the other four because it requires a reply to be received first
  client.ping()
})

* atau dari konteks terpisah jika dikirim lebih cepat daripada yang dibalas Redis, tetapi jangan pernah membalas konteks yang bergantung

dapatkan sekarang - terima kasih! Ini komentar yang sangat berharga!

Saya pikir node_redis "pipelining otomatis" bukanlah pemipaan yang dirujuk oleh redis resmi.

Waktu ini disebut RTT (Waktu Pulang Pergi). Sangat mudah untuk melihat bagaimana hal ini dapat mempengaruhi kinerja ketika klien perlu melakukan banyak permintaan secara berurutan (misalnya menambahkan banyak elemen ke daftar yang sama, atau mengisi database dengan banyak kunci). Misalnya jika waktu RTT adalah 250 milidetik (dalam kasus tautan yang sangat lambat melalui Internet), bahkan jika server mampu memproses 100 ribu permintaan per detik, kami akan dapat memproses maksimal empat permintaan per detik.
Jika antarmuka yang digunakan adalah antarmuka loopback, RTT jauh lebih pendek (misalnya host saya melaporkan 0,044 milidetik ping 127.0.0.1), tetapi masih banyak jika Anda perlu melakukan banyak penulisan berturut-turut.

Apa yang dimaksud dengan pipelining oleh redis resmi adalah menggabungkan beberapa perintah dan mengirimkannya sekali untuk melawan latensi karena RTT, yang tidak ditangani oleh node_redis. Dan "automatica pipelining" di node_redis sebenarnya mengirim perintah sebanyak mungkin secara bersamaan dengan menggunakan model pemrograman async Node.

Inilah artikel bagus yang membahas masalah ini. http://informatikr.com/2012/redis-pipelining.html

@Vizwind @saritasa baik .multi dan .batch menggunakan pipelining seperti yang dipikirkan dari versi 2.2 pada.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

adamgajzlerowicz picture adamgajzlerowicz  ·  4Komentar

jackycchen picture jackycchen  ·  4Komentar

betimer picture betimer  ·  5Komentar

dotSlashLu picture dotSlashLu  ·  5Komentar

Mickael-van-der-Beek picture Mickael-van-der-Beek  ·  6Komentar