Pustaka pelaksanaan Redlock
Java Redisson Star 9458
C# RedLock.net Star 259
Go redsync.go Star 249
Walaupun algoritma di belakang adalah sama, bilangan suka sangat mengagumkan.
Kunci Redis satu titik
Mari kita semak secara ringkas cara kunci Redis satu titik dilaksanakan.
Dapatkan kunci
SET resource_name my_random_value NX PX 30000
Klien A menggunakan Redis untuk menetapkan pasangan nilai kunci dan menentukan tamat masa untuk mengelakkan kebuntuan. Apabila pelanggan lain mengakses, mereka mula-mula menyemak sama ada kunci itu sudah wujud dan sama ada nilainya ialah "my_random_value". Jika ia wujud, tunggu, jika tidak ia akan berjaya dan melaksanakan kod perniagaan. Objek yang dikongsi dan diketahui oleh semua pelanggan termasuk resource_name dan my_random_value.
Lepaskan kunci
if redis.call("get",KEYS[1]) == ARGV[1] then return redis.call("del",KEYS[1])else return 0end
Bandingkan nilai sepadan yang diperolehi oleh kunci untuk melihat sama ada ia sama, padam (lepaskan), jika tidak akan mengembalikan kegagalan.
Kecacatan kunci Redis satu titik
Apabila hanya terdapat satu instance Redis, kegagalan akan menyebabkan semua perkhidmatan yang bergantung padanya runtuh jelas. Jelas sekali tidak sesuai untuk aplikasi besar.
Masalah yang dihadapi oleh seni bina tuan-hamba Redis yang ringkas
Untuk mengelakkan satu titik kegagalan, kami membina seni bina tuan-hamba Master/Slave untuk Redis, satu Tuan, Seorang Hamba. Anda akan menghadapi masalah seperti di bawah. Berikut adalah senario penggunaan.
Klien A memperoleh kunci pada Master.
Tuan menutup telefon apabila menyegerakkan data ini kepada Hamba (kerana penyegerakan antara Tuan dan Hamba adalah tak segerak).
Hamba menjadi Tuan.
Klien B memperoleh kunci melalui kunci dan nilai yang sama. Kegagalan kunci teragih
Algoritma kunci merah
Katakan kita mempunyai N (dengan andaian 5) kejadian induk Redis, semua nod adalah bebas antara satu sama lain dan perniagaan Sistem ini juga merupakan panggilan mudah, dan tiada sistem tambahan lain seperti penghantaran semula mesej. Mari kita simulasi algoritma di bawah:
1. Pelanggan memperoleh masa semasa t0 pelayan, dalam milisaat.
Peroleh kunci menggunakan kunci dan nilai yang sama dalam 5 kejadian. Apabila memperoleh kunci perniagaan, pelanggan akan menetapkan tamat masa yang bertahan jauh lebih sedikit daripada masa yang diperlukan untuk kunci perniagaan. Sebagai contoh, andaikan kunci mengambil masa 10 saat, anda boleh menetapkan tamat masa antara 5-50 milisaat. Ayat yang ditulis semula: Untuk mengelakkan situasi di mana Redis gagal apabila pelanggan cuba mendapatkan kunci, langkah perlu diambil. Selepas tamat masa, lompat terus ke nod seterusnya.
3. Pelanggan menolak t0 daripada masa semasa (t1) untuk mengira masa t2 (=t1-t0) yang diambil untuk memperoleh kunci. Hanya apabila t2 kurang daripada masa sah perniagaan kunci (iaitu, 10 saat dalam langkah kedua), dan pelanggan memperoleh kunci pada sekurang-kurangnya 3 (5/2+1) platform, kami akan mempertimbangkan pemerolehan kunci berjaya.
4. Jika kunci telah diperoleh, masa sah perniagaan kunci ialah 10s-t2.
5. Jika pelanggan tidak memperoleh kunci itu, mungkin kunci itu tidak diperoleh pada lebih daripada atau sama dengan kejadian N/2+1, atau masa berkesan (10s-t2) ialah nombor negatif, kami akan cuba Melepaskan kunci walaupun ia tidak diperoleh pada nod itu.
Pelepas kunci
Keluaran agak mudah, cuma padamkan kekunci yang sepadan pada semua kejadian.
Atas ialah kandungan terperinci Contoh analisis kunci diedarkan Redlock dalam Redis. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!