博客专区 > htlr的博客 > 博客详情
使用redis和zookeeper实现分布式锁
htlr 发表于2周前
使用redis和zookeeper实现分布式锁
  • 发表于 2周前
  • 阅读 4081
  • 收藏 312
  • 点赞 7
  • 评论 17

330元/年抢阿里云香港云服务器,节省80%出海成本>>>   

摘要: 使用redis和zookeeper实现分布式锁
共有 人打赏支持
粉丝 15
博文 9
码字总数 5236
评论 (17)
公孙二狗
// 分布式锁,如果没有此key,设置此值并返回true;如果没有此key,则返回false
// 是不是应该修改为:分布式锁,如果没有此key,设置此值并返回true;如果有此key,则返回false
boolean result = redisTemplate.boundValueOps(key).setIfAbsent(value);
if (!result) {
//其他程序已经获取分布式锁
return resultObject;
}

//设置过期时间,默认一分钟
redisTemplate.boundValueOps(key).expire(expire, TimeUnit.SECONDS);

try {
resultObject = pjp.proceed(); //调用对应方法执行
// 执行完后好像缺少释放锁的代码
} catch (Throwable throwable) {
throwable.printStackTrace();
}
htlr

引用来自“公孙二狗”的评论

// 分布式锁,如果没有此key,设置此值并返回true;如果没有此key,则返回false
// 是不是应该修改为:分布式锁,如果没有此key,设置此值并返回true;如果有此key,则返回false
boolean result = redisTemplate.boundValueOps(key).setIfAbsent(value);
if (!result) {
//其他程序已经获取分布式锁
return resultObject;
}

//设置过期时间,默认一分钟
redisTemplate.boundValueOps(key).expire(expire, TimeUnit.SECONDS);

try {
resultObject = pjp.proceed(); //调用对应方法执行
// 执行完后好像缺少释放锁的代码
} catch (Throwable throwable) {
throwable.printStackTrace();
}
分布式锁的注释是写错了,我写的这个分布式锁主要是为了定时任务不执行多次,所有对redis key 设置了一个超时时间来使key自动删除
huihrt
对于这种不需要高性能锁的需求,还是用zookeeper比较稳妥一点。
leslie1280
炸了?打不开了
leslie1280
炸了?打不开了
我想有个家
总是把zookeeper看成@Zoker ,我......
丁富贵
直接看Curator和Redisson源码就好了
crazymus
博主写得不错!有个问题请教下,redis单机无法承受大量写入操作时,该如何解决呢?例如秒杀、抢购这样的场景,短时间内会产生大量获取锁的操作。
沧海_Sea

引用来自“huihrt”的评论

对于这种不需要高性能锁的需求,还是用zookeeper比较稳妥一点。
zookeeper 性能高么?
KKiCC
redis或者zk就可以实现分布式锁。
特拉仔

引用来自“crazymus”的评论

博主写得不错!有个问题请教下,redis单机无法承受大量写入操作时,该如何解决呢?例如秒杀、抢购这样的场景,短时间内会产生大量获取锁的操作。
有一种memcache的实现方式,可以百度一下
Mr_Qi
还是有问题吧,如果set完成之后挂掉了,没有执行expire的话
excepiton

引用来自“Mr_Qi”的评论

还是有问题吧,如果set完成之后挂掉了,没有执行expire的话
SET key value [EX seconds] [PX milliseconds] [NX|XX]
xytest01
https://redis.io/topics/distlock
Mr_Qi

引用来自“Mr_Qi”的评论

还是有问题吧,如果set完成之后挂掉了,没有执行expire的话

引用来自“excepiton”的评论

SET key value [EX seconds] [PX milliseconds] [NX|XX]
对的,现在我们也这么用
qwfys
这种想法不错,我回头也试一下。
crazymus

引用来自“crazymus”的评论

博主写得不错!有个问题请教下,redis单机无法承受大量写入操作时,该如何解决呢?例如秒杀、抢购这样的场景,短时间内会产生大量获取锁的操作。

引用来自“特拉仔”的评论

有一种memcache的实现方式,可以百度一下
好的,谢谢提示!
×
htlr
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: