思路使用aop,實現起來比較簡單,直接上**了:
註解類:
@retention(retentionpolicy.runtime)
@target(elementtype.method)
@inherited
@documented
public @inte***ce redislock
切面:
@aspect
@component
@slf4j
public class redislockinterceptor extends baseinterceptor
@around("redislock()")
public object around(proceedingjoinpoint joinpoint) throws throwable ", rediskey);
try catch (exception e) finally ", rediskey);
}} catch (exception ex),錯誤:{}", rediskey, ex);}}
}else
}return res;
}/** * 將物件轉換為map
*/protected static mapconvertkeyvalue(object obj)
// 將字段及字段值對映到map中
for (field f : fieldlist) catch (illegalacces***ception e)
}return map;
}}
redisdistributionlock工具類
/**
* 分布式鎖工具
* * @author angsen
*/@slf4j
@component
public class redisdistributionlock
/*** 獲取鎖
* @param rediskey 鎖鍵
* @param expireseconds 過期時間(秒)
* @return 成功/失敗
*/public boolean lock(string rediskey, int expireseconds) ", lockkey);
string script = "if redis.call('setnx',keys[1],ar**[1]) == 0 then return 0 else redis.call('expire',keys[1],ar**[2]) return 1 end";
object result = redistemplate.execute(new defaultredisscript<>(script, long.class),
collections.singletonlist(lockkey), stringutils.space,
expireseconds);
return objects.equals(lock_result,result);
}/**
* 解鎖
* @param rediskey 鎖鍵
*/public void unlock(string rediskey) , 結果:{}", lockkey, objects.equals(lock_result,result));
}/**
* 分布式鎖
* @param key
* @param value
* @param timeout 超時時間,單位:秒
* @return
*/public boolean setnx(string key, string value,long timeout) ", key);
return (boolean)redistemplate.execute(new rediscallback()
log.info("redisdistributionlock|setnx --> 獲取結束.key:{},結果:{}", key, result);
return result;
}}, true);
}public void del(string key) ", key);
}}
如何使用
@redislock(key="refundbillno", prefix="refundfornormal:", expiretime=30*60)
public baseresponse refund(t t)
註解實現基於redis的分布式鎖
基於註解的分布式redis鎖 分布式系統開發中常常用到分布式鎖,比如防止多個使用者同時預訂同乙個商品,傳統的synchronized就無法實現了,而基於資料庫的樂觀鎖實現又可能會對資料庫產生較大的壓力。而分布式鎖相對較輕量,對效能影響也較小。目前主流的分布式鎖都基於redis實現。使用分布式鎖的流程...
基於Redis實現分布式鎖
分布式鎖的基本功能 1.同一時刻只能存在乙個鎖 2.需要解決意外死鎖問題,也就是鎖能超時自動釋放 3.支援主動釋放鎖 分布式鎖解決什麼問題 多程序併發執行任務時,需要保證任務的有序性或者唯一性 準備 redis版本 2.6 redis是主從 sentinel模式 為了高可用 原理 redis2.6之...
基於redis的分布式鎖
public class redislock 加鎖 取到鎖加鎖,並返回值用於解鎖 取不到鎖則立即返回 1 param millitimeout 最長鎖定時間,超時後自動刪除鎖,避免死鎖 return public synchronized long lock long millitimeout lo...