首先說一下場景,不根據實際場景講的技術都是吹流弊,沒人反對吧,咳咳
醫院**,需要盡量高效的顯示最新的資料,根據不同的科室設定不同的快取時間,因為科室的熱門程度也不一樣嘛,這裡本次只分享我學習的一些心得.
思路:號源的快取是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的分布式鎖.首先,為了確保分布式鎖可用,我們至少要確保鎖的實現同時滿足以下四個條件 互斥性。在任意時刻,只有乙個客戶端能持有鎖。不會發生死鎖。即使有乙個客戶端在持有鎖的期間崩潰而沒有主動解鎖,也能保...