范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

这样实现分布式锁,才叫优雅

  概述
  提到分布式锁大家都会想到如下两种:  基于 Redisson 组件,使用redlock算法实现 基于 Apache Curator ,利用Zookeeper的临时顺序节点模型实现
  今天我们来说说第三种,使用  Spring Integration  实现。
  Spring Integration 在基于Spring的应用程序中实现轻量级消息传递,并支持通过声明适配器与外部系统集成。Spring Integration的主要目标是提供一个简单的模型来构建企业集成解决方案,同时保持关注点的分离,这对于生成可维护,可测试的代码至关重要。我们熟知的 Spring Cloud Stream的底层就是Spring Integration。
  官方地址:https://github.com/spring-projects/spring-integration
  Spring Integration提供的全局锁目前为如下存储提供了实现:  Gemfire  JDBC  Redis  Zookeeper
  它们使用相同的API抽象,这意味着,不论使用哪种存储,你的编码体验是一样的。试想一下你目前是基于zookeeper实现的分布式锁,哪天你想换成redis的实现,我们只需要修改相关依赖和配置就可以了,无需修改代码。下面是你使用  Spring Integration  实现分布式锁时需要关注的方法:
  方法名描述  lock()Acquires the lock. 加锁,如果已经被其他线程锁住或者当前线程不能获取锁则阻塞 lockInterruptibly()Acquires the lock unless the current thread is interrupted. 加锁,除非当前线程被打断。  tryLock()Acquires the lock only if it is free at the time of invocation. 尝试加锁,如果已经有其他锁锁住,获取当前线程不能加锁,则返回false,加锁失败;加锁成功则返回true tryLock(long time, TimeUnit unit)Acquires the lock if it is free within the given waiting time and the current thread has not been interrupted. 尝试在指定时间内加锁,如果已经有其他锁锁住,获取当前线程不能加锁,则返回false,加锁失败;加锁成功则返回true  unlock()Releases the lock. 解锁  实战
  话不多说,我们看看使用  Spring Integration  如何基于redis和zookeeper快速实现分布式锁,至于Gemfire 和 Jdbc的实现大家自行实践。 基于Redis实现引入相关组件    org.springframework.boot  spring-boot-starter-integration     org.springframework.integration  spring-integration-redis     org.springframework.boot  spring-boot-starter-data-redis  在application.yml中添加redis的配置  spring:  redis:   host: 172.31.0.149   port: 7111 建立配置类,注入 RedisLockRegistry  @Configuration public class RedisLockConfiguration {      @Bean     public RedisLockRegistry redisLockRegistry(RedisConnectionFactory redisConnectionFactory){         return new RedisLockRegistry(redisConnectionFactory, "redis-lock");     }  } 编写测试代码  @RestController @RequestMapping("lock") @Log4j2 public class DistributedLockController {     @Autowired     private RedisLockRegistry redisLockRegistry;      @GetMapping("/redis")     public void test1() {         Lock lock = redisLockRegistry.obtain("redis");         try{             //尝试在指定时间内加锁,如果已经有其他锁锁住,获取当前线程不能加锁,则返回false,加锁失败;加锁成功则返回true             if(lock.tryLock(3, TimeUnit.SECONDS)){                 log.info("lock is ready");                 TimeUnit.SECONDS.sleep(5);             }         } catch (InterruptedException e) {             log.error("obtain lock error",e);         } finally {             lock.unlock();         }     } } 测试
  启动多个实例,分别访问 /lock/redis  端点,一个正常秩序业务逻辑,另外一个实例访问出现如下错误说明第二个实例没有拿到锁,证明了分布式锁的存在。
  注意,如果使用新版Springboot进行集成时需要使用Redis4版本,否则会出现下面的异常告警,主要是   unlock()   释放锁时使用了UNLINK命令,这个需要Redis4版本才能支持。  2020-05-14 11:30:24,781 WARN  RedisLockRegistry:339 - The UNLINK command has failed (not supported on the Redis server?); falling back to the regular DELETE command org.springframework.data.redis.RedisSystemException: Error in execution; nested exception is io.lettuce.core.RedisCommandExecutionException: ERR unknown command "UNLINK" 基于Zookeeper实现引入组件    org.springframework.boot  spring-boot-starter-integration      org.springframework.integration  spring-integration-zookeeper  在application.yml中添加zookeeper的配置  zookeeper:       host: 172.31.0.43:2181 建立配置类,注入 ZookeeperLockRegistry  @Configuration public class ZookeeperLockConfiguration {     @Value("${zookeeper.host}")     private String zkUrl;       @Bean     public CuratorFrameworkFactoryBean curatorFrameworkFactoryBean(){         return new CuratorFrameworkFactoryBean(zkUrl);     }      @Bean     public ZookeeperLockRegistry zookeeperLockRegistry(CuratorFramework curatorFramework){         return new ZookeeperLockRegistry(curatorFramework,"/zookeeper-lock");     } } 编写测试代码  @RestController @RequestMapping("lock") @Log4j2 public class DistributedLockController {      @Autowired     private ZookeeperLockRegistry zookeeperLockRegistry;      @GetMapping("/zookeeper")     public void test2() {         Lock lock = zookeeperLockRegistry.obtain("zookeeper");         try{             //尝试在指定时间内加锁,如果已经有其他锁锁住,获取当前线程不能加锁,则返回false,加锁失败;加锁成功则返回true             if(lock.tryLock(3, TimeUnit.SECONDS)){                 log.info("lock is ready");                 TimeUnit.SECONDS.sleep(5);             }         } catch (InterruptedException e) {             log.error("obtain lock error",e);         } finally {             lock.unlock();         }     } } 测试
  启动多个实例,分别访问 /lock/zookeeper  端点,一个正常秩序业务逻辑,另外一个实例访问出现如下错误说明第二个实例没有拿到锁,证明了分布式锁的存在。

从乌镇看数字时代2021年世界互联网大会乌镇峰会已经开幕,作为世界互联网大会永久举办地,乌镇承载着世界的目光,见证数字时代的一步步成长。随着科技更新迭代速度的加快,数字世界和真实世界的边界越发模糊华为Mate50系列最新消息华为受到美国制裁后,无法自行订制晶片,采购上也困难重重,加上晶片短缺,导致今年的旗舰P50系列延迟到七月才问世,而且还只支援4G网路,而接下来的Mate50Pro也面临同样的状况,中国联通举办iPhone13首销嘉年华与苹果合作再升级9月24日,中国联通携手苹果公司举办中国联通iPhone13Pro和iPhone13首销嘉年华2021活动,将双方的合作再度升级。12年前,联通率先携手苹果将iPhone产品引入中为什么运营商总喜欢宣传通信资费下降?在2021年世界互联网大会乌镇峰会上,联通新上任的董事长出席开幕式并发表了致辞,看完新闻报道后,小编预测有一段内容很可能要给各家媒体和读者们单拎出来做文章,果不其然,今天就看到了这宅家太无趣?中国移动5GFUN映厅带你开启寻影之旅视频加载中今日,中国移动5GFUN映厅正式上线!短短15秒的概念片所释出的科技感传递出一个讯息5G时代下,迅猛发展的科技改变了我们探知世界的触角,也改变了大众生活娱乐的方式。不知不5G是一种技术,也是一种能力,高通X65获评互联网大会科技成果奖说到5G基带,很多人第一时间想到的就是高通。从世界上的第一款5G基带问世以来,就和高通骁龙的名字紧紧捆绑在了一起。高通在2016年推出的骁龙X50是全球首款5G基带,支持全球基于毫目前超值的四款12G256G手机,大内存更流畅,连用三四年问题不大对于安卓手机来讲,由于底层系统的缘故内存会越用越小,所以安卓手机不存在8GB够用,12GB性能溢出的道理,如果你想满足三四年时间的流畅使用,越大的内存理论越好,所以本文就为大家介绍13香到底香不香新面市的iPhone13硬件与芯片性能有所提升,但有些亮点国产品牌手机早已应用。苹果手机自诞生伊始,突破性创新备受消费者喜爱,新技术的应用颇为大胆,如今每次上新在新技术应用上却像挤互联网大会中国移动展区绽放无限精彩5G亚运观赛怎么玩?云游戏也能点播?5G消息活起来?摇橹船推开碧波,秋风撩起印花布,乌镇又被一场互联网盛会推到了世界聚光灯下。2021年世界互联网大会乌镇峰会于9月26日至28日举程序2021。9。280程序员进ICU昏迷五六天,恢复后决定辞职改行送菜近日,一条关于程序员辞职回乡改行送菜的话题登上微博热搜,再一次引发网友对程序员这个职业的关注和热议。据报道,34岁的李智钊曾是一名应用合辑iPhone上的Safari浏览器有什么好用的插件?小通知()国庆假期到啦,应用日报将在10月1日10月7日停更7天,8号回归。今天给大家带来Safari扩展插件的应用合辑,小伙伴们可以在假期里闲暇时间折腾折腾,祝大家假期愉快。如何
电子支付与现金支付,在2021东日本大地震面前,哪一个更靠谱关于日本的电子支付,本刊也讨论过几次,多半也是从技术和产品角度来分析。对日本的电子支付环境,一直是认为硬件条件已经相当完善,而软件特别是是本地用户的使用意愿却不是强烈,每每去日本旅透支利率市场化后,信用卡余额代偿业务能否卷土重来1月1日,央行制订的关于推进信用卡透支利率市场化改革的通知正式实施。该通知从去年12月31日发布到1月1日实施仅一天时间,由此可以看出,央行对该通知的出台时间是非常急切的。信用卡用年报工银信用卡2020年业绩,霸主地位继续巩固宇宙行工银信用卡2020年业绩发布,信用卡霸主地位继续巩固。2020年,工银信用卡累计发卡量1。6亿张,较上年末增长约0。622020年,工银信用卡贷款余额6816。10亿元,较上信用卡不该被排斥在校园之外2021年两会开幕,有人大代表呼吁,健全网络贷款法律法规,强化监管力度。要求任何网络贷款机构不得向在校学生发放贷款。同时还特别呼吁,应禁止给在校学生办理信用卡和提供分期等相关超前消报告2020年信用卡逾期半年总额838亿元刚刚,央行发布了2020年第四季度支付体系运行总体情况,暨2020年支付体系运行总体情况。截止2020年第四季度末,信用卡和借贷合一卡在用发卡数量共计7。78亿张,同比增长4。26初五迎财神,但你的财运或许在这张财神银行卡中今天是2021辛丑年初五本刊照例奉上一组财神银行卡向本刊读者朋友们道一声恭喜发财!别忘了,正月初五迎财神!工商银行财神卡浦发银行财星卡中信银行财神卡民生银行财神卡江南农村商业银行财2020年信用卡业绩排行榜会有哪些变化?第一时间跟踪上市银行年报,并及时发布信用卡业绩,已经成为本刊的一大特色,也是众多的行业中的专业人士及时获得信用卡业绩信息的渠道。又到了2020年银行年报即将披露之际,本刊仍将及时在假装系列跟着银行卡走马观花三星堆近日,神秘的三星堆考古再次备受瞩目,央视连续直播三星堆遗址发布最新考古挖掘成果,再掀古蜀文明的神秘面纱!南充市商业银行(现更名为四川天府银行)选取了从三星堆古遗址挖掘出来的纵目面具年报平安信用卡2020年业绩出炉,交易金额再创新高平安信用卡2020年业绩如何?刚刚,平安银行2020年报率先发布,平安信用卡业绩也随之亮相,尽管受到疫情的严重影响,但是平安信用卡2020年的业绩依然保持了良好发展态势,交易金额创掌眼!这些牛年银行生肖卡从2021年的大年初一(2月12日)开始,就是农历辛丑年,生肖纪年为牛年(也有一种以立春作为生肖更迭依据的说法,比如从今天开始进入牛年)。牛是中国传统十二生肖之二,与十二地支中配属年报招行信用卡2020年业绩发布,业务收入超过820亿元招商信用卡2020年业绩,刚刚随招商银行年报一并发布,2020年虽然疫情对信用卡业务的影响巨大,但是招商信用卡依然显示出强大的实力。卡量规模业务收入等指标均再取得耀眼的业绩。202