1.2 基于Redis的分布式鎖
1.2.2 實(shí)現(xiàn)原理: 基于樂觀鎖,即在提交事務(wù)前檢查數(shù)據(jù)版本是否被更新磷蜀,若被更新則進(jìn)行操作回滾;
1.2.3 核心代碼:
/**
* @Description: 嘗試獲得某資源的鎖,獲取成功為true进陡,否則為false
* @Param: [source] 資源名稱
* @Return: boolean
* @Author: Guimu
* @Date: 2018/8/8 下午5:53
*/
public boolean getLock(String source) {
SessionCallback sc = new SessionCallback() {
@Override
public List<Object> execute(RedisOperations operations) throws DataAccessException {
operations.watch(source);//開始觀察資源
boolean flag = null == operations.opsForValue().get(source);//資源是否可用
List<Object> rs = null;
if (flag) {//資源可用
operations.multi();//開啟事務(wù)
//占用資源
operations.opsForValue().set(source, Thread.currentThread().getName(), 120, TimeUnit.SECONDS);
rs = operations.exec();
}
return rs;
}
};
List<Object> result = (List<Object>) tool.execute(sc);
return null != result && result.isEmpty();
}
1.2.4 集群中分布式鎖的應(yīng)用場(chǎng)景: