在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/人工智能  Java/ 關(guān)于redis實(shí)現(xiàn)分布式鎖的問題

關(guān)于redis實(shí)現(xiàn)分布式鎖的問題

redis使用setnx命令創(chuàng)建鎖,失效時(shí)間我設(shè)置多長時(shí)間為好?如何設(shè)置的失效時(shí)間太短,方法沒等執(zhí)行完,鎖就自動(dòng)釋放了,那么就會(huì)產(chǎn)生并發(fā)問題。如果設(shè)置的時(shí)間太長,其他獲取鎖的線程就可能要平白的多等一段時(shí)間。
在只考慮單機(jī)redis的情況下,如何處理這個(gè)問題?

回答
編輯回答
瘋浪

不知道我現(xiàn)在救火還來不來得及。

不要使用 setnx 來創(chuàng)建一個(gè)可過期的鎖,請使用 set key value nx ex time (SET 文檔地址)來創(chuàng)建。這樣能確保 setnx 和 expire 結(jié)合為一個(gè)原子操作。

如果先 setnx 再 expire,這個(gè)操作不是原子的,可能引發(fā)新的問題。比如 setnx 之后程序異常崩潰了,導(dǎo)致該 key 永不過期,從而引起其他請求鎖的線程一直阻塞。

希望現(xiàn)在救火還來得及。

2017年7月26日 05:39
編輯回答
喜歡你

可以預(yù)估一下你的業(yè)務(wù)請求時(shí)長,通常都在50-100ms之間,你的失效時(shí)間可以設(shè)置到100ms,如果更高你可以設(shè)置到1s,在redis防重的下一步就是數(shù)據(jù)庫防重,數(shù)據(jù)庫防重一定是要做的,所以就算redis鎖失效,數(shù)據(jù)庫肯定能防住。

2017年7月7日 10:41