当前位置: 首页 > wzjs >正文

怎么做可以直播的网站怎样推广自己的产品

怎么做可以直播的网站,怎样推广自己的产品,李沧网站建设电话,网站设计做哪些准备引言 在分布式系统中,Redis分布式锁是解决资源竞争问题的常用方案。然而,当持有锁的客户端因GC、网络延迟或处理时间过长导致锁过期时,可能引发数据一致性问题。Redisson的Watchdog(看门狗)机制通过自动续期解决了这一…

引言

在分布式系统中,Redis分布式锁是解决资源竞争问题的常用方案。然而,当持有锁的客户端因GC、网络延迟或处理时间过长导致锁过期时,可能引发数据一致性问题。Redisson的Watchdog(看门狗)机制通过自动续期解决了这一痛点。本文将深入分析其实现原理,结合源码揭示其工作机制。

一、Watchdog的核心原理

1.1 什么是Watchdog?

Watchdog是Redisson客户端的一个后台线程,用于监控并自动续期分布式锁。当客户端获取锁时未显式指定leaseTime(锁持有时间),Watchdog会启动,定期(默认每10秒)检查锁状态并延长锁的过期时间,避免业务未完成时锁提前释放。

1.2 核心机制

  • 锁续期条件:仅当未指定leaseTime时生效。

  • 续期规则:默认锁超时时间为30秒,每次续期重置为30秒。

  • 续期间隔:超时时间的1/3(即10秒)。

  • 自动释放:客户端宕机或进程退出时,Watchdog线程终止,锁超时后自动释放,避免死锁。


二、源码分析:从加锁到续期

2.1 关键类与入口

Redisson的分布式锁实现位于RedissonLock类中。核心方法为:

// 获取锁入口
void lock(long leaseTime, TimeUnit unit);

2.2 锁获取与Watchdog启动

leaseTime未设置(默认为-1)时,触发Watchdog初始化:

// RedissonLock.java
public void lock() {try {lock(-1, null, false);} // ...
}private void lock(long leaseTime, TimeUnit unit, boolean interruptibly) throws InterruptedException {long threadId = Thread.currentThread().getId();Long ttl = this.tryAcquire(-1L, leaseTime, unit, threadId);if (ttl != null) {CompletableFuture<RedissonLockEntry> future = this.subscribe(threadId);this.pubSub.timeout(future);RedissonLockEntry entry;if (interruptibly) {entry = (RedissonLockEntry)this.commandExecutor.getInterrupted(future);} else {entry = (RedissonLockEntry)this.commandExecutor.get(future);}try {while(true) {ttl = this.tryAcquire(-1L, leaseTime, unit, threadId);if (ttl == null) {return;}if (ttl >= 0L) {try {entry.getLatch().tryAcquire(ttl, TimeUnit.MILLISECONDS);} catch (InterruptedException var14) {InterruptedException e = var14;if (interruptibly) {throw e;}entry.getLatch().tryAcquire(ttl, TimeUnit.MILLISECONDS);}} else if (interruptibly) {entry.getLatch().acquire();} else {entry.getLatch().acquireUninterruptibly();}}} finally {this.unsubscribe(entry, threadId);}}}

2.3 续期任务调度

scheduleExpirationRenewal()启动定时任务:

// RedissonBaseLock.java
protected void scheduleExpirationRenewal(long threadId) {ExpirationEntry entry = new ExpirationEntry();ExpirationEntry oldEntry = (ExpirationEntry)EXPIRATION_RENEWAL_MAP.putIfAbsent(this.getEntryName(), entry);if (oldEntry != null) {oldEntry.addThreadId(threadId);} else {entry.addThreadId(threadId);try {this.renewExpiration();} finally {if (Thread.currentThread().isInterrupted()) {this.cancelExpirationRenewal(threadId);}}}}private void renewExpiration() {ExpirationEntry ee = (ExpirationEntry)EXPIRATION_RENEWAL_MAP.get(this.getEntryName());if (ee != null) {Timeout task = this.commandExecutor.getConnectionManager().newTimeout(new TimerTask() {public void run(Timeout timeout) throws Exception {ExpirationEntry ent = (ExpirationEntry)RedissonBaseLock.EXPIRATION_RENEWAL_MAP.get(RedissonBaseLock.this.getEntryName());if (ent != null) {Long threadId = ent.getFirstThreadId();if (threadId != null) {CompletionStage<Boolean> future = RedissonBaseLock.this.renewExpirationAsync(threadId);future.whenComplete((res, e) -> {if (e != null) {RedissonBaseLock.log.error("Can't update lock " + RedissonBaseLock.this.getRawName() + " expiration", e);RedissonBaseLock.EXPIRATION_RENEWAL_MAP.remove(RedissonBaseLock.this.getEntryName());} else {if (res) {RedissonBaseLock.this.renewExpiration();} else {RedissonBaseLock.this.cancelExpirationRenewal((Long)null);}}});}}}}, this.internalLockLeaseTime / 3L, TimeUnit.MILLISECONDS);ee.setTimeout(task);}}

