分布式锁

摘要 

属于 :API 标签: 发布于:2020-04-03 11:57:33

分布式锁

实现方式数据库方式,redis方式,zookeeper方式

1)数据库方式

create table methodlock(
method_name varchar(60) primary key, 
desc varchar(60)
) charset=utf8;

inert into methodlock...

插入成功的再执行,由于主键是method_name, 所以再次插入会失败。

也可用+ version的方式,update state ...

2)redis方式

try{
	lock = redisTemplate.opsForValue().setIfAbsent(lockKey, LOCK);
	logger.info("cancelCouponCode是否获取到锁:"+lock);
	if (lock) {
		// TODO
		redisTemplate.expire(lockKey,1, TimeUnit.MINUTES); //成功设置过期时间
		return res;
	}else {
		logger.info("cancelCouponCode没有获取到锁,不执行任务!");
	}
}finally{
	if(lock){	
		redisTemplate.delete(lockKey);
		logger.info("cancelCouponCode任务结束,释放锁!");		
	}else{
		logger.info("cancelCouponCode没有获取到锁,无需释放锁!");
	}
}
	lock = redisTemplate.opsForValue().setIfAbsent(lockKey, LOCK);
	logger.info("cancelCouponCode是否获取到锁:"+lock);
	if (lock) {
		// TODO
		redisTemplate.expire(lockKey,1, TimeUnit.MINUTES); //成功设置过期时间
		return res;
	}else {
		logger.info("cancelCouponCode没有获取到锁,不执行任务!");
	}
}finally{
	if(lock){	
		redisTemplate.delete(lockKey);
		logger.info("cancelCouponCode任务结束,释放锁!");		
	}else{
		logger.info("cancelCouponCode没有获取到锁,无需释放锁!");
	}
}

3) zookeeper方式

利用开源curator

Curator提供的InterProcessMutex是分布式锁的实现。acquire方法用户获取锁,release方法用于释放锁。

 https://github.com/apache/curator/


比较

从理解的难易程度角度(从低到高)


    数据库 > 缓存 > Zookeeper


从实现的复杂性角度(从低到高)


    Zookeeper >= 缓存 > 数据库


从性能角度(从高到低)


    缓存 > Zookeeper >= 数据库


从可靠性角度(从高到低)


    Zookeeper > 缓存 > 数据库