目錄
看了很多部落格,和資料,這裡只針對redis做分布式鎖做一下深入**,希望對你們有obwmx幫助。網上提供了很多分布式鎖的操作,這裡逐一舉例然後評論優缺點及改進方案,希望這樣子能讓當家更好的理解redis分布式鎖。
大家應該都知道redis做分布式鎖無非就是incr命令或者是setnx命令,這裡我們採用setnx命令。
操作:setnx key 如果操作成功則代表拿到鎖,如果沒有操作成功則代表沒有拿到鎖。
缺點:如果這個人拿到鎖後宕機了怎麼辦,那麼這個鎖就再也不能釋放了。
改進:給這個鎖增加乙個過期時間,這樣如果有效期過了,那麼這個鎖就會自動釋放了。
通過上面所說我們應該對redis分布式進行改進。
操作: 使用setnx 命令,之後,在expireat key 30000 這條命令設定key的有效期為30秒。
這裡我們可能會發現,如果要是剛setnx結束之後,要是宕機了。怎麼辦?那麼我們為了保證原子性,所以jedis提供了乙個原子操作,set(key,value,nx,30,時間單位)這樣便解決了。
缺點:如果這個鎖的時間不夠用怎麼辦,那麼就會導致這個功能鎖不住。假設:a拿到鎖了,但是a還沒有執行結束,b又拿到鎖了,那麼a執行結束的時候是不是會把b的這個鎖給刪除掉。這樣就導致了鎖不住的效果。
改進:我們可以學習樂觀所,給鎖的value值是乙個唯一的編號,或者版本號,我們每次對鎖進行操作的時候,就會去驗證這個版本號,還是不是自己的版本號。如果不是了就不允許操作了。
通過上面的總結這第三版想必也很簡單了。知識多了乙個唯一值而已。但是加了唯一值還是改變不了鎖不住的結果,只是解決了幫其他的執行緒解鎖的問題,那麼要怎麼樣才能鎖得住呢?當時我想到的是給他 時間久一點,後來發現其實再久,也一樣會出現鎖不住的時候,而且太久了如果宕機了,就會有很長時間機器無法工作,很容易造成執行緒堆積。
由上面我們發現一般簡單實用redis做鎖其實是有很多漏洞和bug的,但是有沒有能夠解決這些的呢?當然是有的。
模仿aqs鎖, lock方法執行完之後,執行下面**是被鎖的,unlock執行完,釋放鎖。其他執行緒等待,而不是直接返回錯誤結果。
最終版還是打算先上**再說,為了方便我把所有的實現都寫在了乙個類裡面。
@autowired
private redistemplate redistemplate;
@autowired
private redisutils redisutils;
@autowired(required = false)
private threadpooltaskscheduler threadpooltaskscheduler;
public final string lock_prefix = "redis_lock";
private final long lock_expire = 30 * 1000l;
private final long over_time = 10l;
private mapobwmxtring,scheduledfuture> > futuremap = new concurrenthashmap<>();
private jedis jedis;
public lock()
private reentrantlock reentrantlock;
/***www.cppcns.com 給執行緒枷鎖
** @param key
*/public void lock(string key)
},new trigger()
});return;}}
}/**
* setnx
** @param key
* @return
*/public boolean setlock(string key) else }}
return false;
}});
}/**
* 刪除鎖
** @param key
*/public void unlock(string key)
}/**
* 判斷key是否存在
** @param key 鍵
* @return true 存在 false不存在
*/public boolean haskey(string key) catch (exception e)
}public set scan(string key) else
}return keys;
});}
分析:
加鎖執行原理:
解鎖操作原理:
解鎖操作就比較簡單了。但是得為了不出必要的麻煩,最好是給停止鎖延時任務,和刪除所 這兩部新增程序鎖,可以使用synchron程式設計客棧ized,也可以使用aqs lock鎖。
這裡redis非公平鎖詳解算是結束了,後期可能會更新使用redis,實現公平鎖,謝謝大家的支援,如果有需要的小夥伴可以直接拿走,希望能給大家帶來幫助。
在這裡我希望看過文章的小夥伴能夠根絕實現原理自己去實現,這樣可以幫助小夥伴理解非公平鎖機制,和redis實現非公平,如果不喜歡自己去實現的話,這裡我給大家推薦乙個redission 這個外掛程式,這個外掛程式是乙個redis鎖的很好的乙個實現,大家可以直接用這個。具體怎麼用就不講解了,操作非常簡單。
Redis分布式非公平鎖詳解
大家應該都知道redis做分布式鎖無非就是incr命令或者是setnx命令,這裡我們採用setnx命令。操作 setnx key 如果操作成功則代表拿到鎖,如果沒有操作成功則代表沒有拿到鎖。缺點 如果這個人拿到鎖後宕機了怎麼辦,那麼這個鎖就再也不能釋放了。改進 給這個鎖增加乙個過期時間,這樣如果有效...
分布式鎖 使用Redis實現分布式鎖
關於分布式鎖的實現,我的前一篇文章講解了如何使用zookeeper實現分布式鎖。關於分布式鎖的背景此處不再做贅述,我們直接討論下如何使用redis實現分布式鎖。關於redis,筆主不打算做長篇大論的介紹,只介紹下redis優秀的特性。支援豐富的資料型別,如string list map set zs...
redis分布式鎖
redis分布式鎖 直接上 我寫了四個redis分布式鎖的方法,大家可以提個意見 第一種方法 redis分布式鎖 param timeout public void lock long timeout thread.sleep 100 catch exception e override publi...