接上文 Redis與分布式-集群搭建
1.分布式鎖
為了解決上述問題,可以利用分布式鎖來實現(xiàn)。
重新復(fù)制一份redis,配置文件都是剛下載時候的不用更改,然后啟動redis服務(wù)和redis客戶。
redis存在這樣的命令:和set命令差不多,但是它有一個機制,當(dāng)指定的key不存在的時候,才能進行插入,實際上就是 set if not exists的縮寫,當(dāng)key被刪除后可以進行插入。
setnx key value
利用這種特性,可以再不同的服務(wù)中實現(xiàn)分布式鎖。但是若某個服務(wù)加了鎖并且卡頓了,或者崩潰,那么這把鎖永遠(yuǎn)無法釋放了,因此可以加過期時間:
set a666 EX 5 NX
如果學(xué)習(xí)過JUC并發(fā)編程,會發(fā)現(xiàn)若在超時之前那一刻進入到釋放鎖的階段,獲取到的值肯定還是自己,但是在即將執(zhí)行刪除之前,由于超時機制導(dǎo)致被刪除并且其他任務(wù)也加鎖了,那么這時候在刪除,仍會導(dǎo)致刪除其他任務(wù)加的鎖
導(dǎo)入Redisson依賴
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.17.0</version>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.75.Final</version>
</dependency>
不加鎖的情況
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
new Thread(() -> {
try(Jedis jedis = new Jedis("192.168.0.10", 6379)){
for (int j = 0; j < 100; j++) { //每個客戶端獲取a然后增加a的值再寫回去,如果不加鎖那么肯定會出問題
int a = Integer.parseInt(jedis.get("a")) + 1;
jedis.set("a", a+"");
}
}
}).start();
}
}
在redis中設(shè)置a=0,然后測試不加鎖
取出a,得出結(jié)果不對
測試加鎖
public static void main(String[] args) {
Config config = new Config();
config.useSingleServer().setAddress("redis://192.168.0.10:6379"); //配置連接的Redis服務(wù)器,也可以指定集群
RedissonClient client = Redisson.create(config); //創(chuàng)建RedissonClient客戶端
for (int i = 0; i < 10; i++) {
new Thread(() -> {
try(Jedis jedis = new Jedis("192.168.0.10", 6379)){
RLock lock = client.getLock("testLock"); //指定鎖的名稱,拿到鎖對象
for (int j = 0; j < 100; j++) {
lock.lock(); //加鎖
int a = Integer.parseInt(jedis.get("a")) + 1;
jedis.set("a", a+"");
lock.unlock(); //解鎖
}
}
System.out.println("結(jié)束!");
}).start();
}
}
執(zhí)行完a的值加了1000,此時寫入為正常文章來源:http://www.zghlxwxcb.cn/news/detail-728117.html
此時若用于存放鎖的redis服務(wù)掛了,那么肯定會出問題的,這個時候可以用RedLock,它的思路是在多個redis服務(wù)器上保持鎖,只需要超過半數(shù)的redis服務(wù)獲取到鎖,那么就真的獲取到鎖了,這樣掛掉一部分節(jié)點,也能保證正常運行。文章來源地址http://www.zghlxwxcb.cn/news/detail-728117.html
到了這里,關(guān)于Redis與分布式-分布式鎖的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!