Rumah  >  Artikel  >  pangkalan data  >  Bagaimanakah Redis melaksanakan kunci teragih? Mari bercakap tentang kaedah pelaksanaan

Bagaimanakah Redis melaksanakan kunci teragih? Mari bercakap tentang kaedah pelaksanaan

青灯夜游
青灯夜游ke hadapan
2021-11-30 19:25:071885semak imbas

Bagaimana untuk menggunakan Redis untuk melaksanakan kunci yang diedarkan? Artikel berikut akan memperkenalkan kepada anda kaedah melaksanakan kunci yang diedarkan berdasarkan Redis. Saya harap ia akan membantu anda!

Bagaimanakah Redis melaksanakan kunci teragih? Mari bercakap tentang kaedah pelaksanaan

Dalam sistem yang diedarkan, anda akan menghadapi situasi di mana sumber yang dikongsi oleh berbilang nod perlu dikunci. Kunci yang diedarkan biasanya disimpan dalam sistem storan kongsi dan boleh dikongsi serta diakses oleh berbilang nod. [Cadangan berkaitan: Tutorial video Redis]

Intipati kunci

Ringkasnya, kunci boleh diwakili oleh pembolehubah. Contohnya, dalam program berbilang benang satu mesin, kunci sumber tertentu boleh diwakili oleh satu bit data. Iaitu, 0 bermakna tiada sumber boleh diakses dan 1 bermakna kunci sumber telah diperoleh oleh urutan lain dan tidak boleh diakses.

Memperoleh dan melepaskan kunci sumber tertentu pada asasnya adalah untuk mendapatkan dan mengubah suai nilai pembolehubah ini. Jika nilainya ialah 0, ubah suainya kepada 1 untuk melengkapkan proses pemerolehan Jika nilai yang diakses bukan 0, pemerolehan kunci gagal jika kunci telah diperoleh sebelum ini, nilai pembolehubah yang mewakili kunci diubah suai 0. Sebenarnya, ia adalah operasi melepaskan kunci.

Dalam senario yang diedarkan, cara untuk melaksanakan kunci adalah sama, kecuali pembolehubah yang mewakili kunci sumber perlu disimpan dalam sistem storan kongsi. Sistem storan kongsi ini boleh menjadi Redis atau mana-mana sistem lain yang boleh menyediakan storan data.

Pelaksanaan kunci teragih berdasarkan Redis

Langkah 1: Pelaksanaan awal fungsi

Untuk kes menggunakan Redis sebagai sistem storan kongsi ini, pembolehubah yang mewakili kunci sumber tertentu ialah pasangan nilai kunci dalam Redis. Jika sumber yang perlu ditambah dengan kunci teragih dipanggil resource_a, kita boleh memanggil kunci pembolehubah kunci resource_a dalam Redis lock_a.

Sebagai contoh, jika nod 1 perlu memperoleh kunci, ia akan mengakses nilai lock_a dalam Redis Dengan mengandaikan bahawa nilai yang diperolehi ialah 0, nod 1 akan menyelesaikan operasi mengunci selepas menetapkan nilai ini kepada 1. Pada masa ini, nod dua juga perlu mendapatkan kunci resource_a Ia mengakses nilai lock_a dalam Redis dan mendapati bahawa nilainya ialah 1, menunjukkan bahawa kunci telah diperolehi oleh nod lain dan tidak dilepaskan dua gagal mengunci resource_a .

Apabila nod perlu melepaskan kunci, ia hanya perlu menetapkan nilai lock_a dalam Redis kepada 0 untuk melengkapkan keluaran kunci Selepas itu, nod lain boleh memperoleh kunci sumber semula.

Langkah 2: Atomisasi operasi penguncian

Dalam penerangan di atas, penguncian bukan satu operasi, tetapi termasuk berbilang langkah: Baca pembolehubah kunci, tentukan nilai pembolehubah, dan ubah suai pembolehubah kunci. Ketiga-tiga operasi ini perlu atom.

Dalam Redis, terdapat perintah SETNX, yang digunakan untuk menetapkan nilai pasangan nilai kunci Tidak seperti perintah SET, ia akan menentukan sama ada pasangan nilai kunci wujud terlebih dahulu dan hanya apabila KEY yang ditentukan tidak wujud Hanya apabila nilai ditetapkan, tetapan nilai akan dilaksanakan, jika tidak, tiada apa yang akan dilaksanakan. SETNX bermaksud "SET jika Not eXist". Penggunaannya adalah sama seperti SET:

SETNX lock_a 1

Dengan cara ini, apabila anda perlu memperoleh kunci, gunakan arahan SETNX untuk menetapkan nilai untuk lock_a Jika tetapan berjaya, kunci diperoleh , jika ia gagal, kunci tidak diperoleh; Apabila anda perlu melepaskan kunci, gunakan operasi DEL untuk memadam pasangan nilai kunci.

Ini melaksanakan operasi atom untuk memperoleh dan melepaskan kunci.

Langkah ketiga: Elakkan kunci daripada tidak dilepaskan selepas dikunci

Seterusnya, pertimbangkan masalah lebih awal Jika nod memperoleh kunci, disebabkan pengecualian program dan sebab lain, ia akan menyebabkan Kunci belum dilepaskan Pada masa ini, kunci akan sentiasa dipegang olehnya dan tidak boleh dilepaskan, dan nod lain tidak boleh mengakses sumber.

Untuk mengelakkan keadaan ini, kita mesti menetapkan masa tamat tempoh untuk pembolehubah kunci apabila pembolehubah kunci tamat tempoh, kita boleh meminta semula kunci, dengan itu mengelakkan masalah ini.

Arahan SETNX tidak mempunyai pilihan untuk menetapkan masa tamat tempoh

Di atas Perintah itu bermakna jika lock_a tidak wujud, nilainya ditetapkan kepada 1 dan ia tamat tempoh selepas 10 saat.
SET lock_a 1 NX PX 10000

Langkah 4: Siapa yang mengunci dan siapa yang melepaskan

Masalah terakhir ialah jika nod satu memperoleh kunci, dan atas sebab tertentu, nod dua melaksanakan operasi DEL, maka nod lain boleh memperoleh kunci semula.

Untuk menyelesaikan masalah ini, kami boleh mengubah suai kandungan yang disimpan dalam pembolehubah kunci. Dalam logik sebelumnya, apabila kita memohon kunci, kita menentukan sama ada pembolehubah kunci wujud, dan ia mempunyai sedikit kaitan dengan nilai yang disimpan di dalamnya, kita boleh menggunakan nilai ini.

Apabila mengunci, jika nilai disimpan sebagai pengecam unik setiap nod, maka nilai itu dinilai sebelum melepaskan kunci dan melaksanakan DEL Kemudian, anda boleh menilai dahulu sama ada kunci itu ditambahkan pada nod semasa ya, kemudian lepaskannya, dengan itu menyedari "sesiapa yang mengunci kunci melepaskannya".

Dalam bahagian ini, tiada arahan tunggal yang boleh melengkapkan operasi membaca pembolehubah kunci, menilai dan memadamnya Oleh itu, ia boleh dilaksanakan menggunakan skrip Lua. Dapatkan nilai pembolehubah kunci semasa dalam skrip dan bandingkan dengan pengecam nod yang diberikan Jika ia sepadan, operasi pemadaman akan dilakukan.

Apabila melepaskan kunci, hanya laksanakan skrip Lua.

Langkah 5: Laksanakan ketersediaan tinggi

Selepas memperbaik fungsi, akhirnya laksanakan ketersediaan tinggi. Jika kami menggunakan satu Redis sebagai sistem storan yang dikongsi untuk kunci yang diedarkan, maka jika Redis ini tidak tersedia, semua bahagian yang berkaitan dengan kunci yang diedarkan akan menjadi tidak tersedia. Ini menjadikan kunci itu sangat rapuh, yang sangat berguna untuk ketersediaan yang tinggi.

Pada masa ini, adalah perlu untuk mengalih keluar algoritma kunci yang diedarkan Redlock yang dicadangkan oleh Antirez, pengarang Redis. Ringkasnya, pemohon kunci diminta untuk meminta kunci daripada berbilang kejadian Redis bebas Jika operasi kunci boleh diselesaikan pada lebih separuh daripada kejadian Redis, kunci akan berjaya diperoleh, jika tidak, pemerolehan akan gagal.

Dalam operasi melepaskan kunci, selagi skrip Lua yang berjaya memadamkan pembolehubah kunci dilaksanakan pada lebih separuh daripada kejadian, ia akan dianggap berjaya.

Untuk lebih banyak pengetahuan berkaitan pengaturcaraan, sila lawati: Pengenalan kepada Pengaturcaraan! !

Atas ialah kandungan terperinci Bagaimanakah Redis melaksanakan kunci teragih? Mari bercakap tentang kaedah pelaksanaan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:juejin.cn. Jika ada pelanggaran, sila hubungi admin@php.cn Padam