如何用redis实现分布式锁?这篇文章教你用redisson实现分布式锁,封装之后的方法更好用!
生活随笔
收集整理的這篇文章主要介紹了
如何用redis实现分布式锁?这篇文章教你用redisson实现分布式锁,封装之后的方法更好用!
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
?
使用redission實現(xiàn)分布式鎖
添加配置類
import org.redisson.Redisson; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;/*** redisson 配置類*/ @Configuration public class RedissonConfig {@Value("${spring.redis.host}")private String host;@Value("${spring.redis.port}")private String port;@Value("${spring.redis.password}")private String password;@Beanpublic Redisson getRedisson(){Config config = new Config();config.useSingleServer().setAddress("redis://" + host + ":" + port);//.setPassword(password);//添加主從配置 // config.useMasterSlaveServers().setMasterAddress("").setPassword("").addSlaveAddress(new String[]{"",""});return (Redisson) Redisson.create(config);}}測試
@RequestMapping("/redisson")public String redisson(){String lockKey = "product_001";//商品id作為鎖RLock lock = redisson.getLock(lockKey);try{//這里如果其他線程加鎖失敗,會while一直循環(huán)阻塞//同時在后臺起一個線程,每隔10秒(1/3的超時時間)會判斷這把鎖是否釋放,如果未釋放則刷新超時時間System.out.println("準(zhǔn)備嘗試獲取鎖");lock.lock(30, TimeUnit.SECONDS);System.out.println("進來了,開始停8秒");Thread.sleep(8000);//這里寫邏輯} catch (InterruptedException e) {e.printStackTrace();} finally {lock.unlock();}return "success";}原理
解析
1.使用redis設(shè)置過期時間(假如10秒),redisson會又一個監(jiān)聽線程,每隔一段時間(一般10*2/3=6秒)會刷新這個key的過期時間,防止業(yè)務(wù)沒有執(zhí)行完就釋放了鎖。
2.設(shè)置過期時間的目的:防止系統(tǒng)突然掛掉,死鎖。時間一過就可以釋放鎖。
3.當(dāng)鎖已經(jīng)被獲取之后,會一直不斷地嘗試獲取鎖(自旋鎖),直到鎖獲取成功,執(zhí)行業(yè)務(wù)邏輯。
4.鎖的key一般就是用業(yè)務(wù)的流水號,或者商品的編號,唯一的。
分布式鎖目的
1.高并發(fā)下實現(xiàn)串行化。
2.實現(xiàn)冪等性(需要在代碼中進行判斷)。
分布式鎖的缺點
1.降低系統(tǒng)性能。
2.系統(tǒng)繁雜更容易出現(xiàn)問題,不好維護。
?
總結(jié)
以上是生活随笔為你收集整理的如何用redis实现分布式锁?这篇文章教你用redisson实现分布式锁,封装之后的方法更好用!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spring框架如何调用异步方法?快进来
- 下一篇: linux查看文件只会用vi?除了vi,