Leader Election

Curator在选主方式上除了提供Leader Latch,还有一个更为经典的方式:Leader Election,一种基于选举而非抢占的选主方式。

  1. 关键API

org.apache.curator.framework.recipes.leader.LeaderSelector

主API

org.apache.curator.framework.recipes.leader.LeaderSelectorListener

选主监听器
继承自org.apache.curator.framework.state.ConnectionStateListener

通知主节点选主成功

org.apache.curator.framework.recipes.leader.LeaderSelectorListenerAdapter

选主监听器的一个抽象类
增加了对链接状态监听的默认实现
用以处理zk链接问题引发的选主状态不同步

org.apache.curator.framework.recipes.leader.CancelLeadershipException

在 ConnectionStateListener.stateChanged()抛出
会引发LeaderSelector.interruptLeadership()调用
主身份被打断

  1. 机制说明

Leader Election内部通过一个分布式锁来实现选主;

并且选主结果是公平的,zk会按照各节点请求的次序成为主节点。
3. 用法
3.1 创建

创建LeaderSelector:
方法1

public LeaderSelector(CuratorFramework client,String mutexPath,LeaderSelectorListener listener)

参数说明:

 client:zk客户端链接mutexPath:分组路径(zk中的path)(名字就带有mutex,所以和锁有关)listener:选主结果监听器

方法2

public LeaderSelector(CuratorFramework client,String mutexPath,ThreadFactory threadFactory,Executor executor,LeaderSelectorListener listener)

参数说明:

   client:zk客户端链接mutexPath:分组路径(zk中的path)(名字就带有mutex,所以和锁有关)threadFactory:内部线程工厂,可以对工作线程做一些标记executor:执行器,或者说线程池listener:选主结果监听器

3.2 使用

LeaderSelector创建好之后,必须执行:

leaderSelector.start();

启动后,如果当选为主则会触发监听器中的takeLeadership()方法。

和Leader Latch一样,无论结果如何最终应该调用:

leaderSelector.close();
  1. 错误处理

    LeaderSelectorListener继承自ConnectionStateListener。 当LeaderSelector启动后,会自动添加监听。 使用LeaderSelector时,必须关注链接状态的变化。 如果当选为主,应该处理链接中断:SUSPENDED,以及链接丢失:LOST。 当遇到SUSPENDED状态时,实例必须认为自己不再是主了,直到链接恢复到RECONNECTED状态。 当遇到LOST状态,实例不再是主了,并且应该退出takeLeadership方法。

    重要:建议当遇到SUSPENDED以及LOST时,直接抛出CancelLeadershipException异常 这样,会让LeaderSelector尝试中断任务执行并取消执行线程对takeLeadership 的执行。 正是因为这样,才提供了一个LeaderSelectorListenerAdapter,来处理上述逻辑。 所以,在实际使用中最好继承LeaderSelectorListenerAdapter使用。

5. 源码分析

5.1 类定义

还是先来看看类的定义
5.1.1 LeaderSelector

import java.io.Closeable;public class LeaderSelector implements Closeable {}

同样,实现了java.io.Closeable,所以你懂的,try()…catch{}。

5.1.2 LeaderSelectorListener

import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.state.ConnectionStateListener;public interface LeaderSelectorListener extends ConnectionStateListener
{public void takeLeadership(CuratorFramework client) throws Exception;
}

继承自ConnectionStateListener,选主的有效性有链接状态密切关注

   takeLeadership方法当选为主后,此方法被调用此方法用于执行任务不用立即返回直到打算放弃主时,才应该结束此方法

5.1.3 LeaderSelectorListenerAdapter

import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.state.ConnectionState;public abstract class LeaderSelectorListenerAdapter implements LeaderSelectorListener
{@Overridepublic void stateChanged(CuratorFramework client, ConnectionState newState){if ( (newState == ConnectionState.SUSPENDED) || (newState == ConnectionState.LOST) ){throw new CancelLeadershipException();}}
}

抽象类
带有ConnectionStateListener的stateChanged默认实现
参见:4. 错误处理

5.1.4 CancelLeadershipException

