redis实现分布式锁 发表于 2018-09-21 | 分类于 后端 | | 阅读次数: redis实现分布式锁通过synchronized关键字进行线程保护 是可以的 但是在压测中 我们就会发现这个方法会导致效率明显下降,所以我们通过自己加锁,来保护线程安全,废话不多说,我们直接上代码 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647/** * @author anber * @date 2018/9/21 **/@Component@Slf4jpublic class RedisUtil { @Autowired private StringRedisTemplate redisTemplate; /** * 加锁 * @param key * @param value 时间戳加上过期时间 * @return */ public synchronized boolean lock(String key, String value) { //这个方法是用的redis的 setnx方法 方法解析:会判断key可以是否存在,存在返回false,不存在则塞入值,返回true if (redisTemplate.opsForValue().setIfAbsent(key, value)) { return true; } //根据key获取value String currentValue = redisTemplate.opsForValue().get(key); //如果锁过期则进入该方法 这个是方法是防止死锁 if (!StringUtils.isEmpty(currentValue) && Long.parseLong(currentValue) < System.currentTimeMillis()) { //获取上个锁的时间 String oldValue = redisTemplate.opsForValue().getAndSet(key, value); if (!StringUtils.isEmpty(oldValue) && oldValue.equals(currentValue)) { return true; } } return false; } public void unLock(String key, String value) { try { String currentValue = redisTemplate.opsForValue().get(key); if (!StringUtils.isEmpty(currentValue) && value.equals(currentValue)) { redisTemplate.opsForValue().getOperations().delete(key); } } catch (Exception e) { log.error("[Redis分布式锁,解锁异常], {}", e); } }} 我们通过压测,可以明显看出效率有了很大的提升,当然这个只是通过单个redis. 打赏 微信支付