分布式锁--基于redis

分布式锁–基于redis

上面讲锁,那么实现一个分布式锁

重点

  1. 状态—标记当前方法是否有锁
  2. 释放—释放当前方法锁

代码

/**
 * 基于redis实现分布式锁
 * 
 * @author haha
 */
@Component
public class RedisLock
{
	@Autowired
	private StringRedisTemplate stringRedisTemplate;

	public boolean lock(String key, String value)
	{
		if (stringRedisTemplate.opsForValue().setIfAbsent(key, value))
		{
			return true;
		}
		return false;
	}
	public boolean unLock(String key, String value)
	{
		String v_ = stringRedisTemplate.opsForValue().get(key);
		if (value.equals(v_))
		{
			stringRedisTemplate.opsForValue().getOperations().delete(key);// 删除key
			return true;
		}
		return false;
	}
}

讲一下,key val,key----包名+方法名(保证唯一性),val—uuid

实践

此处我使用springcloud快速搭建一个分布式的环境
eureka---- 端口8687
zuul ----端口8083
zuul-client(部署2份) —端口8080 & 8081
使用一个api来测试

@RestController
@RequestMapping("api")
public class HelloApi
{
	String classNmae = this.getClass().getName();
	@Autowired
	RedisLock redisLock;

	@GetMapping("hi")
	public Object hi() throws Exception
	{
		String methodName = Thread.currentThread().getStackTrace()[1]
				.getMethodName();
		String key = classNmae + methodName;
		String value = UUID.randomUUID().toString();
		if (redisLock.lock(key, value))
		{
			Thread.sleep(5000);
			redisLock.unLock(key, value);
			return "hi!  YOU  GET ME!";
		}
		return "i can not get lock";
	}
}

我修改了阻塞时间,方便测试,一个是5秒,一个是50秒
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值