import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.state.ConnectionState;public class CancelLeadershipException extends RuntimeException
{public CancelLeadershipException(){}public CancelLeadershipException(String message){super(message);}public CancelLeadershipException(String message, Throwable cause){super(message, cause);}public CancelLeadershipException(Throwable cause){super(cause);}
}

运行时异常
注意:
只有LeaderSelectorListener#stateChanged方法中抛出才能引发LeaderSelector#interruptLeadership()

5.2 成员变量

public class LeaderSelector implements Closeable
{private final Logger log = LoggerFactory.getLogger(getClass());private final CuratorFramework client;private final LeaderSelectorListener listener;private final CloseableExecutorService executorService;private final InterProcessMutex mutex;private final AtomicReference<State> state = new AtomicReference<State>(State.LATENT);private final AtomicBoolean autoRequeue = new AtomicBoolean(false);private final AtomicReference<Future<?>> ourTask = new AtomicReference<Future<?>>(null);private volatile boolean hasLeadership;private volatile String id = "";@VisibleForTestingvolatile CountDownLatch debugLeadershipLatch = null;volatile CountDownLatch debugLeadershipWaitLatch = null;private enum State { LATENT, STARTED, CLOSED }// guarded by synchronizationprivate boolean isQueued = false;private static final ThreadFactory defaultThreadFactory = ThreadUtils.newThreadFactory("LeaderSelector");
}
   log : slf4jclient : zk客户端(curator-framework提供)listener : 监听选主成功,并被回调executorService : 线程池,同样实现了java.io.Closeablemutex : 分布式锁对象state :内部枚举LATENT 休眠STARTED 已启动CLOSED 已关闭状态原子化引用包装autoRequeue :是否自动重新参与选主原子化对象ourTask :任务的异步Future持有原子化引用包装hasLeadershipvolatile可见性不同于LeaderLatch没有采用AtomicBoolean任务采用线程池选主回调更新状态所以对于hasLeadership的并发竞争少id : 参与者iddebugLeadershipLatch : 测试时使用debugLeadershipWaitLatch : 试时使用isQueued :是否已经在排队中安全性由synchronized保障defaultThreadFactory私有常量默认线程工厂选主线程带有"Curator-LeaderSelector"前缀

注意:

和LeaderLatch不同,
虽然大部分变量采用了final,并采用Atom*进行包装
但是有些只采用volatile,只是保证了可见性
可见,同样是选主,但是LeaderLatch 和 Leader Election 还是有很多不一样的

5.3 构造器

常规套路,多个构造器模板,最终由下面这个完成:

public LeaderSelector(CuratorFramework client, String leaderPath, CloseableExecutorService executorService, LeaderSelectorListener listener){Preconditions.checkNotNull(client, "client cannot be null");PathUtils.validatePath(leaderPath);Preconditions.checkNotNull(listener, "listener cannot be null");this.client = client;this.listener = new WrappedListener(this, listener);hasLeadership = false;this.executorService = executorService;mutex = new InterProcessMutex(client, leaderPath){@Overrideprotected byte[] getLockNodeBytes(){return (id.length() > 0) ? getIdBytes(id) : null;}};}

可以发现:

与LeaderLatch不同,需要指定一个线程池异步任务去选主选主成功后执行listener的回调
client,leaderPath,listener不能为空
对listener进行了一层包装,参见 5.5 监听器包装
构造的过程中,初始化了对leaderPath进行了加锁

5.4 启动

第3节,介绍过。和LeaderLatch一样,Leader Election是由start()启动选主过程:

public void start()
{Preconditions.checkState(state.compareAndSet(State.LATENT, State.STARTED), "Cannot be started more than once");Preconditions.checkState(!executorService.isShutdown(), "Already started");Preconditions.checkState(!hasLeadership, "Already has leadership");client.getConnectionStateListenable().addListener(listener);requeue();
}
public boolean requeue()
{Preconditions.checkState(state.get() == State.STARTED, "close() has already been called");return internalRequeue();
}
private synchronized boolean internalRequeue()
{if ( !isQueued && (state.get() == State.STARTED) ){isQueued = true;Future<Void> task = executorService.submit(new Callable<Void>(){@Overridepublic Void call() throws Exception{try{doWorkLoop();}finally{clearIsQueued();if ( autoRequeue.get() ){internalRequeue();}}return null;}});ourTask.set(task);return true;}return false;
}

