参考:https://www.fengyunxiao.cn/
springboot 在单机模式下很好解决抢票,秒杀等需要一个一个执行的业务,可以使用jvm自带的synchronized进行上锁,避免抢了同一个。分布式场景下(比如在多个服务器同时部署了多个项目)使用synchronized关键字不能保证业务不出问题,需要使用中心化的解决方法,如redis。
方法1:单纯使用 redis 作为分布式锁,比较简单,但是存在几个很难完美解决的问题。
// 获取原子锁(setnx),同时设置超时时间,该方法是原子性的。
public boolean getLock(String key, String value) {
Boolean result = stringRedisTemplate.boundValueOps(key).setIfAbsent(value, 30, TimeUnit.SECONDS);
return result == null ? false : result;
}
// 删除原子锁,根据key和value同时删除,非原子性。最好使用lua,保证原子性,因为我没有使用过lua,所以先用非原子性的。后期更新。
public void deleteLock(String key, String value) {
String s = stringRedisTemplate.boundValueOps(key).get();
if (value!= null && value.equals(s)) {