关于Redis(仅记录)

关于Redis(仅记录)

Redis分布式锁

@RequestMapping("/sub_stock")
public String subStock(){
	String lockKey = "product_101";
	String clientId = UUID.randomUUID().toString();
	//Boolean result = stringRedisTemplate.opsForValue().setIfAbsent(lockKey,"giao");//jedis.setnx(k,v)
	//stringRedisTemplate.expire(lockKey, 10, TimeUnit.SECONDS);
	Boolean result = stringRedisTemplate.opsForValue().setIfAbsent(lockKey, clientId, 10, TimeUnit.SECONDS);
	if(!result){
		return "error_code";
	}
	try {
		int stock = Integer.parseInt(stringRedisTemplate.opsForValue().get("stock"));//jedis.set(key,value)
		if(stock > 0){
			int realStock = stock -1;
			stringRedisTemplate.opsForValue().set("stock",realStock +"");//jedis.set(key, value)
			System.out.println("扣减成功,剩余库存:" + realStock);
		}else {
			System.out.println("扣减失败,库存不足");
		}
	} finally{
		if(clientId.equals(stringRedisTemplate.opsForValue().get(lockKey))){
			stringRedisTemplate.delete(lockKey);
		}
	}
	return "end";
}

这样的写法仍有一些遗留问题,比如在极端场景下,中间代码还未执行完,key就已经过期。

我们可以引入Redisson来解决:

@Autowired
private Redisson redisson;
@RequestMapping("/sub_stock")
public String subStock(){
	String lockKey = "product_101";
	RLock redissonLock = redisson.getLock(lockKey);
	try {
		//真正加锁
		redissonLock.lock();
		int stock = Integer.parseInt(stringRedisTemplate.opsForValue().get("stock"));//jedis.set(key,value)
		if(stock > 0){
			int realStock = stock -1;
			stringRedisTemplate.opsForValue().set("stock",realStock +"");//jedis.set(key, value)
			System.out.println("扣减成功,剩余库存:" + realStock);
		}else {
			System.out.println("扣减失败,库存不足");
		}
	} finally{
		redissonLock.unlock();
	}
	return "end";
}

Redisson分布式锁的实现原理图
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值