Saya akan menyimpan pasangan nilai kunci dalam Redis tetapi jumlah kunci hanya 4. Karena akan ada beberapa proses yang memperbarui nilai parally, saya berencana untuk menggunakan transaksi redis menggunakan WATCH dan {} EXEC perintah.

Algoritma saya adalah sesuatu seperti ini:

GET key
WATCH key
MULTI
    SET key new_val
EXEC

Perhatian utama saya adalah, sejak WATCH menggunakan penguncian optimis, ketika saya akan memiliki beberapa proses (jauh lebih dari jumlah tombol, yang hanya 4) mencoba memperbarui nilai, tingkat kegagalan transaksi akan sangat tinggi.

Apakah ini benar? Apakah ada cara untuk mencegah hal ini?

0
Stupid Man 3 April 2021, 09:02

1 menjawab

Jawaban Terbaik

Tidak jelas mengapa Anda membutuhkan transaksi di sini kecuali Anda melakukan sesuatu dalam aplikasi Anda dengan balasan untuk GET key. Karena itu saya akan berasumsi bahwa Anda menggunakan nilai untuk sesuatu yang bermakna, jika tidak, Anda dapat menjatuhkan semantik transaksi dan hanya menelepon SET key new_val.

Penguncian optimis terutama dimaksudkan untuk digunakan dalam kasus di mana ada pertikaian rendah untuk sumber daya. Sejak penggunaan kasus yang Anda gambarkan jelas sebaliknya, itu mungkin akan menghasilkan tingkat kegagalan yang tinggi. Ini tidak mengatakan bahwa Redis dan aplikasi Anda tidak akan berfungsi, tetapi itu berarti ada potensi untuk banyak upaya sia-sia.

Saya akan menyarankan Anda mempertimbangkan untuk beralih jika memungkinkan untuk menggunakan skrip Lua sisi server Redis. Ini menghalangi, atom, dan membiarkan Anda membaca dan memanipulasi data secara bermakna dalam redis secara terprogram. Lihat EVAL perintah untuk detailnya.

3
Itamar Haber 3 April 2021, 15:38