Adakah transaksi Redis menyokong ACID? Artikel berikut akan membawa anda memahami urus niaga Redis, memperkenalkan cara Redis melaksanakan urus niaga dan bercakap tentang sama ada transaksi Redis menyokong ACID. Saya harap ia akan membantu anda.
Pewawancara Tencent: "Adakah anda memahami urus niaga Redis? Bolehkah mekanisme transaksinya merealisasikan sifat ACID
Cheng Xuyuan : "Menggaruk kepala saya, ini... Saya tahu skrip Lua boleh melaksanakan transaksi..."
Penemuduga Tencent: "Baiklah, balik dan tunggu pemberitahuan
Ma Ge , saya mendapat banyak tawaran, tetapi saya tidak sangka akhirnya saya kalah dalam soalan "Bagaimana Redis melaksanakan transaksi?"
Mari kita analisa langkah demi langkah:
Apakah itu ACID transaksi?
Bagaimana Redis melaksanakan transaksi?
Apakah sifat yang boleh dicapai oleh transaksi Redis?
Pelaksanaan skrip Lua.
Kapten Mojin dalam Hantu Meniup Tanglung "Lembah Serangga Yunnan" mempunyai pepatah yang dipanggil " He Ze" "Hidup, bahagian, mati." Untuk mencari Muchen Bead, mereka bertiga mempunyai pembahagian kerja yang jelas dan bekerjasama untuk maju dan berundur bersama untuk berjaya.
Transaksi ialah unit kawalan serentak, yang terdiri daripada urutan operasi sama ada semua operasi ini dilaksanakan atau tiada satu pun daripadanya dilaksanakan. [Cadangan berkaitan: Tutorial video Redis]
"Ia ialah unit kerja yang tidak boleh dibahagikan."
Apabila transaksi dilaksanakan, ia akan memberikan jaminan atribut khas:
Atomicity: berbilang operasi transaksi mesti diselesaikan, atau tiada satu pun daripadanya mesti diselesaikan ( ps: Bagaimana MySQL mencapai atomicity? Komen dalam kawasan mesej adalah dialu-alukan); Perintah sebelum dan selepas pelaksanaan adalah semua keadaan data undang-undang.
Ketahanan: Setelah transaksi dilakukan, semua pengubahsuaian akan disimpan secara kekal dalam pangkalan data dan data tidak akan hilang walaupun sistem ranap dan dimulakan semula.
MULTI
dan Perintah 🎜>TONTON adalah asas untuk Redis melaksanakan transaksi. Proses pelaksanaan transaksi Redis terdiri daripada tiga langkah: Buka transaksi;
Lakukan transaksi atau buang;
Pelanggan menghantar satu siri arahan untuk dilaksanakan dalam transaksi kepada pelayan.
Perlu diambil perhatian bahawa walaupun arahan dihantar ke pelayan, tika Redis hanya menyimpan sementara siri arahan ini dalam baris gilir arahan dan tidak akan melaksanakannya dengan serta-merta.MULTI
Laksanakan transaksi atau buangPelanggan menghantar arahan untuk menyerahkan atau membuang transaksi ke pelayan, dan biarkan Redis melaksanakan arahan yang dihantar dalam langkah kedua Arahan khusus atau arahan baris gilir yang jelas, hentikan pelaksanaan.
Redis boleh menjadualkan pelaksanaan perintah baris gilir hanya apabila
EXECdipanggil.
Anda juga boleh menggunakan BUANG untuk membuang arahan yang disimpan dalam baris gilir dalam langkah kedua.
Kes transaksi Redis
Laksanakan kod sampel kami melalui tapak web penyahpepijatan dalam talian: try.redis.io Laksanakan seperti biasa melalui Kami melihat hasil pulangan selepas setiap arahan baca dan tulis dilaksanakan ialah Apabila perintah Tinggalkan transaksi Buang arahan baris gilir melalui Ma Ge, transaksi Redis Boleh Sifat ASID dijamin? Ini soalan yang bagus, mari kita menganalisisnya bersama-sama. Transaksi Redis boleh melaksanakan berbilang arahan pada satu masa, dan disertakan dengan tiga jaminan penting berikut: Arahan kelompok sedang dijalankan dilaksanakan Perintah EXEC akan dimasukkan ke dalam baris gilir untuk storan sementara sebelum; perintah yang tinggal masih akan dilaksanakan; Semasa pelaksanaan transaksi, arahan yang diserahkan oleh pelanggan lain tidak akan dimasukkan ke dalam urutan pelaksanaan perintah semasa. Kod Abang, jika ralat berlaku semasa pelaksanaan transaksi, prestasi atom dijamin Apa ? itu sendiri adalah salah. Seperti berikut: Apabila arahan dibariskan dalam baris gilir, Redis akan melaporkan ralat dan merekodkan ralat itu. Pada masa ini, kami masih boleh terus menyerahkan operasi arahan. Selepas melaksanakan perintah , Redis akan menolak untuk melaksanakan semua operasi arahan yang diserahkan dan mengembalikan hasil kegagalan transaksi Berikut ialah contoh ralat dalam perintah beratur, menyebabkan kegagalan transaksi: EXEC melaporkan ralat selepas pelaksanaan Operasi transaksi Semasa beratur, jenis data arahan dan operasi tidak sepadan, tetapi tika Redis tidak mengesan ralat. Walau bagaimanapun, selepas melaksanakan arahan EXEC, Redis akan melaporkan ralat apabila ia benar-benar melaksanakan arahan ini. Ma Ge, mengapa Redis tidak menyokong rollback? Jika Redis menghidupkan log AOF, maka hanya sebahagian daripada operasi transaksi akan direkodkan dalam log AOF. Kami perlu menggunakan alat redis-check-aof untuk menyemak fail log AOF Alat ini boleh mengalih keluar operasi transaksi yang belum selesai daripada fail AOF. Dengan cara ini, selepas kami menggunakan AOF untuk memulihkan kejadian, operasi transaksi tidak akan dilaksanakan lagi, sekali gus memastikan atomicity. : Ralat akan dilaporkan apabila perintah itu dimasukkan ke dalam baris gilir, dan pelaksanaan transaksi akan ditinggalkan untuk memastikan atomicity; > Apabila arahan dimasukkan ke dalam baris gilir Tiada ralat dilaporkan, tetapi ralat dilaporkan semasa pelaksanaan sebenar, dan atomicity tidak dijamin Konsistensi akan dipengaruhi oleh arahan yang salah dan masa kegagalan contoh, akan berlaku menjadi dua kegagalan contoh Masa kejadian dimensi boleh dianalisis dalam tiga situasi. Sebelum pelaksanaan EXEC, ralat akan dilaporkan selepas menyertai baris gilir Transaksi akan ditinggalkan, jadi konsistensi boleh dijamin. Selepas EXEC dilaksanakan, ralat akan dilaporkan semasa pelaksanaan sebenar Pelaksanaan dengan ralat tidak akan dilaksanakan seperti biasa konsistensi boleh dijamin. Apabila EXEC dilaksanakan, instance gagal Selepas instance gagal, ia akan dimulakan semula Ini berkaitan dengan kaedah pemulihan data RDB atau AOF akan dibincangkan mengikut kes. Jika kami tidak mendayakan RDB atau AOF, maka selepas kejadian gagal dan dimulakan semula, data akan hilang dan pangkalan data akan konsisten. Jika kita menggunakan petikan RDB, kerana petikan RDB tidak akan dilaksanakan apabila transaksi dilaksanakan. Oleh itu, hasil operasi arahan transaksi tidak akan disimpan ke petikan RDB Apabila menggunakan petikan RDB untuk pemulihan, data dalam pangkalan data akan konsisten. Jika kami menggunakan log AOF dan contoh gagal sebelum operasi transaksi direkodkan dalam log AOF, maka data pangkalan data yang dipulihkan menggunakan log AOF akan konsisten. Jika hanya beberapa operasi direkodkan dalam log AOF, kami boleh menggunakan redis-check-aof untuk mengosongkan operasi yang telah selesai dalam transaksi, dan pangkalan data akan konsisten selepas pemulihan. Pengasingan Pelaksanaan transaksi boleh dibahagikan kepada perintah beratur (sebelum arahan EXEC dilaksanakan) dan perintah pelaksanaan sebenar (selepas arahan EXEC dilaksanakan) Dua peringkat. Jadi semasa pelaksanaan serentak, kami menganalisis kedua-dua peringkat ini dalam dua situasi: Operasi serentak dilaksanakan sebelum perintah Operasi serentak selepas perintah Saudara Kod, apakah mekanisme WATCH? Mari fokus pada situasi pertama: apabila perintah EXEC sesuatu transaksi belum dilaksanakan, operasi perintah transaksi disimpan sementara dalam baris gilir perintah. Pada masa ini, jika terdapat operasi serentak lain dan kunci yang sama diubah suai, anda perlu menyemak sama ada transaksi menggunakan mekanisme Fungsi mekanisme WATCH adalah untuk memantau perubahan nilai satu atau lebih kunci sebelum transaksi dilaksanakan Apabila transaksi memanggil arahan EXEC untuk melaksanakan, mekanisme WATCH akan menyemak dahulu sama ada kunci yang dipantau mempunyai. telah diubah suai oleh pelanggan lain. Jika diubah suai, pelaksanaan transaksi akan ditinggalkan untuk mengelakkan pengasingan transaksi daripada dimusnahkan. Pada masa yang sama, pelanggan boleh melaksanakan transaksi semula Pada masa ini, jika tiada operasi serentak untuk mengubah suai data transaksi, transaksi boleh dilaksanakan secara normal, dan pengasingan juga dijamin. . Tiada WATCH Jika tiada mekanisme WATCH, operasi serentak membaca dan menulis data sebelum arahan EXEC dilaksanakan. Apabila EXEC dilaksanakan, data yang akan dikendalikan dalam transaksi telah berubah dan Redis tidak mengasingkan transaksi. Operasi serentak diterima dan dilaksanakan selepas EXEC Bagi kes kedua, kerana Redis menggunakan satu utas untuk melaksanakan arahan , dan , selepas arahan EXEC dilaksanakan, Redis akan memastikan semua arahan dalam baris gilir arahan dilaksanakan terlebih dahulu sebelum melaksanakan arahan seterusnya. Jadi, dalam kes ini, operasi serentak tidak akan memecahkan pengasingan transaksi. Kegigihan Jika Redis tidak menggunakan RDB atau AOF, maka atribut kegigihan transaksi mesti Tiada jaminan. Jika Redis menggunakan mod RDB, maka selepas transaksi dilaksanakan tetapi sebelum petikan RDB seterusnya dilaksanakan, jika ranap kejadian berlaku dan data hilang, dalam kes ini, Data pengubahsuaian transaksi juga tidak dijamin untuk tahan lama. Jika Redis menggunakan mod AOF, akan berlaku kehilangan data kerana tiga pilihan konfigurasi mod AOF: tidak, setiap saat dan sentiasa. Oleh itu, sifat ketahanan transaksi masih tidak terjamin. Tidak kira apa mod kegigihan yang diguna pakai Redis, sifat ketahanan transaksi tidak dijamin. Ringkasan Mekanisme transaksi Redis boleh menjamin konsistensi dan pengasingan, tetapi ia tidak dapat menjamin ketahanan. Walau bagaimanapun, kerana Redis sendiri adalah pangkalan data dalam memori, kegigihan bukanlah atribut yang diperlukan Kami lebih mengambil berat tentang tiga sifat atomicity, konsistensi dan pengasingan. Situasi atomicity lebih rumit Apabila sintaks arahan yang digunakan dalam transaksi tidak betul, atomicity tidak dijamin Dalam kes lain, transaksi boleh dilaksanakan secara atom. Untuk lebih banyak pengetahuan berkaitan pengaturcaraan, sila lawati: Pengenalan kepada Pengaturcaraan! ! MULTI
dan EXEC
Jalankan proses transaksi: # 开启事务
> MULTI
OK
# 开始定义一些列指令
> SET “公众号:码哥字节” "粉丝 100 万"
QUEUED
> SET "order" "30"
QUEUED
> SET "文章数" 666
QUEUED
> GET "文章数"
QUEUED
# 实际执行事务
> EXEC
1) OK
2) OK
3) OK
4) "666"
QUEUED
, yang bermaksud terima kasih Operasi telah disimpan sementara dalam baris gilir arahan , dan tiada pelaksanaan sebenar. EXEC
dilaksanakan, anda boleh melihat data tindak balas setiap arahan. MULTI
dan DISCARD
: # 初始化订单数
> SET "order:mobile" 100
OK
# 开启事务
> MULTI
OK
# 订单 - 1
> DECR "order:mobile"
QUEUED
# 丢弃丢列命令
> DISCARD
OK
# 数据没有被修改
> GET "order:mobile"
"100"
Adakah transaksi Redis memuaskan ACID?
Semasa transaksi, dua jenis ralat arahan mungkin dihadapi:
Arahan yang dihantar sebelum melaksanakan perintah Bilangan parameter salah;
EXEC
Nama arahan salah dan arahan yang tidak wujud digunakan maxmemory
Selepas melaksanakan perintah EXEC
EXEC
EXEC melaporkan ralat sebelum pelaksanaanEXEC
Dengan cara ini, semua arahan dalam transaksi tidak akan dilaksanakan lagi, memastikan atomicity. #开启事务
> MULTI
OK
#发送事务中的第一个操作,但是Redis不支持该命令,返回报错信息
127.0.0.1:6379> PUT order 6
(error) ERR unknown command `PUT`, with args beginning with: `order`, `6`,
#发送事务中的第二个操作,这个操作是正确的命令,Redis把该命令入队
> DECR b:stock
QUEUED
#实际执行事务,但是之前命令有错误,所以Redis拒绝执行
> EXEC
(error) EXECABORT Transaction discarded because of previous errors.
Sebenarnya, Redis tidak menyediakan mekanisme rollback. Walaupun Redis menyediakan arahan DISCARD. Walau bagaimanapun, arahan ini hanya boleh digunakan untuk secara aktif meninggalkan pelaksanaan transaksi dan mengosongkan baris gilir perintah sementara, dan tidak mempunyai kesan gulung balik.
Kegagalan berlaku semasa pelaksanaan EXEC
EXEC
dan pengasingan perlu diluluskan WATCH
Mekanisme dijamin; EXEC
, pengasingan boleh dijamin. WATCH
.
Atas ialah kandungan terperinci Apakah ACID transaksi? Bolehkah urus niaga Redis melaksanakan ACID?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!