注解式 redisson分布式鎖


  之前我加鎖是在方法里面,但是有一個問題,就是沒有解耦,就跟我說redis不同mysql緩存是一樣的。

  這里也寫一個AOP,利用注解,進行方法的加鎖。

  首先,寫一個ASPECT

  

@Aspect
@Component
public class RedisLockAspect {

@Autowired
private RedissonClient redissonClient;

private static final String REDIS_PREFIX = "redisson_lock:";

@Around("@annotation(redisLock)")
public Object around(ProceedingJoinPoint joinPoint, RedisLock redisLock) throws Throwable {
String key = redisLock.key();
String lockName = redisLock.lockName();

RLock rLock = redissonClient.getLock(REDIS_PREFIX + lockName + ":" + key);

rLock.lock(redisLock.expire(),redisLock.timeUnit());

Object result = null;
try {
//執行方法
result = joinPoint.proceed();

} finally {
rLock.unlock();
}
return result;
}
}

我們在測試的時候,模擬2000個並發,之前有測試代碼,你們可以直接拿來用。
@GetMapping("/test/{id}")
@RedisLock(lockName = "test", key = "test + ':' + #id")
public void aspectLock(@PathVariable String id) {
//模擬多個資源請求輸出庫存情況
//goods_num
System.out.println("-------------線程"+id+"搶到鎖------------");
//獲取成功
int num = Integer
.parseInt(distributedLock.getValueByKey("goods_num"));
if(num > 0) {
distributedLock.setValueByKey("goods_num", Integer.toString(num - 1));
System.out.println("商品數剩余----->" + (num - 1));
} else {
System.out.println("商品銷售完----結束了!");
}
System.out.println("-------------線程"+id+"結束------------");
}
標記了紅色的,就是注解了。
可以看到,這個邏輯就解耦了,我們先獲得鎖,能獲得鎖的,那么就進入方法。
遮掩就可以了,代碼簡潔易懂。






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM