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
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,
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:
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.
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:
base
danclient
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:
* atau dari konteks terpisah jika dikirim lebih cepat daripada yang dibalas Redis, tetapi jangan pernah membalas konteks yang bergantung