Artikel ini akan memperkenalkan anda kepada kunci yang diedarkan dalam Redis, mengapa kunci yang diedarkan diperlukan dan cara Redis melaksanakan kunci yang diedarkan saya harap ia akan membantu anda.
Mengapa kunci yang diedarkan diperlukan
Gunakan Tujuan kunci yang diedarkan tidak lebih daripada untuk memastikan hanya satu pelanggan boleh beroperasi pada sumber yang dikongsi pada masa yang sama.
Kami sering menghadapi masalah konkurensi apabila melakukan pemprosesan logik dalam aplikasi yang diedarkan. [Pengesyoran berkaitan: Tutorial video Redis]
Sebagai contoh, jika operasi memerlukan pengubahsuaian status pengguna, mengubah suai status memerlukan membaca status pengguna terlebih dahulu, mengubah suai dalam memori dan kemudian menyimpannya semula selepas pengubahsuaian. Jika operasi sedemikian dilakukan pada masa yang sama, masalah konkurensi akan timbul kerana kedua-dua operasi membaca dan keadaan menyimpan bukan atom.
Pada masa ini, kunci yang diedarkan digunakan untuk mengehadkan pelaksanaan serentak program. Sebagai sistem perisian tengah caching, redis boleh menyediakan mekanisme kunci teragih seperti ini
Intipatinya adalah untuk menduduki lubang dalam redis Apabila proses lain mahu menduduki lubang itu telah mendudukinya, tunggu dan cuba lagi kemudian
Secara umumnya, kunci teragih yang tersedia dalam persekitaran pengeluaran perlu memenuhi perkara berikut:
innodb_lock_wait_timeout
, dalam persekitaran teragih, benang yang sama pada nod yang sama Jika kunci diperoleh, permintaan; masih boleh berjaya lagi; Kaedah penggunaan SETNX ialah :
Hanya apabila kunci kunci tidak wujud, nilai kunci kunci ditetapkan kepada nilai Jika kunci kunci wujud, SETNX tidak mengambil sebarang tindakan.SETNX key value
boolean result = jedis.setnx("lock-key",true)== 1L; if (result) { try { // do something } finally { jedis.del("lock-key"); } }
Untuk tujuan ini, kita boleh menambah tempoh tamat masa pada kunci ini
Kesan melaksanakan
adalah bersamaan dengan kesan melaksanakanSET key value EX seconds
SETEX key seconds value
Melaksanakan
SET key value PX milliseconds
PSETEX key milliseconds value
String result = jedis.set("lock-key",true, 5); if ("OK".equals(result)) { try { // do something } finally { jedis.del("lock-key"); } }
Bayangkan benang A tertentu memperoleh kunci dan menetapkan masa tamat tempoh ialah 10s, dan kemudian mengambil masa 15s untuk melaksanakan logik perniagaan Pada masa ini, kunci yang diperolehi oleh utas A telah dilepaskan secara automatik oleh mekanisme tamat tempoh Redis
Selepas utas A memperoleh kunci dan 10s. telah berlalu, tukar Kunci mungkin telah diperolehi oleh benang lain. Apabila utas A selesai melaksanakan logik perniagaan dan bersedia untuk membuka kunci (
), adalah mungkin untuk memadamkan kunci yang telah diperoleh oleh utas lain.DEL key
Jadi cara terbaik ialah menentukan sama ada kunci itu milik anda semasa membuka kunci Kami boleh menetapkan nilai kepada nilai unik
key
Apabila membuka kunci, iaitu, apabila memadamkan kekunci, tentukan dahulu sama ada nilai yang sepadan dengan kunci itu sama dengan nilai yang ditetapkan sebelum ini, jika ia sama, kunci itu boleh dipadamkanuniqueValue
Di sini kita boleh melihatnya sepintas lalu Masalah timbul:
danString velue= String.valueOf(System.currentTimeMillis()) String result = jedis.set("lock-key",velue, 5); if ("OK".equals(result)) { try { // do something } finally { //非原子操作 if(jedis.get("lock-key")==value){ jedis.del("lock-key"); } } }
GET
Jika kita hanya perlu memastikan bahawa kod buka kunci adalah atom, kita boleh menyelesaikan masalah DEL
skrip Lua
, contohnya adalah seperti berikut :di mana
mewakili nilai unik yang ditentukan semasa menetapkan kunci.if redis.call("get",KEYS[1]) == ARGV[1] then return redis.call("del",KEYS[1]) else return 0 end
Disebabkan atomicity skrip Lua, semasa proses Redis melaksanakan skrip, arahan klien lain perlu menunggu skrip Lua dilaksanakan sebelum ia boleh dilaksanakan. ARGV[1]
Pastikan bahawa masa tamat tempoh adalah lebih besar daripada masa pelaksanaan perniagaan
Untuk mengelakkan berbilang rangkaian daripada melaksanakan kod perniagaan pada masa yang sama, adalah perlu untuk memastikan bahawa masa tamat tempoh adalah lebih besar daripada masa pelaksanaan perniagaan
Tingkatkan Atribut jenis booleanyang digunakan untuk mengenal pasti sama ada untuk mendayakan masa tamat penyegaran semula yang dijadualkan
sedang menambah kaedah isOpenExpirationRenewal
untuk mendayakan utas untuk menyegarkan masa tamat tempoh
kod penguncian sedang diperolehi Selepas kunci berjaya, tetapkan isOpenExpirationRenewal kepada benar dan panggil kaedah scheduleExpirationRenewal
untuk memulakan urutan yang menyegarkan masa tamat tempoh 🎜>Tambah baris kod pada kod buka kunci, tetapkan atribut isOpenExpirationRenewal kepada palsu dan hentikan mengundi urutan yang menyegarkan masa tamat tempoh.
scheduleExpirationRenewal
Pelaksanaan Semula
Perbezaan masa antara setiap panggilan jadual berjadual ini ialah internalLockLeaseTime / 3
, iaitu 10 saat
Secara lalai, masa penguncian ialah 30 saat Jika perniagaan terkunci belum selesai, maka saat, pembaharuan akan dilakukan dan kunci akan ditetapkan semula kepada 30 saat 30-10 = 20
Algoritma Redlock adalah untuk menyelesaikan masalah ini
Untuk gunakan Redlock, anda perlu menyediakan berbilang contoh, yang sebelum ini bebas antara satu sama lain dan tidak mempunyai hubungan tuan-hamba. Seperti kebanyakan algoritma yang diedarkan, kunci merah juga menggunakan kebanyakan mekanisme Redis
berjaya, kunci itu dipertimbangkan berjaya. Apabila melepaskan kunci, arahan del perlu dihantar ke semua nod. Walau bagaimanapun, algoritma Redlock juga perlu mempertimbangkan banyak isu terperinci seperti percubaan semula ralat dan drift jam Pada masa yang sama, kerana set
perlu membaca dan menulis ke berbilang nod, ini bermakna berbanding dengan contoh tunggal Redis, prestasi akan. menjadi lebih rendah. Redlock
Dengan mengandaikan bahawa kluster semasa mempunyai 5 nod, pelanggan yang menjalankan algoritma Redlock melakukan langkah berikut untuk melengkapkan operasi pemerolehan kunci
mempunyai pelaksanaan terbina dalam
Redisson
RedLock
https://redis.io/topics/distlock
https://github.com/redisson/redisson/ wiki Masalah RedLock:
RedLock hanya memastikan ketersediaan tinggi kunci, tetapi tidak menjamin ketepatan kunci
RedLock ialahSistem teragih yang banyak bergantung pada jam sistem
Kritikan Martin terhadap RedLock:
RedLock terlalu berat untuk senario peningkatan kecekapan.
Pengarang: Dengan Hati yang Jauh! !Lebih banyak pengaturcaraan berkaitan Untuk pengetahuan, sila layari:
Video Pengaturcaraan
Atas ialah kandungan terperinci Mengapa kunci teragih diperlukan dalam Redis? Bagaimana untuk mencapai. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!