基于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);
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值