如何操作Redis和zookeeper实现分布式锁

在分布式场景下,有很多种情况都需要实现最终一致性。在设计远程上下文的领域事件的时候,为了保证最终一致性,在通过领域事件进行通讯的方式中,可以共享存储(领域模型和消息的持久化数据源),或者做全局XA事务(两阶段提交,数据源可分开),也可以借助消息中间件(消费者处理需要能幂等)。通过Observer模式来发布领域事件可以提供很好的高并发性能,并且事件存储也能追溯更小粒度的事件数据,使各个应用系统拥有更好的自治性。
1.分布式锁
分布式锁一般用在分布式系统或者多个应用中,用来控制同一任务是否执行或者任务的执行顺序。在项目中,部署了多个tomcat应用,在执行定时任务时就会遇到同一任务可能执行多次的情况,我们可以借助分布式锁,保证在同一时间只有一个tomcat应用执行了定时任务。
2.分布式锁的实现方式
3.使用redis的setnx()和expire()来实现分布式锁
setnx(key,value) 如果key不存在,设置为当前key的值为value;如果key存在,直接返回。 expire()来设置超时时间
定义注解类:
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Lockable{
// redis缓存key
String key();
// redis缓存key中的数据
String value() default "";
// 过期时间(秒),默认为一分钟
long expire() default 60;
}
定时任务增加注解@Lockable:
@Lockable(key = "DistributedLock:dealExpireRecords")
public void dealExpireRecords() {
}
定义一个aop切面LockAspect,使用@Around处理所有注解为@Lockable的方法,通过连接点确认此注解是用在方法上,通过方法获取注解信息,使用setIfAbsent来判断是否获取分布式锁,如果没有获取分布式锁,直接返回;如果获取到分布式锁,通过expire设置过期时间,并调用指定方法。
@Component
@Slf4j
@Aspect
public class LockAspect {
@Autowired
private RedisTemplate redisTemplate;
@Around("@annotation(com.records.aop.Lockable)")
public Object distributeLock(ProceedingJoinPoint pjp) {
Object resultObject = null;
//确认此注解是用在方法上
Signature signature = pjp.getSignature();
if (!(signature instanceof MethodSignature)) {
log.error("Lockable is method annotation!");
return resultObject;
}
MethodSignature methodSignature = (MethodSignature) signature;
Method targetMethod = methodSignature.getMethod();
//获取注解信息
Lockable lockable = targetMethod.getAnnotation(Lockable.class);
String key = lockable.key();
String value = lockable.value();
long expire = lockable.expire();
// 分布式锁,如果没有此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();
}
return resultObject;
}
}
4.使用redis的getset()来实现分布式锁
此方法使redisTemplate.boundValueOps(key).getAndSet(value)的方法,如果返回空,表示获取了分布式锁;如果返回不为空,表示分布式锁已经被其他程序占用
5.使用zookeeper的创建节点node
使用zookeeper创建节点node,如果创建节点成功,表示获取了此分布式锁;如果创建节点失败,表示此分布式锁已经被其他程序占用(多个程序同时创建一个节点node,只有一个能够创建成功)
6.使用zookeeper的创建临时序列节点
使用zookeeper创建临时序列节点来实现分布式锁,适用于顺序执行的程序,大体思路就是创建临时序列节点,找出最小的序列节点,获取分布式锁,程序执行完成之后此序列节点消失,通过watch来监控节点的变化,从剩下的节点的找到最小的序列节点,获取分布式锁,执行相应处理,依次类推......
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# Redis和zookeeper分布式锁
# Redis和zookeeper分布式锁的实现
# C# 实现Zookeeper分布式锁的参考示例
# 分布式锁为什么要选择Zookeeper而不是Redis?看完这篇你就明白了
# ZooKeeper 实现分布式锁的方法示例
# 浅谈Java(SpringBoot)基于zookeeper的分布式锁实现
# 浅谈分布式锁的几种使用方式(redis、zookeeper、数据库)
# zookeeper实现分布式锁
# java使用zookeeper实现的分布式锁示例
# 分析ZooKeeper分布式锁的实现
# 多个
# 用在
# 来实现
# 如果没有
# 只有一个
# 很好
# 也能
# 适用于
# 我们可以
# 希望能
# 不存在
# 时就
# 谢谢大家
# 设置为
# 创建一个
# 值为
# 更小
# 为空
# 默认为
# 判断是否
相关文章:
实现虚拟支付需哪些建站技术支撑?
建站之星伪静态规则如何设置?
建站之星安装步骤有哪些常见问题?
高防服务器租用指南:配置选择与快速部署攻略
建站主机系统SEO优化与智能配置核心关键词操作指南
矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?
专业商城网站制作公司有哪些,pi商城官网是哪个?
历史网站制作软件,华为如何找回被删除的网站?
建站VPS选购需注意哪些关键参数?
建站之星CMS建站配置指南:模板选择与SEO优化技巧
如何选择靠谱的建站公司加盟品牌?
如何快速生成凡客建站的专业级图册?
威客平台建站流程解析:高效搭建教程与设计优化方案
如何配置支付宝与微信支付功能?
建站之星如何实现PC+手机+微信网站五合一建站?
大型企业网站制作流程,做网站需要注册公司吗?
c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】
高配服务器限时抢购:企业级配置与回收服务一站式优惠方案
实例解析angularjs的filter过滤器
建站之星×万网:智能建站系统+自助建站平台一键生成
网站制作知乎推荐,想做自己的网站用什么工具比较好?
济南网站制作的价格,历城一职专官方网站?
c# Task.ConfigureAwait(true) 在什么场景下是必须的
专业制作网站的公司哪家好,建立一个公司网站的费用.有哪些部分,分别要多少钱?
如何高效利用200m空间完成建站?
学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?
常州企业建站如何选择最佳模板?
网站按钮制作软件,如何实现网页中按钮的自动点击?
免费ppt制作网站,有没有值得推荐的免费PPT网站?
名字制作网站免费,所有小说网站的名字?
红河网站制作公司,红河事业单位身份证如何上传?
开源网站制作软件,开源网站什么意思?
完全自定义免费建站平台:主题模板在线生成一站式服务
香港服务器租用每月最低只需15元?
h5在线制作网站电脑版下载,h5网页制作软件?
建站之星导航配置指南:自助建站与SEO优化全解析
如何用5美元大硬盘VPS安全高效搭建个人网站?
建站之星图片链接生成指南:自助建站与智能设计教程
青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?
如何获取PHP WAP自助建站系统源码?
如何在建站之星网店版论坛获取技术支持?
如何用PHP快速搭建高效网站?分步指南
如何零成本快速生成个人自助网站?
如何通过IIS搭建网站并配置访问权限?
网站网页制作电话怎么打,怎样安装和使用钉钉软件免费打电话?
网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?
建站之星备案流程有哪些注意事项?
如何通过宝塔面板实现本地网站访问?
宿州网站制作公司兴策,安徽省低保查询网站?
韩国服务器如何优化跨境访问实现高效连接?
*请认真填写需求信息,我们会在24小时内与您取得联系。