Di balik layar, SE.Redis melakukan sedikit pekerjaan untuk mencoba menghindari fragmentasi paket, jadi tidak mengherankan jika hal ini sangat mirip dalam kasus Anda. Perbedaan utama antara batching dan flat pipelining adalah:
- sebuah batch tidak akan pernah disisipkan dengan operasi yang bersaing pada multiplexer yang sama (walaupun mungkin disisipkan di server; untuk menghindarinya Anda perlu menggunakan
multi
/exec
transaksi atau skrip Lua) - sebuah batch akan selalu menghindari kemungkinan paket berukuran kecil, karena ia mengetahui semua data sebelumnya
- tetapi pada saat yang sama, seluruh batch harus diselesaikan sebelum apa pun dapat dikirim, jadi ini membutuhkan lebih banyak buffering dalam memori dan dapat menimbulkan latensi secara artifisial
Dalam kebanyakan kasus, Anda akan melakukan lebih baik dengan menghindari batching, karena SE.Redis mencapai sebagian besar dari apa yang dilakukannya secara otomatis ketika hanya menambahkan pekerjaan.
Sebagai catatan akhir; jika Anda ingin menghindari overhead lokal, satu pendekatan terakhir mungkin:
redisDB.SetAdd(string.Format(keyFormat, row.Field<int>("Id")),
row.Field<int>("Value"), flags: CommandFlags.FireAndForget);
Ini mengirimkan semuanya, tidak menunggu tanggapan atau mengalokasikan Task
yang tidak lengkap s untuk mewakili nilai masa depan. Anda mungkin ingin melakukan sesuatu seperti Ping
di akhir tanpa api-dan-lupa, untuk memeriksa server masih berbicara dengan Anda. Perhatikan bahwa menggunakan fire-and-forget berarti Anda tidak akan melihat kesalahan server yang dilaporkan.