基於redis分布式鎖註解版

2021-10-10 21:00:37 字數 2313 閱讀 1712

思路使用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...