基于redis的分布式锁

概念
为了防止分布式系统中的多个进程之间相互干扰,我们需要一种分布式协调技术来对这些进程进行调度。而这个分布式协调技术的核心就是来实现这个分布式锁。
分布式锁具有的条件
在分布式系统环境下,一个方法在同一时间只能被一个机器的一个线程执行
高可用的获取锁与释放锁
高性能的获取锁与释放锁
具备可重入特性(可理解为重新进入,由多于一个任务并发使用,而不必担心数据错误)
具备锁失效机制,防止死锁
具备非阻塞锁特性,即没有获取到锁将直接返回获取锁失败

public void	reduceProduct() {
//基于秒杀减库存
	//对某种商品进行加锁	
	String lock = "product_name";
	//库存的key的名称
	String stoct;
	//全局生成一个唯一id,防止别的进程删除
	String randomUUID = UUID.randomUUID().toString();
	try {
		//redis的setnx方法,只要key存在就返回false
		Boolean setIfAbsent = StringRedisTemplate.opsForValue().setIfAbsent(lock, randomUUID, 30,TimeUnit.SECONDS);
		if(!setIfAbsent)
			return;
		//获取redis里的库存
		Integer num = Integer.parseInt(StringRedisTemplate.opsForValue().get(stoct));
		if(num>0) {
		//减库存操作
		Integer realnum=num-1;
		//将减完的库存再次设置到redis	
		StringRedisTemplate.opsForValue().set(stoct, realnum.toString());
		}
	}finally {
	//释放锁将刚才设置的key删除掉
		if(randomUUID.equals(StringRedisTemplate.opsForValue().get(stoct))) {
			StringRedisTemplate.delete(stoct);
		}
	}
}

你可能感兴趣的:(java,分布式,redis)