第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

基于redis的分布式鎖(Java實(shí)現(xiàn))

標(biāo)簽:
Java

Github源码:

https://github.com/z521598/redis-lock

实现原理:

1.setnx

Redis的setnx指令(文档参考),setnx意为SET if Not eXists,命令格式:setnx $key $value

如果此key不存在,则设置值为value,返回值为1;如果此key存在,则不设置,返回值为0。如下图:

127.0.0.1:6379[1]> setnx key v
(integer) 1127.0.0.1:6379[1]> setnx key v2
(integer) 0

redis是单线程的,是线程安全的,setnx指令由于上述的特性能够满足高并发情况下的对于锁的需求。

2.SpringData-redis

springData-redis是向Redis发送命令以及接受数据的高层次抽象的模版方法,简单理解为“使用java向redis发送命令以及接受数据的客户端”(文档参考

配置文件:https://github.com/z521598/redis-lock/blob/master/src/main/resources/applicationContext.xml

V1

说明:

最简单的最粗糙的锁实现,实现了2个方法。

方法1:获取锁,public UUID acquire(String lockKey, long acquireTimeoutInMillis, long lockExpiryInMillis)

参数说明:lockKey为锁的key;acquireTimeoutInMillis为获取锁的等待时间,如果超过此时间就放弃锁;lockExpiryInMillis为锁的过期时间。

返回值:锁对应的值,就是命令中“setnx key value”的value。

思路:

1.调用SpringData-Redis的setIfAbsent(lockKey, value)方法(就是命令行中的setnx),value为随机的UUID。

2.如果返回true,则说明已经获取的锁,则继续设置超时时间,返回设置的UUID。

  如果返回false,则说明未获取到锁,则休眠100ms,并记录总休眠的时间,如果lockExpiryInMillis大于等于记录总休眠的时间,则说明未获取到锁,返回null。

方法2:释放锁,public void release(String lockKey, UUID uuid)

参数说明:lockKey为锁的key;uuid为锁的value。

思路:检查锁的value是否为uuid,如果相等,则释放,如果不相等,则什么都不做;防止释放了其他线程获取的锁。

明显的缺点:

第一步,获取锁,第二步,然后设置超时时间。这是2步操作,不是原子性操作,如果第一步操作之后,程序崩溃了或者掉电了或者redis恰巧进行了主从切换等等原因,第二步无法正常执行,这样这个锁就永远得不到释放。

代码:

复制代码

public UUID acquire(String lockKey, long acquireTimeoutInMillis, long lockExpiryInMillis)            throws InterruptedException {
        UUID uuid = UUID.randomUUID();        long timeout = 0L;        while (timeout < acquireTimeoutInMillis) {            if (redisTemplate.opsForValue().setIfAbsent(lockKey, uuid.toString())) {                redisTemplate.expire(lockKey, lockExpiryInMillis, TimeUnit.MILLISECONDS);                return uuid;
            }
            TimeUnit.MILLISECONDS.sleep(DEFAULT_ACQUIRE_RESOLUTION_MILLIS);
            timeout += DEFAULT_ACQUIRE_RESOLUTION_MILLIS;
        }        return null;
    }

复制代码

锁实现:https://github.com/z521598/redis-lock/blob/master/src/main/java/com/redis/lock/sdata/v1/LockService.java

单元测试:

缺点:(极少出现的情况)

当redis是主从形式的情况下,获取锁之后,master宕机,slave接管,但是这个时候“新master”还未同步锁的key。在这个时候,其他线程去获取锁,发现无此key,则获取了不应该获取的锁,这样就会引起不安全的情况。

代码:

锁实现:https://github.com/z521598/redis-lock/tree/master/src/main/java/com/redis/lock/sdata/v2

单元测试:https://github.com/z521598/redis-lock/blob/master/src/test/java/com/redis/lock/sdata/v2/LockV2ServiceTest.java

 V3

敬请期待

原文出处:https://www.cnblogs.com/langshiquan/p/9531198.html


點(diǎn)擊查看更多內(nèi)容
TA 點(diǎn)贊

若覺得本文不錯(cuò),就分享一下吧!

評(píng)論

作者其他優(yōu)質(zhì)文章

正在加載中
  • 推薦
  • 評(píng)論
  • 收藏
  • 共同學(xué)習(xí),寫下你的評(píng)論
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會(huì)直接到老師賬戶
支付方式
打開微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊(cè)有機(jī)會(huì)得

100積分直接送

付費(fèi)專欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會(huì)
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)

舉報(bào)

0/150
提交
取消