Redis分布式鎖的實踐

2021-09-05 13:01:22 字數 1561 閱讀 6985

首先說一下場景,不根據實際場景講的技術都是吹流弊,沒人反對吧,咳咳

醫院**,需要盡量高效的顯示最新的資料,根據不同的科室設定不同的快取時間,因為科室的熱門程度也不一樣嘛,這裡本次只分享我學習的一些心得.

思路:號源的快取是30分鐘,然後在第25的時候,如果還有患者訪問某個部門的號源,就開啟一條非同步執行緒直接查詢最新的號源,重新放入快取中.如果沒有,就直接讓快取失效,這樣就區別出來了熱點科室和冷門科室

工具:思路就是自定義乙個key,當前執行緒的name存為value,然後設定過期時間,呼叫 distributelock 方法加鎖,呼叫 releaselock釋放鎖. 其中加鎖的思路其實就是redis的setnx命令,每個執行緒都嘗試加鎖,因為 setnx就是乙個原子性的操作,只有乙個執行緒可以設定成功

/**

* 非同步重新號源資訊

* @param queryparms

*/public void asynreservationsbydoctorsbythread(final queryparms queryparms) else

logger.info("getreservationsbydoctors queryparms is =>" + queryparms);

list l = getreservationsbydoctoriddays(queryparms);

}}catch (busines***ception e)finally

}}).start();};}

private static final string set_if_not_exist = "nx";

private static final string set_with_expire_time = "px";//毫秒 如果是秒的話就是ex

/** * 這是乙個分布式鎖,用於獲取key鎖,如果搶占成功,並強行設定當前鎖的過期時間

* * @param key

* @param value

* @param seconds

* @return

*/public boolean distributelock(final string key, final string value, final long seconds)

return boolean.false;

}});

} //lua指令碼

private static final string release_lock_script = "if redis.call('get', keys[1]) == argv[1] then return redis.call('del', keys[1]) else return 0 end";

/*** 呼叫lua指令碼釋放鎖

* @param key

* @param clientid

* @return

*/public boolean releaselock(final string key, final string clientid)

return boolean.false;

}});

}

redis分布式鎖踩坑實踐

版本一 redis判斷是否有值,沒有加值 導致問題 1 加鎖不是個原子操作2 若加鎖後宕機,系統死鎖 版本二 redis加鎖原子性操作 setnx 鎖加過期時間 導致問題 1 若設定過期時間2s,程式執行3s,釋放了別人的鎖 版本三 redis加鎖上放乙個隨機值,然後判斷隨機值刪除鎖 導致問題 1 ...

redis分布式鎖

redis分布式鎖 直接上 我寫了四個redis分布式鎖的方法,大家可以提個意見 第一種方法 redis分布式鎖 param timeout public void lock long timeout thread.sleep 100 catch exception e override publi...

Redis分布式鎖

分布式鎖一般有三種實現方式 1.資料庫樂觀鎖 2.基於redis的分布式鎖 3.基於zookeeper的分布式鎖.首先,為了確保分布式鎖可用,我們至少要確保鎖的實現同時滿足以下四個條件 互斥性。在任意時刻,只有乙個客戶端能持有鎖。不會發生死鎖。即使有乙個客戶端在持有鎖的期間崩潰而沒有主動解鎖,也能保...