Sebagian besar pertanyaan Anda tersedia dalam dokumentasi referensi Spring Data Redis.
Sebelum menggali ke dalam Pipelining, satu multi-get dari satu Hash tidak memerlukan Pipelining karena itu hanya satu perintah. Pipelining tidak akan meningkatkan performa/stabilitas/… interaksi Redis Anda.
Pipelining diatur sebagai panggilan balik dan dimaksudkan untuk mengeluarkan banyak perintah tanpa segera menunggu hasilnya – anggap saja sebagai kumpulan di mana Anda mendapatkan semua hasil nanti. Karena pipelining menyinkronkan respons di bagian paling akhir, Anda tidak menerima nilai hasil dalam callback tetapi di bagian paling akhir, saat sesi pipelining disinkronkan dan executePipelined(…)
berakhir.
Kode Anda seharusnya terlihat seperti:
List<Object> results = getRedisTemplate().executePipelined(new RedisCallback<Object>() {
@Override
public Object doInRedis(RedisConnection connection) {
connection.hMGet(key.getBytes(), params);
return null;
}
});
List<Object> hmget = (List<Object>) results.get(0);
Anda harus menggunakan hanya koneksi yang Anda terima sebagai argumen panggilan balik karena koneksi telah memasuki mode pipelining. Mendapatkan koneksi dari luar callback (seperti template.getConnectionFactory().getConnection()
) akan membuka koneksi baru dan menjalankan perintah Redis dengan menunggu tanggapan – tidak ada pipelining yang diterapkan ke koneksi eksternal yang diperoleh.
Anda juga dapat menggunakan metode RedisTemplate
alih-alih bekerja dengan koneksi biasa. executePipelined(…)
mengikat koneksi yang digunakan dalam callback ke Thread saat ini dan menggunakan kembali koneksi terikat tersebut jika Anda memanggil metode API template.
Mengenai pertanyaan Lua Anda:Panggilan kode/metode tidak dialihkan ke Lua.