Dengan pertumbuhan berterusan transaksi Internet, transaksi yang diedarkan telah menjadi bahagian penting dalam sistem perniagaan. Dengan pengayaan berterusan kaedah pelaksanaan transaksi teragih, Redis, sebagai pangkalan data dalam memori yang digunakan secara meluas, secara beransur-ansur menjadi pilihan pertama untuk pelaksanaan transaksi teragih. Artikel ini terutamanya memperkenalkan cara Redis melaksanakan transaksi teragih.
Model transaksi Redis
Model transaksi yang disokong oleh Redis ialah operasi kelompok. Dalam transaksi, Redis boleh melaksanakan berbilang arahan. Berbilang arahan semuanya berjaya atau gagal dalam transaksi yang sama, memastikan integriti transaksi, jadi Redis boleh menyokong transaksi dengan baik.
Prinsip asas urus niaga Redis adalah untuk membungkus berbilang perintah ke dalam satu transaksi dan kemudian melaksanakannya secara atom Walau bagaimanapun, perlu diambil perhatian bahawa proses pelaksanaan transaksi Redis adalah berbeza daripada pangkalan data relasi lain yang akan dilaksanakan Beberapa langkah berikut:
1 Mulakan transaksi
2 Laksanakan berbilang perintah
3 Hantar transaksi
Tetapi proses pelaksanaan transaksi Redis adalah seperti berikut:
1. Mulakan transaksi
2. Laksanakan berbilang arahan
3. Perintah cache baris gilir
4. Hantar transaksi
Apabila Redis melaksanakan transaksi, berbilang arahan akan dimasukkan ke dalam baris gilir , arahan ini akan dilaksanakan secara atom sehingga transaksi dilakukan. Jika ralat berlaku semasa pelaksanaan transaksi, Redis akan mengembalikan kod ralat kepada pelanggan dan tidak akan melaksanakan arahan yang tidak dilaksanakan dalam transaksi.
Instance transaksi Redis
Kod berikut menunjukkan penggunaan mudah transaksi Redis:
require 'redis' # 连接Redis数据库 redis = Redis.new(host: 'localhost', port: 6379) # 初始化一个Redis事务对象 redis.multi do redis.set('key1', 'value1') redis.set('key2', 'value2') end
Dalam kod di atas, kami menggunakan objek transaksi Redis untuk melaksanakan dua arahan, ini Tujuan transaksi adalah untuk menetapkan nilai kunci1 kepada nilai1 dan nilai kunci2 kepada nilai2. Gunakan kaedah berbilang untuk memulakan transaksi Redis, gunakan kaedah yang ditetapkan untuk menetapkan nilai kunci dan gunakan kaedah exec untuk menyerahkan transaksi Redis Akhir sekali, Redis akan membungkus arahan ini secara automatik ke dalam urus niaga untuk pelaksanaan atom.
Pelaksanaan transaksi diedarkan Redis
Dalam sistem yang diedarkan, data operasi transaksi mungkin diedarkan dalam nod yang berbeza, jadi mekanisme diperlukan untuk memastikan ketekalan transaksi yang diedarkan . Transaksi teragih Redis mempunyai kaedah pelaksanaan berikut:
1 Gunakan arahan WATCH Redis
Dengan menggunakan arahan WATCH, Redis boleh memantau satu atau lebih pembolehubah utama. Jika pembolehubah ini telah diubah suai dalam pelaksanaan perintah sebelumnya, transaksi akan berhenti melaksanakan, yang boleh mengelakkan ralat yang disebabkan oleh data dikemas kini semasa memproses transaksi. Berikut ialah contoh penggunaan WATCH:
require 'redis' # 连接Redis数据库 redis = Redis.new(host: 'localhost', port: 6379) # 监视key redis.watch('key') # 开始事务 redis.multi do redis.set('key1', 'value1') end # 提交事务 redis.exec
Dalam kod di atas, kami menggunakan jam tangan untuk memantau sama ada kunci telah diubah suai Apabila transaksi mula dilaksanakan, jika didapati bahawa kunci telah diubah suai , pelaksanaan transaksi akan ditamatkan Selepas pelaksanaan, serahkannya melalui kaedah exec.
2. Gunakan kunci transaksi Redis
Jika anda menggunakan arahan WATCH, anda perlu mempertimbangkan akses serentak berbilang pelanggan, yang akan menyebabkan kemerosotan prestasi. Oleh itu, Redis juga menyediakan penyelesaian kunci teragih, yang boleh menggunakan arahan SETNX atau arahan SET Redis untuk melaksanakan kunci transaksi. Arahan SETNX hanya akan berjaya ditetapkan apabila kunci yang ditetapkan tidak wujud Ini memastikan bahawa kunci hanya akan diperolehi oleh satu pelanggan Masa tamat tempoh kunci boleh ditetapkan melalui arahan SET untuk memastikan keunikan dan keselamatan kunci. Kodnya adalah seperti berikut:
require 'redis' # 连接Redis数据库 redis = Redis.new(host: 'localhost', port: 6379) # 设置Redis锁 redis.set('lock_key', 'value', ex: 10, nx: true) # 执行事务 redis.multi do redis.set('key1', 'value1') end # 释放Redis锁 redis.del('lock_key') # 提交事务 redis.exec
Dalam kod di atas, kami menggunakan arahan yang ditetapkan untuk menetapkan kunci, menetapkan masa tamat tempoh kepada 10 saat, dan menetapkan parameter nx pada masa yang sama untuk mengelakkan pemerolehan berulang kunci itu.
3. Gunakan skrip Lua Redis
Selain daripada dua kaedah di atas, anda juga boleh menggunakan skrip Lua Redis untuk melaksanakan fungsi transaksi yang diedarkan. Skrip Lua menyokong operasi atom, dan berbilang arahan boleh dilaksanakan dalam operasi yang sama. Dengan menyesuaikan skrip Lua, kami boleh membungkus berbilang arahan Redis ke dalam operasi atom untuk mencapai transaksi yang diedarkan. Berikut ialah contoh penggunaan skrip Lua:
redis.call('WATCH', KEYS[1]) if redis.call('GET', KEYS[1]) == ARGV[1] then redis.call('MULTI') redis.call('SET', KEYS[1], ARGV[2]) redis.call('SET', KEYS[2], ARGV[3]) redis.call('EXEC') end redis.call('UNWATCH')
Dalam kod di atas, kami menggunakan skrip Lua untuk melaksanakan transaksi yang diedarkan Sebelum transaksi bermula, gunakan arahan WATCH untuk memantau status kunci. Selepas pelaksanaan, gunakan arahan UNWATCH untuk membatalkan pemantauan kunci. Melalui skrip Lua, kami boleh membungkus berbilang arahan Redis ke dalam operasi atom untuk mencapai transaksi yang diedarkan.
Ringkasan
Model transaksi Redis ialah operasi kelompok, memastikan integriti transaksi. Dalam sistem yang diedarkan, data operasi urus niaga boleh diedarkan di antara nod yang berbeza, jadi mekanisme diperlukan untuk memastikan konsistensi transaksi yang diedarkan. Redis menyediakan tiga kaedah pelaksanaan: arahan WATCH, kunci transaksi dan skrip Lua. Kaedah mana yang hendak dipilih perlu dipilih berdasarkan keperluan perniagaan.
Atas ialah kandungan terperinci Penjelasan terperinci mengenai transaksi yang diedarkan yang dilaksanakan oleh Redis. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!