2.4 续期操作实现

renewExpirationAsync()通过Lua脚本延长锁的过期时间:

  // RedissonBaseLock.javaprotected CompletionStage<Boolean> renewExpirationAsync(long threadId) {return this.evalWriteAsync(this.getRawName(), LongCodec.INSTANCE, RedisCommands.EVAL_BOOLEAN, "if (redis.call('hexists', KEYS[1], ARGV[2]) == 1) " +"then redis.call('pexpire', KEYS[1], " +"ARGV[1]); return 1; " +"end; return 0;", Collections.singletonList(this.getRawName()), this.internalLockLeaseTime, this.getLockName(threadId));}
  • Lua脚本逻辑:检查锁是否存在,若存在则重置过期时间为30秒(internalLockLeaseTime)。

三、Watchdog的生命周期

3.1 启动时机

  • 锁获取成功:未指定leaseTime时触发。

  • 锁重入:同一线程重复获取锁时不会重复启动。

3.2 停止条件

  • 锁释放:调用unlock()时清理续期任务。

  • 节点宕机:客户端进程终止,定时任务自动取消。


四、最佳实践与注意事项

4.1 正确配置参数

  • 锁超时时间:通过Config.lockWatchdogTimeout调整(默认30秒)。

  • 避免设置leaseTime:显式设置leaseTime会导致Watchdog失效。

4.2 避免陷阱

  • 锁竞争与超时:确保业务执行时间小于锁超时时间。

  • 网络分区风险:Redis集群脑裂可能导致锁失效,需配合Redlock算法使用。


五、总结

Redisson的Watchdog机制通过后台定时任务和Lua脚本的原子操作,实现了分布式锁的自动续期,解决了长任务场景下的锁超时问题。理解其源码逻辑有助于在实际开发中规避潜在风险,合理设计分布式锁的使用策略。


附录:Redisson版本
本文基于Redisson 3.17.7版本源码分析,不同版本实现可能略有差异。


希望这篇文章能帮助您深入理解Redisson的Watchdog机制。如有疑问,欢迎在评论区交流!

http://www.dtcms.com/wzjs/74790.html

相关文章:

  • 国家市场监督管理总局服务平台培训seo哪家学校好
  • 网站建设价格标准直播营销
  • 中型网站开发周期百度推广后台登陆官网
  • 怎样收录网站b站广告投放平台入口
  • 工业品公司做商城网站好吗网络宣传方案
  • 如何借用别人静态网站做模板平台代运营是什么意思
  • 棋类游戏网站开发汤阴县seo快速排名有哪家好
  • 网站搭建设计 是什么意思7个湖北seo网站推广策略
  • 网站(建设)安全自查报告百度推广怎么样才有效果
  • 优化网站速度的要点北京seo网络优化师
  • 卢湾做网站淘宝数据分析工具
  • 做什么地方网站网站如何推广营销
  • 做网站前期需要准备什么百度关键词搜索引擎排名优化
  • wordpress没了外贸建站优化
  • 山西太原做网站深圳新闻最新事件
  • 遵义湘江投资建设有限责任公司门户网站商品推广软文写作500字
  • 公司做网站的钱网银转账用途aso安卓优化公司
  • 响应式网站开发技术seo公司哪家好用
  • 菠菜网站怎么做推广比较好做网站哪家好
  • 西安好的网站建设公司排名百度地图人工电话
  • 乐平网站设计谷歌google搜索引擎入口
  • wordpress 个人公众号seo综合查询接口
  • 湖南株洲网站建设专业seo优化推广
  • 东莞企业名录大全郑州关键词优化费用
  • 海丰县网站设计黑帽seo是作弊手法
  • 网站设计建设公司服务商百度权重等级
  • 多语言建设外贸网站个人网站怎么做
  • 济南手工网站建设上海网络推广培训机构
  • 丰县网站建设搜索词分析工具
  • 专业做网站建设 昆山竞价托管公司排名