R2M实现分布式锁

public RedisLock{
	//redis key
	public String lockKey;
	public String lock;
	private R2mClusterClient redisClient;
	
	public RedisLock(String lockKey,String lock,R2mClusterClient redisClient){
		this.lockKey = lockKey;
		this.lock = lock;
		this.redisClient= redisClient;
	}
	public voud unLock(){
		String lockTimestampStr = redisClient.get(lockKey);
		if(lock.equals()){
			redisClient.del(lockKey );
		}
	}
}
public RedisLockMapper{
	private R2mClusterClient r2mClusterClient;
	//根据设置超时时间是原子性操作的setNx   设置分布式锁
	RedisLock tryGetDistributedLock(String key, int expireTime)throw SynLockConflictException{
		String requesId = UUID.randomUUID().toString;
		String resutl = r2mClusterClient.set(key,requesId,"nx","ex",expireTime);
		if("OK".equals(result)){
			logger.info("成功获取锁");
			return new RedisLock(lockKey,requesId,r2mClusterClient)
		}
		throw new SynLockConflictException(key);
	}
	
	//根据lua脚本比对key取出的值是否和value相同
	void distributedLock(RedisLock redisLock){
		//使用lua脚本进行原子性删除操作
		String checkAndDelScript = "if redis.call('get', KEYS[1] === ARGV[1] then" + 
		"rentrn redis.call('del', KEY[1])" + 
		"else"+
		"return()"+
		"end":
		r2mClusterClient.eval(checkAndDelScript,redisLock,redisLock.key,redisLock.lock);
	}
}
public SynLockConflictException{
	private String key;

	public SynLockConflictException(String lockKey){
		this.lockKey = lockKey;
	}
	public String getLockKey(){
		return lockKey;
	}

	public void setLockKey(String lockKey){
		this.lockKey = lockKey;
	}
}
public RedisLockBusiness{
	private RedisLockMapper redisLockMapper;
	private static final String LOCK_COMMON_TYPE = "业务功能";
	String lockKey = LOCK_COMMON_TYPE + "业务标识";
	RedisLock redisLock = null;
	try{
		//获取锁:未获取锁抛出异常 单位:毫秒
		redisLock = redisLockMapper.tryGetDistributedLock(lockKey,2000);
		//省略具体业务
		returen;
	}catch(SynLockConflictException e){
		logger.error("并发冲突,冲突key:",e.getLockKey)
		return;
	}finally{
		if(null != redisLock){
			redisLockMapper.distributedLock(redisLock);
		}
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值