Redis melaksanakan fungsi transaksi melalui multi, exec, buang dan jam tangan.
berbilang: mulakan transaksi
eksekusi: lakukan transaksi dan laksanakan
buang: batalkan transaksi
lihat: pantau sebarang bilangan kunci sebelum transaksi bermula
> multi OK > set bookName "Redis" QUEUED > get bookName QUEUED > sadd tag "Redis" "New Book" QUEUED > smembers tag QUEUED > exec 1) OK 2) "Redis" 3) (integer) 2 4) 1) "Redis" 2) "New Book"
> multi OK
Arahan ini menghidupkan Redis_multi option , biarkan pelanggan bertukar daripada keadaan bukan transaksi kepada keadaan transaksi
> set bookName "Redis" QUEUED > get bookName QUEUED > sadd tag "Redis" "New Book" QUEUED > smembers tag QUEUED
Arahan Redis tidak akan dilaksanakan serta-merta, tetapi akan masuk maju Pertama daripada baris gilir transaksi sehingga transaksi dilakukan. QUEUED menunjukkan bahawa arahan ini telah dimasukkan ke dalam baris gilir transaksi.
> exec 1) OK 2) "Redis" 3) (integer) 2 4) 1) "Redis" 2) "New Book"
Apabila melaksanakan perintah eksec, Redis melaksanakan arahan dalam baris gilir transaksi dengan cara masuk dahulu, keluar dahulu mengikut baris gilir transaksi yang disimpan oleh pelanggan: arahan pertama yang akan dibariskan Perintah yang dilaksanakan dahulu, dan perintah terakhir yang dimasukkan ke dalam baris gilir dilaksanakan yang terakhir. Selepas melaksanakan perintah exec, Redis menyimpan keputusan dalam baris gilir balasan dan menghantar baris gilir kepada klien. Pelanggan keluar dari keadaan transaksi dan transaksi selesai.
> multi OK > set author "lisi" QUEUED > discard OK > get author (nil)
buang ialah perintah untuk membatalkan transaksi, yang menunjukkan bahawa transaksi telah dibatalkan. Apabila pelanggan menamatkan keadaan transaksi dan kembali kepada keadaan bukan transaksi, pilihan Redis_multi perlu dimatikan.
# Redis 客户端1 > watch letter OK > multi OK > set letter a QUEUED > exec (nil) # Redis 客户端2 > set letter b OK # Redis 客户端1 > get letter "b"
Apabila pelanggan 1 memasuki transaksi, jam tangan menetapkan kunci huruf dan menetapkan nilainya kepada a, tetapi transaksi belum lagi serahkan. Klien 2 menetapkan nilai huruf kepada b. Selepas pelanggan 1 melakukan transaksi, hasil yang dikembalikan adalah sifar, tetapi dengan memanggil arahan get, nilai huruf boleh diperolehi sebagai b. Ini bermakna apabila kunci huruf ditukar oleh pelanggan lain, transaksi akan dibatalkan, tidak akan dilaksanakan dan akan gagal.
Arahan jam tangan memantau sebarang bilangan kunci sebelum transaksi bermula: apabila memanggil perintah excel untuk melaksanakan transaksi, jika mana-mana kunci yang dipantau telah diubah suai oleh pelanggan lain, keseluruhan transaksi tidak akan dilaksanakan lagi dan akan kembali secara langsung.
> set letter ac QUEUED > get letter ac (error) ERR wrong number of arguments for 'get' command > exec (error) EXECABORT Transaction discarded because of previous errors.
Pengecualian arahan dalam transaksi ialah ralat sintaks dan akan menyebabkan transaksi gagal dilaksanakan .
> multi OK > lpush books "Redis" QUEUED > incr books QUEUED > lpush books "Python" QUEUED > lrange books 0 -1 QUEUED > exec 1) (integer) 1 2) (error) WRONGTYPE Operation against a key holding the wrong kind of value 3) (integer) 2 4) 1) "Python" 2) "Redis"
Contoh di atas ialah urus niaga mengalami kegagalan pada pertengahan pelaksanaan, kerana perintah incr tidak boleh dilakukan pada rentetan Selepas urus niaga menemui kegagalan pelaksanaan arahan , seterusnya Perintah terus dilaksanakan, jadi nilai buku terus ditetapkan. Pengecualian ini hanya boleh dielakkan oleh pengaturcara dalam kod mereka.
Atom bermaksud sama ada ia berjaya dilaksanakan bersama-sama atau gagal bersama-sama dan ditarik balik. Semua API yang disediakan oleh Redis adalah operasi atom. Kemudian urus niaga Redis hanya perlu memastikan atomicity dalam kumpulan operasi, tetapi dalam kes pengecualian masa jalan, jika pengecualian arahan berlaku dalam transaksi, arahan lain akan terus dilaksanakan tidak dijamin seksual.
Pengecualian urus niaga
Jika terdapat ralat arahan, transaksi tidak boleh dilaksanakan Jika pengecualian masa jalan, Redis akan memasukkan ralat dalam hasil pemulangan dan tidak akan menjejaskan pelaksanaan seterusnya , jadi transaksi adalah konsisten.
Proses Redis telah ditamatkan
Dalam mod memori tulen, Redis tidak melakukan kegigihan Selepas memulakan semula, pangkalan data kosong, jadi ia konsisten dari segi transaksi.
Dalam mod RDB, transaksi tidak akan melaksanakan kerja menyimpan fail RDB di tengah-tengah Kerja RDB hanya boleh bermula selepas transaksi selesai. Oleh itu, proses Redis dimatikan semasa pelaksanaan transaksi, dan tidak kira betapa berjayanya, ia tidak akan disimpan ke fail RDB, jadi ia adalah konsisten.
Dalam mod AOF, sebahagian daripada penyata transaksi ditulis ke fail AOF dan berjaya disimpan ke fail AOF Apabila memulakan semula Redis, pastikan fail AOF tidak lengkap dan Redis keluar dengan satu kesilapan. Urus niaga yang tidak lengkap ini perlu dipadamkan sebelum permulaan semula boleh berjaya, jadi ia adalah konsisten.
Dalam mod AOF, urus niaga tidak ditulis ke fail AOF, jadi selepas memulakan semula pangkalan data Redis adalah data terkini yang berjaya disimpan ke fail AOF. Tiada data untuk transaksi ini, jadi ia adalah konsisten.
Redis ialah program proses tunggal, dan ia menjamin bahawa urus niaga tidak akan terganggu semasa melaksanakan transaksi, dan urus niaga boleh dijalankan sehingga semua arahan dalam baris gilir transaksi dilaksanakan . Jadi urus niaga diasingkan.
Dalam mod memori tulen, transaksi pastinya tidak berterusan.
Dalam mod RDB, pelayan mungkin gagal dalam tempoh selepas transaksi dilaksanakan dan sebelum fail RDB dikemas kini, jadi transaksi dalam mod RDB tidak tahan lama.
Dalam mod AOF, tambahkan arahan pada fail AOF, tetapi menulis fail tidak akan ditulis ke cakera serta-merta, tetapi akan disimpan dalam penimbal terlebih dahulu. Jadi terdapat selang yang sangat kecil antara data yang disimpan ke cakera. Transaksi dalam mod ini juga tidak tahan lama.
Atas ialah kandungan terperinci Analisis contoh transaksi Redis. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!