Kuru mallar: Redis dağıtılmış kilit ilkesi ve nasıl yenileneceği

Görüşme soruları

Redis kilidinin sona erme süresi, işletmenin yürütme süresinden daha az nasıl yenilenir?

Problem analizi

Öncelikle Redis'in dağıtılmış kilitlerini doğru duruşta kullandıysanız ve ilgili resmi belgeleri okuduysanız bu soru O kadar kolay ki bir göz atalım.

Pek çok öğrenci dağıtılmış kilitleri kullandığında, Redis dağıtılmış kilit aracı sınıfını bulmak için doğrudan Baidu aramasını kullanırlar. Aslında, Redis dağıtılmış kilitler için doğru duruş, istemci aracı redisson kullanmaktır.

Nasıl cevap verilir

Varsayılan olarak, kilitlenme süresi 30 saniyedir. Kilitli iş yürütülmezse, 30-10 = 20 saniye olduğunda, bir yenileme gerçekleştirilecek ve kilit 30 saniyeye sıfırlanacaktır. Bazı öğrenciler tekrar sorabilir, ya iş makinesi bozulursa? Zamanlanmış görev çalışmazsa, yenilenmeyecektir ve doğal olarak kilit 30 saniye sonra açılacaktır.

Redisson dağıtılmış kilidin temel ilkesi

Redisson, Redis dağıtılmış kilidin altında yatan ilkeyi fark eder

1) Kilitleme mekanizması

Yukarıdaki resme bakalım Şimdi belirli bir müşterinin kilitlenmesi gerekiyor. İstemci bir redis küme kümesiyle karşı karşıyaysa, önce karma düğümüne dayalı bir makine seçecektir.

Buraya dikkat et , Sadece bir makine seçin! Bu kritik!

Bundan hemen sonra, redis'e bir lua betiği gönderilecektir.Lua betiği aşağıdaki gibidir:

Lua betikleri neden kullanılıyor?

Çünkü çok sayıda karmaşık iş mantığı bir lua betiğinde kapsüllenebilir ve bu karmaşık iş mantığının yürütülmesini sağlamak için redis'e gönderilebilir. Atomiklik .

Peki, bu lua betiği ne anlama geliyor?

ANAHTARLAR Kilitlediğiniz anahtarı temsil eder, örneğin:

RLock kilidi = redisson.getLock ("myLock");

Burada kendinizi kilitlemek için kilit anahtarını "myLock" olarak ayarladınız.

ARGV Varsayılan olarak 30 saniye olan kilit anahtarının varsayılan ömrünü temsil eder.

ARGV Aşağıdakine benzer şekilde kilitli istemcinin kimliğini temsil eder:

8743c9c0-0795-4907-87fd-6c719a6b4586: 1

Size açıklamak gerekirse, ilk eğer yargı ifadesi yargılamak için "var benim Kilidi var" komutunu kullanmaktır.Kilitlemek istediğiniz kilit anahtarı yoksa, onu kilitleyebilirsiniz.

Nasıl kilitlenir? Çok basit, aşağıdaki komutu kullanın:

hset myLock

8743c9c0-0795-4907-87fd-6c719a6b4586: 11

Bu komutla bir hash veri yapısı ayarlayın. Bu komut çalıştırıldıktan sonra, aşağıdakine benzer bir veri yapısı görünecektir:

Yukarıdaki "8743c9c0-0795-4907-87fd-6c719a6b4586: 1" temsil eder, istemci "myLock" kilit anahtarını tamamlamıştır.

Ardından, myLock anahtarının yaşam süresini 30 saniyeye ayarlamak için "pexpire myLock 30000" komutu çalıştırılacaktır.

Tamam, şimdiye kadar, tamam, kilitleme tamamlandı.

(2) Karşılıklı dışlama mekanizmasını kilitleyin

Öyleyse şu anda, istemci 2 aynı Lua betiğini kilitlemeye ve yürütmeye çalışırsa ne olacak?

Çok basit, eğer yargı "var myLock" u çalıştıracak ve myLock kilit anahtarının zaten var olduğunu bulacaksa, ilk olarak.

Daha sonra ikinci yargı durumunda, myLock anahtarının karma veri yapısının, istemci 2'nin kimliğini içerip içermediğine karar verin, ancak bu açıkça, istemci 1'in kimliğini içerdiği için değildir.

Bu nedenle, istemci 2, myLock'un kilit anahtarını temsil eden pttl myLock tarafından döndürülen bir sayı alır. Kalan hayatta kalma süresi. Örneğin, 15000 milisaniye hayatta kalma süresi kaldı.

Bu anda, istemci 2 bir while döngüsüne girecek ve kilitlemeye çalışacaktır.

(3) Bekçi köpeği otomatik uzatma mekanizması

İstemci 1 tarafından kilitlenen kilit anahtarının varsayılan hayatta kalma süresi sadece 30 saniyedir. 30 saniyeyi aşarsa, istemci 1 hala kilidi tutmak istiyor. Ne yapmalıyım?

basit! İstemci 1 başarıyla kilitlendiği sürece, bir bekçi köpeği başlatacaktır. O bir arka plan iş parçacığı ve her 10 saniyede bir kontrol edecek İstemci 1 hala kilit anahtarını tutuyorsa, kilit anahtarının ömrünü uzatmaya devam edecektir.