可以发现:

CAS操作,更新状态从休眠到已启动
如果线程池已关闭已经关闭则认定:"Already started"
坚持是否已经当选成功
在链接上添加选主监听器
执行requeue()方法,重新排队选主确认当前状态是已启动调用internalRequeue()方法synchronized同步互斥如果当前已经在排队中,则返回false否则更新isQueued = true由于synchronized,所以isQueued是安全更新向线程池提交一个异步任务由ourTask持有此任务的Future返回true

继续看看提交的异步任务,做了哪些事:

调用doWorkLoop()
通过finally调用clearIsQueued();synchronizedisQueued = false如果开启自动重新排队,则再次调用internalRequeue()有点类似递归但不是递归不断重新排队在当前任务结束时,通过重新调用所在方法重新向线程池中建立一个同样的任务

那么先来看看干活的doWorkLoop()方法:

private void doWorkLoop() throws Exception
{KeeperException exception = null;try{doWork();}catch ( KeeperException.ConnectionLossException e ){exception = e;}catch ( KeeperException.SessionExpiredException e ){exception = e;}catch ( InterruptedException ignore ){Thread.currentThread().interrupt();}if ( (exception != null) && !autoRequeue.get() )   // autoRequeue should ignore connection loss or session expired and just keep trying{throw exception;}}
异常持有,常规套路
可以发现干活的是doWork()
当遇到java.lang.InterruptedException,则线程重新进行锁竞争(synchronized)
如果开启了自动重新排队,则不抛出异常任务正常结束重做任务

继续看看doWork()

@VisibleForTestingvoid doWork() throws Exception{hasLeadership = false;try{mutex.acquire();hasLeadership = true;try{if ( debugLeadershipLatch != null ){debugLeadershipLatch.countDown();}if ( debugLeadershipWaitLatch != null ){debugLeadershipWaitLatch.await();}listener.takeLeadership(client);}catch ( InterruptedException e ){Thread.currentThread().interrupt();throw e;}catch ( Throwable e ){ThreadUtils.checkInterrupted(e);}finally{clearIsQueued();}}catch ( InterruptedException e ){Thread.currentThread().interrupt();throw e;}finally{if ( hasLeadership ){hasLeadership = false;try{mutex.release();}catch ( Exception e ){ThreadUtils.checkInterrupted(e);log.error("The leader threw an exception", e);// ignore errors - this is just a safety}}}}
初始hasLeadership=false
申请对leaderPath加锁,阻塞
加锁成功,则当选为主hasLeadership = true
回调org.apache.curator.framework.recipes.leader.LeaderSelectorListener的takeLeadership方法此回调是在doWork()中同步调用也即是在doWorkLoop()中也就是在executorService线程池中的一个异步任务中调用的
对中断异常进行处理
内层finally清理排队中标识
外层finally进行着主任务执行完成后的清理工作如果是主还原主标识对leaderPath解锁

5.5 关闭

public synchronized void close()
{Preconditions.checkState(state.compareAndSet(State.STARTED, State.CLOSED), "Already closed or has not been started");client.getConnectionStateListenable().removeListener(listener);executorService.close();ourTask.set(null);
}
CAS操作,将状态从已启动更新为已关闭
清除掉链接上的监听
关闭线程池
制空异步任务Future

5.6 监听器包装

在构造器中,可以发现,对于监听器,LeaderSelector是做了一层包装的:

private static class WrappedListener implements LeaderSelectorListener{private final LeaderSelector leaderSelector;private final LeaderSelectorListener listener;public WrappedListener(LeaderSelector leaderSelector, LeaderSelectorListener listener){this.leaderSelector = leaderSelector;this.listener = listener;}@Overridepublic void takeLeadership(CuratorFramework client) throws Exception{listener.takeLeadership(client);}@Overridepublic void stateChanged(CuratorFramework client, ConnectionState newState){try{listener.stateChanged(client, newState);}catch ( CancelLeadershipException dummy ){leaderSelector.interruptLeadership();}}}

一个手工代理的套路
关键的对listener.stateChanged进行了代理增强
处理了CancelLeadershipException
进行了leaderSelector.interruptLeadership()
这就是上文说在takeLeadership中抛出CancelLeadershipException,才会得到妥善的清理

5.7 中断

那再来看看leaderSelector是如何处理中断的:

public synchronized void interruptLeadership()
{Future<?> task = ourTask.get();if ( task != null ){task.cancel(true);}
}
synchronized
就是拿到线程池中正在执行的任务的Future
调用Future的cancel取消执行

可以看出这里对任务的处理要好于Leader Latch的方式。在Leader Latch需要自行处理中断
6. 小结

通过源码发现LeaderSelector选主,完全是通过一个分布式公平锁来实现的。

内部使用线程池来执行选主任务,以及业务逻辑。而且,是可以重新排队的。

可以和Leader Latch制作一个小对比

方式 | 任务调用 | 重新选主 | 公平性 | 适用场景 —|--- Leader Election | 异步 | 自动 | 公平 | 分布式任务 Leader Latch | 同步 | 手工实现 | 非公平· | 热备·

Leader Latch 采用有序临时节点,重入时顺序控制可能缺失公平性

Leader Latch 对于节点的监听,为避免惊群效应,采用的对参与者排序后,逐个监听上一位参与者

  1. 测试
import org.apache.commons.lang3.RandomStringUtils
import org.apache.curator.framework.CuratorFramework
import org.apache.curator.framework.CuratorFrameworkFactory
import org.apache.curator.framework.recipes.leader.LeaderSelector
import org.apache.curator.framework.recipes.leader.LeaderSelectorListenerAdapter
import org.apache.curator.retry.ExponentialBackoffRetry
import org.junit.Before
import org.junit.Test
import java.util.*
import java.util.concurrent.CountDownLatch
import java.util.concurrent.TimeUnit/*** Created by roc on 2017/5/26.*/
class LeaderElectionTest {val LATCH_PATH: String = "/test/leader/election"var client: CuratorFramework = CuratorFrameworkFactory.builder().connectString("0.0.0.0:8888").connectionTimeoutMs(5000).retryPolicy(ExponentialBackoffRetry(1000, 10)).sessionTimeoutMs(3000).build()@Before fun init() {client.start()}@Test fun runTest() {var id: String = RandomStringUtils.randomAlphabetic(10)println("id : $id ")val time = Date()val latch: CountDownLatch = CountDownLatch(1)val leaderSelector: LeaderSelector = LeaderSelector(client, LATCH_PATH, object : LeaderSelectorListenerAdapter() {override fun takeLeadership(cc: CuratorFramework) {println("$id 当选 $time")while (true) {println("$id 执行中 $time")if (Math.random() > 0.89) {println("$id 退出此轮任务 $time")break;}TimeUnit.SECONDS.sleep(2)}}})leaderSelector.id = idleaderSelector.autoRequeue()leaderSelector.start()latch.await()leaderSelector.close()}}

zookeeper:

ls /test/leader/election
[_c_670dad30-2a82-4f93-81cf-02ef905c9a51-lock-0000000361,
_c_a4fd8057-c970-4dd4-aa25-fbf40e2f2151-lock-0000000360, _c_44e04a6d-d75b-480d-a46e-245612fec815-lock-0000000362]

get /test/leader/election/_c_4c1a24ff-e707-4c2e-a444-02ab8954f38b-lock-0000000364
djOWbQflak
cZxid = 0x1ddfe
ctime = Fri May 26 19:38:29 CST 2017
mZxid = 0x1ddfe
mtime = Fri May 26 19:38:29 CST 2017
pZxid = 0x1ddfe
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x15156529fae07f0
dataLength = 10
numChildren = 0
查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 科普:淘宝搜索规则,搜索原理,我们的应对策略,怎么做好搜索,商品发布需要注意哪些,搜索规则涉及到的因素,搜索流量

    哈喽,大家好,我是四七。 今年是特殊的一年,因为疫情的原因,许多企业甚至工厂濒临绝境。 但是你想创业,那就必须需要更强的抗压能力。 说到创业,估计很多人第一反应是开家淘宝店。 那么,作为一名淘宝准掌柜,你必须知道的一件事情就是——搜索规则。 本文主要包括两个部分…...

    2024/5/4 1:57:02
  2. 什么是 C 和 C ++ 标准库?学编程的你应该知道这些知识!

    简要介绍编写C/C ++应用程序的领域,标准库的作用以及它是如何在各种操作系统中实现的。我已经接触C++一段时间了,一开始就让我感到疑惑的是其内部结构:我所使用的内核函数和类从何而来? 谁发明了它们? 他们是打包在我系统中的某个地方吗? 是否存在一份官方的C ++手册?在…...

    2024/4/29 23:07:50
  3. Fastai/Pytorch 的 BCEWITHLOGITSLOSS/AdaptiveLoss

    最近在学习一篇有关于fastai的鉴别器知识,整理相关的有意思的可以学习的点。 1、鉴别器结构 def custom_gan_critic(n_channels: int = 3, nf: int = 256, n_blocks: int = 3, p: int = 0.15):"Critic to train a `GAN`."layers = [_conv(n_channels, nf, ks=4, str…...

    2024/5/2 9:27:23
  4. 【学习笔记】GitHub 基本使用

    Git 的结构工作区:我们书写代码的地方暂存区:打算提交的东西,但是还没有提交,暂时存放的区域。里面的内容将来可以提交到本地库,也可以撤销出暂存区。本地库:存储每一个我们提交过的历史的版本三者如何协同工作: 代码基本提交流程:在工作区使用 git add 命令添加到暂存…...

    2024/4/29 23:07:43
  5. HAT: Hardware-Aware Transformers for Efficient Natural Language Processing翻译

    摘要 Transformer在自然语言处理(NLP)任务中无处不在,但是由于需要大量的计算,因此很难将其部署在硬件上。为了在资源受限的硬件平台上实现低延迟推理,我们建议使用神经结构搜索设计Hardware-Aware Transformer(HAT)。我们首先构造一个具有任意编码器-解码器注意力模块和…...

    2024/4/29 22:10:09
  6. 手机摄影小白笔记

    PS:该篇博客总结自知乎多篇回答,仅供参考。1、多拍多练习 2、线条、光影与色彩 ​ 摄影除了内容,最关键的三点就是线条、光影与色彩。 (1)线条 拍摄有规律的或有趣的线条,培养对线条的感知,从而培养构图的能力。通过拍摄有意思的线条,然后后期成黑白灰来感知线条。 一开…...

    2024/4/29 23:07:33
  7. 分布式无状态登录授权解决方案

    1.无状态登录 1.1.有状态 在了解无状态登录之前先解释一下什么是有状态: 有状态服务,即服务端需要记录每次会话的客户端信息,从而识别客户端身份,根据用户身份进行请求的处理,最典型的就是Tomcat中的Session。 例如:用户登录后,我们会将登录用户的信息保存在Session中,…...

    2024/4/29 23:07:31
  8. vmware虚拟机centos添加磁盘

    vmware虚拟机玩多了,发现vmdk文件特别大,而且就算后来把虚拟系统中的文件删除,vmdk文件也不会变小。感觉这样有着显而易见的弊端,就想了想办法。 去网上找了找,好像让vmdk文件变小是不行的。 但看到了一个思路,就决定试试:给vmware中的虚拟机添加磁盘,使用独立的vmdk文…...

    2024/4/29 23:07:27
  9. 接入融合SDK的快速调试方法

    由于实际需求,项目可能要分发多个渠道,接入融合的sdk是当前情况的首选。但是当我们接好融合sdk,不同的子包sdk接入之后,不同的sdk有自己独特的表现方式,导致一个不可描述的bug出现,这种bug可能只在某个sdk下才会出现的。那么我们面临的情况就是logcat下这个子包,发现可能…...

    2024/4/29 23:07:22
  10. 工作总结20200815

    经过几次无硝烟战争后宝爸带孩子让我放心了,今天在出来加会儿班的时间整理一下思路。总结:自2017.4跳槽到现在公司后有以下几个特点:1、算法知识的研究能力停滞;2、大部分时间浪费在管理上面;3、工程能力缓慢进步。组内人员各自都奔向更好的前程(博后,大厂、公务员等),…...

    2024/4/29 23:07:18
  11. Python|排列组合练习题

    Python|排列组合练习题,求助! 题目 将1→9这9个数字分别填入等式“A6=B”中,其中A为8位数,B为9位数,并且A中包含的所有数字不相等,B中包含的所有数字也不相等。 代码 1、这个题目我是在一个APP里面看见的,没有想到什么特别好的办法去解题,除了编程去暴力破解。 2、我的…...

    2024/4/29 23:07:17
  12. (精华)2020年8月15日 redis数据库 StackExchange.Redis中Hash类型(C#版)

    RedisHashService 类请参考第一篇的封装 redis 数据结构Hash的使用 using (RedisHashService service = new RedisHashService()) { service.SetEntryInHash("student", "id", "001"); service.SetEntryInHash("student", "name&…...

    2024/4/29 23:07:12
  13. 速度仪表的QT实现

    参考 https://www.cnblogs.com/feiyangqingyun/p/10739099.html 内容实现仪表自定义。上面博客作者提供了SDK免费下载,可以直接在电脑上使用,测试过效果很赞。但因为最后要实现在嵌入式上运行,需要编译源码,因为使用的控件不多,因此考虑自己根据上面的显示效果自己来实现。…...

    2024/4/29 23:07:06
  14. 在Ubuntu下访问Windows共享文件夹

    文章目录要求操作流程1. 安装必要的文件2. 验证安装是否正常3. 将Windows共享文件夹与本地文件夹关联注意 要求 在Ubuntu下进行配置,从而可以访问 192.168.3.6 的主机共享的文件夹 shared. 操作流程 1. 安装必要的文件 这里需要安装两个程序: $ sudo apt install smbclient …...

    2024/4/29 23:07:02
  15. 干货来袭:趁周末看完这115道的Java经典面试真题集锦(面中率高、全),附带答案

    Java是一个支持并发、基于类和面向对象的计算机编程语言。下面列出了面向对象软件开发的优点:代码开发模块化,更易维护和修改。代码复用。增强代码的可靠性和灵活性。增加代码的可理解性。 面向对象编程有很多重要的特性,比如:封装,继承,多态和抽象。下面的章节我们会逐个…...

    2024/4/29 23:07:05
  16. CTF_刷题记录

    6月21日20点-22日20点 1200点 继续努力吧REVERSE 2题 CRYPTO 4题 MISC 2题REVERSE HelloCTF 用IDA打开这串字符感觉似曾相识,拿去16进制转文本可得:CrackMeJustForFun, 套上falg{}提交 insanity 用IDE打开得flag{This_is_a_flag} (这两题完全白给,搜的题目关键字。但是re完…...

    2024/4/29 23:06:55
  17. Spring学习路之初级AOP模块

    以下内容集成到了GitHub项目中,有兴趣的朋友可以看一下GitHubhttps://github.com/HeShuai-GitHub/springDemo.git随手记ideaj中不可以建立和java关键字名字等同的包名一、spring依赖引入(Maven) <!--spring依赖 start--><!--这个jar文件包含Spring 框架基本的核心工…...

    2024/5/2 2:23:05
  18. 教程向|Zbrush如何用选区制作遮罩调整角色姿势,强推给萌新(3)

    步骤一、在LightBox[灯光盒子]中选择SuperAverageMan,在视图文档中拖拽出来,将其SDiv[细分等级]设置为3,激活旋转工具,按住Ctrl键将遮罩区域放置在大腿根部位置,如图(左)所示。 步骤二、将视图旋转到侧面正交视图,在大腿上绘制动作线,如下图(右)所示。步骤三、移动最…...

    2024/4/29 23:06:46
  19. iOS进阶 :【NSProxy模拟多继承】作为一个委托代理对象,将消息转发给一个真实的对象或者自己加载的对象

    前言 NSProxy类不是继承自NSObject类或者NSObject子类,而是一个实现了NSObject协议的抽象基类。 @interface NSProxy <NSObject> {Class isa; }这个类的作用就是作为一个委托代理对象,将消息转发给一个真实的对象或者自己加载的对象。 当然,在大部分情况下,使用NSObj…...

    2024/4/29 23:06:41
  20. (精华)2020年8月15日 redis数据库 StackExchange.Redis封装源码(C#版)

    首先nuget:ServiceStack.Redis ServiceStack.Common ServiceStack.interfaces ServiceStack.Text基本版 public sealed class RedisConfigInfo{/// <summary>/// 可写的Redis链接地址/// format:ip1,ip2/// /// 默认6379端口/// </summary>public string WriteSer…...

    2024/4/29 1:19:11

最新文章

  1. UNIAPP小程序从入门到精通

    第一章> 1、如何创建项目 2、项目的基本结构 3、页面组成&#xff08;wxss可以不用&#xff09; 4、组件的使用 5、协同开发与发布 第二章> 6、WXML页面结构渲染 7、style样式美化 8、a…...

    2024/5/4 6:32:39
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 零基础 HTML 入门(详细)

    目录 1.简介 1.1 HTML是什么? 1.2 HTML 版本 1.3 通用声明 2.HTML 编辑器 3.标签的语法 4.HTML属性 5.常用标签 5.1 head 元素 5.1.1 title 标签 5.1.2 base 标签 5.1.3 link 标签 5.1.4 style 标签 5.1.5 meta 标签 5.1.6 script 5.2 HTML 注释 5.3 段落标签…...

    2024/5/1 13:12:05
  4. OpenHarmony开发-连接开发板调试应用

    在 OpenHarmony 开发过程中&#xff0c;连接开发板进行应用调试是一个关键步骤&#xff0c;只有在真实的硬件环境下&#xff0c;我们才能测试出应用更多的潜在问题&#xff0c;以便后续我们进行优化。本文详细介绍了连接开发板调试 OpenHarmony 应用的操作步骤。 首先&#xf…...

    2024/5/3 10:28:22
  5. 416. 分割等和子集问题(动态规划)

    题目 题解 class Solution:def canPartition(self, nums: List[int]) -> bool:# badcaseif not nums:return True# 不能被2整除if sum(nums) % 2 ! 0:return False# 状态定义&#xff1a;dp[i][j]表示当背包容量为j&#xff0c;用前i个物品是否正好可以将背包填满&#xff…...

    2024/5/3 11:50:27
  6. 【Java】ExcelWriter自适应宽度工具类(支持中文)

    工具类 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet;/*** Excel工具类** author xiaoming* date 2023/11/17 10:40*/ public class ExcelUti…...

    2024/5/2 16:04:58
  7. Spring cloud负载均衡@LoadBalanced LoadBalancerClient

    LoadBalance vs Ribbon 由于Spring cloud2020之后移除了Ribbon&#xff0c;直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件&#xff0c;我们讨论Spring负载均衡以Spring Cloud2020之后版本为主&#xff0c;学习Spring Cloud LoadBalance&#xff0c;暂不讨论Ribbon…...

    2024/5/2 23:55:17
  8. TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案

    一、背景需求分析 在工业产业园、化工园或生产制造园区中&#xff0c;周界防范意义重大&#xff0c;对园区的安全起到重要的作用。常规的安防方式是采用人员巡查&#xff0c;人力投入成本大而且效率低。周界一旦被破坏或入侵&#xff0c;会影响园区人员和资产安全&#xff0c;…...

    2024/5/3 16:00:51
  9. VB.net WebBrowser网页元素抓取分析方法

    在用WebBrowser编程实现网页操作自动化时&#xff0c;常要分析网页Html&#xff0c;例如网页在加载数据时&#xff0c;常会显示“系统处理中&#xff0c;请稍候..”&#xff0c;我们需要在数据加载完成后才能继续下一步操作&#xff0c;如何抓取这个信息的网页html元素变化&…...

    2024/5/3 11:10:49
  10. 【Objective-C】Objective-C汇总

    方法定义 参考&#xff1a;https://www.yiibai.com/objective_c/objective_c_functions.html Objective-C编程语言中方法定义的一般形式如下 - (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgu…...

    2024/5/3 21:22:01
  11. 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】

    &#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】&#x1f30f;题目描述&#x1f30f;输入格…...

    2024/5/3 23:17:01
  12. 【ES6.0】- 扩展运算符(...)

    【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数&#xff0…...

    2024/5/2 23:47:43
  13. 摩根看好的前智能硬件头部品牌双11交易数据极度异常!——是模式创新还是饮鸩止渴?

    文 | 螳螂观察 作者 | 李燃 双11狂欢已落下帷幕&#xff0c;各大品牌纷纷晒出优异的成绩单&#xff0c;摩根士丹利投资的智能硬件头部品牌凯迪仕也不例外。然而有爆料称&#xff0c;在自媒体平台发布霸榜各大榜单喜讯的凯迪仕智能锁&#xff0c;多个平台数据都表现出极度异常…...

    2024/5/3 13:26:06
  14. Go语言常用命令详解(二)

    文章目录 前言常用命令go bug示例参数说明 go doc示例参数说明 go env示例 go fix示例 go fmt示例 go generate示例 总结写在最后 前言 接着上一篇继续介绍Go语言的常用命令 常用命令 以下是一些常用的Go命令&#xff0c;这些命令可以帮助您在Go开发中进行编译、测试、运行和…...

    2024/5/3 1:55:15
  15. 用欧拉路径判断图同构推出reverse合法性:1116T4

    http://cplusoj.com/d/senior/p/SS231116D 假设我们要把 a a a 变成 b b b&#xff0c;我们在 a i a_i ai​ 和 a i 1 a_{i1} ai1​ 之间连边&#xff0c; b b b 同理&#xff0c;则 a a a 能变成 b b b 的充要条件是两图 A , B A,B A,B 同构。 必要性显然&#xff0…...

    2024/5/4 2:14:16
  16. 【NGINX--1】基础知识

    1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息&#xff0c;并安装一些有助于配置官方 NGINX 软件包仓库的软件包&#xff1a; apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…...

    2024/5/3 16:23:03
  17. Hive默认分割符、存储格式与数据压缩

    目录 1、Hive默认分割符2、Hive存储格式3、Hive数据压缩 1、Hive默认分割符 Hive创建表时指定的行受限&#xff08;ROW FORMAT&#xff09;配置标准HQL为&#xff1a; ... ROW FORMAT DELIMITED FIELDS TERMINATED BY \u0001 COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMI…...

    2024/5/3 1:55:09
  18. 【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法

    文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中&#xff0c;传感器和控制器产生大量周…...

    2024/5/2 8:37:00
  19. --max-old-space-size=8192报错

    vue项目运行时&#xff0c;如果经常运行慢&#xff0c;崩溃停止服务&#xff0c;报如下错误 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 因为在 Node 中&#xff0c;通过JavaScript使用内存时只能使用部分内存&#xff08;64位系统&…...

    2024/5/3 14:57:24
  20. 基于深度学习的恶意软件检测

    恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。 它利用目标系统漏洞&#xff0c;例如可以被劫持的合法软件&#xff08;例如浏览器或 Web 应用程序插件&#xff09;中的错误。 恶意软件渗透可能会造成灾难性的后果&#xff0c;包括数据被盗、勒索或网…...

    2024/5/2 9:47:25
  21. JS原型对象prototype

    让我简单的为大家介绍一下原型对象prototype吧&#xff01; 使用原型实现方法共享 1.构造函数通过原型分配的函数是所有对象所 共享的。 2.JavaScript 规定&#xff0c;每一个构造函数都有一个 prototype 属性&#xff0c;指向另一个对象&#xff0c;所以我们也称为原型对象…...

    2024/5/4 2:00:16
  22. C++中只能有一个实例的单例类

    C中只能有一个实例的单例类 前面讨论的 President 类很不错&#xff0c;但存在一个缺陷&#xff1a;无法禁止通过实例化多个对象来创建多名总统&#xff1a; President One, Two, Three; 由于复制构造函数是私有的&#xff0c;其中每个对象都是不可复制的&#xff0c;但您的目…...

    2024/5/3 22:03:11
  23. python django 小程序图书借阅源码

    开发工具&#xff1a; PyCharm&#xff0c;mysql5.7&#xff0c;微信开发者工具 技术说明&#xff1a; python django html 小程序 功能介绍&#xff1a; 用户端&#xff1a; 登录注册&#xff08;含授权登录&#xff09; 首页显示搜索图书&#xff0c;轮播图&#xff0…...

    2024/5/3 7:43:42
  24. 电子学会C/C++编程等级考试2022年03月(一级)真题解析

    C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…...

    2024/5/3 1:54:59
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57