可重入分布式锁
使用场景
由于单机应用随着功能和业务越来越复杂导致其越来越臃肿,处理业务变得越来越慢。所以,现在很多大型的网站都选择分而治之,将不同的功能业务进行划分,使用分布式架构管理项目。如果是某个业务的压力特别大,我们这时候还需要集群来减轻服务器的压力。但是随之也会产生有一些问题。比如说现在有两台服务器A和B,他们需要同时对同一数据库
做修改操作,这时候之前的synchronized这些单机锁就无法保证事务的一致性问题。
这时候就需要使用到分布式锁了,由于我对zk的了解不是很多,所以当初项目里就选择了使用redis来实现。你可能会疑问为什么redis可以实现分布式锁?答案是Redis是单进程单线程模式,采用队列模式将并发访问变成串行访问,且多客户端对Redis的连接并不存在竞争关系。下面我就把我的实现方式写一下吧(我第一次呆的公司用到的)。
package com.example.demo.util;
import com.example.demo.constant.RedisKeyConstant;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
/**
* @author : wulg29230
* @Date : 2020/3/9 13:20
**/
@Component
@Slf4j
public class RedisLockUtils {
//锁超时时间1分钟
private static final long LOCK_TIME_OUT = 60000L;
//加锁阻塞等待时间
private static final long THREAD_SLEEP_TIME = 500L;
@Resource
private RedisTemplate redisTemplate;
/**
* 本地线程池
*/
private static final ThreadLocal<Map<String,Boolean>> doubleLock = new ThreadLocal<Map<String,Boolean>