(4) Yeniden giriş kilitleme mekanizması

Öyleyse, istemci 1 zaten kilidi tutuyorsa, evresel kilide ne olacak?

Örneğin, aşağıdaki kod:

Şu anda yukarıdaki Lua betiğini inceleyelim.

Birincisi, yargı kesinlikle doğru değilse, "var myLock" kilit anahtarının zaten var olduğunu gösterecektir.

İkincisi, eğer karar verilecek, çünkü myLock'un karma veri yapısında bulunan kimlik, istemci 1'in kimliğidir, "8743c9c0-0795-4907-87fd-6c719a6b4586: 1"

Şu anda, evresel kilitlemenin mantığı çalıştırılacak ve o kullanacak:

incrby myLock

8743c9c0-0795-4907-87fd-6c71a6b4586: 11

Bu komut aracılığıyla, 1. istemcideki kilit sayısı 1 ile toplanır.

MyLock veri yapısı aşağıdaki gibi olur:

MyLock'un karma veri yapısındaki istemci kimliğinin kilit sayısına karşılık geldiğini görebilirsiniz.

(5) Kilit mekanizmasını serbest bırakın

Lock.unlock () 'u çalıştırırsanız, dağıtılmış kilidi serbest bırakabilirsiniz ve şu anda iş mantığı da çok basittir.

Aslında, açıkça söylemek gerekirse, myLock veri yapısındaki kilit sayısı her seferinde bir azaltılır.

Kilit sayısının 0 olduğu tespit edilirse, bu, istemcinin artık kilidi elinde tutmadığı ve kullanacağı anlamına gelir:

"Del myLock" komutu, bu anahtarı redis'den silin.

Ardından, başka bir müşteri 2 kilidi tamamlamayı deneyebilir.

Bu denir Dağıtılmış kilitler için açık kaynaklı Redisson çerçevesinin uygulama mekanizması.

Genel olarak, bir üretim sisteminde, redise dayalı dağıtılmış kilitleri kilitlemek ve serbest bırakmak için Redisson çerçevesi tarafından sağlanan bu sınıf kitaplığını kullanabiliriz.

(6) Yukarıdaki Redis dağıtılmış kilidin dezavantajları

Aslında, yukarıdaki şemayla ilgili en büyük sorun, myLock kilit anahtarının değerini bir redis ana örneğine yazarsanız, eşzamansız olarak karşılık gelen ana bağımlı örneğe kopyalanacaktır.

Bununla birlikte, bu işlem sırasında redis ana birimi kapandığında, ana ve bekleme anahtarı ve redis kölesi redis yöneticisi olur.

Daha sonra, istemci 2 kilitlemeye çalıştığında, yeni redis yöneticisindeki kilidi tamamlar ve istemci 1 de başarıyla kilitlendiğini düşünür.

Şu anda, birden çok istemci dağıtılmış bir kilidin kilitlenmesini tamamlayacaktır.

Şu anda, sistemin iş anlambiliminde sorun yaşaması gerekir, Çeşitli kirli verilerin üretilmesine yol açar .

Yani bu redis kümesi veya redis ana-bağımlı mimarisi Master-slave asenkron çoğaltma Ortaya çıkan yeniden dağıtılmış kilidin en büyük dezavantajı: redis ana örneği çalışmadığında, birden çok istemci aynı anda kilidi tamamlayabilir.

Fırtınadan sonra Ma Guoming'in gönderisinin tam metni ortaya çıktı, Ma Guoming hile yapan kız arkadaşı Huang Xinying'i neden affetti?
önceki
JavaFx xJavaFxTool tabanlı pratik araçlar koleksiyonu
Sonraki
9 Java tekli desenini ayrıntılı olarak açıklayın
Zhao Yongqian: Karakolda ne var? Sorumluluk omuzlarda, bir taraf ev, diğer taraf ülke
Chen Haonun en güzel karakteri fanatik değil büyüleyici bir Diao Chan
39 yaşındaki Cecilia Cheung yemeğini açığa çıkarmak için "gece geç saatte zehirlendi", 1 neden şeytan figürünü koruyor
Çek uluslar arası Sullar bir araba kazasında öldü, Caulk ve Cisse hafif yaralandı
Li Xiang, ticari faaliyetlere katılmak için lüks bir araba aldı Güvenlik görevlisi insanları uzaklaştırırken onları uzaklaştırdı Netizen: Var mı?
Kuru mallar: servis kaydı ve keşif alın
Figür, aşkın kristalleşmesine sahip Tang Yan'a benziyor, neden iyi haber açıklanmadı?
Chen Yifa'nın bloke edildikten sonra ilk çıkışı! Hayranlar yüz binlerce hediyeyi kaydırdı, Douyu canlı yayın odasını sildi
Neden sigara içmeyen kişilerde akciğer kanseri görülme sıklığı yüksektir? Hemen hemen her ailenin bu nedeni vardır!
Bean Li Zixuan, dikkat çekmek için arkadaşlarının fotoğraflarını yayınladı, süper popüler! Çıkış yapmazsan ateşli olmayacağını kim söyledi?
2018 Qingdao Yıllık Ekonomik Başarı Ödül Töreni yapıldı
To Top