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

分布式系统Paxos算法

转载自  分布式系统Paxos算法

 这是一个有关Paxos算法非常形象的讲解与示范。Paxos是能够基于一大堆完全不可靠的网络条件下却能可靠确定地实现共识一致性的算法。也就是说:它允许一组不一定可靠的处理器(服务器)在某些条件得到满足情况下就能达成确定的安全的共识,如果条件不能满足也确保这组处理器(服务器)保持一致。

什么是共识?

  具体来说是这样:分布式系统中由于网络之间通讯可能会中断,虽然概率很低,但是没有100%完美的网络因此,依靠网络通讯的计算机之间要达成共识就比较困难,假设有X, Y和Z三台计算机谋划在周一攻击人类世界,它们的攻击计划是只要所有计算机可用于战斗时就一起进行攻击,不落下任何一台机器,但是当他们决定具体什么时间开始攻击时,在这个关键问题上往往会出错。

  一个基本问题是,每台机器都有自己的攻击时间建议,计算机X可以建议在08:00时间,因为这个时间正是周一早晨,而人们刚刚过完狂欢的周末休息天,但是计算机Z认为13:00比较好,理由当然也有一大堆,让这三台计算机基于某个时刻达成共识是非常困难的,因此,也给人类反击留下了机会。

  另外一个情况是,这三台计算机是位于世界不同的位置,之间通讯或许通过电缆或者其他不太可靠的网络设备通讯,如果X建议在08:00,它必须确认它的这个建议能够到达活着的Y和Z,以免一个人战斗。

问题是:我们不能准确地知道某个计算机的延迟的原因:是因为性能慢了还是已经是彻底死机不能用?

  那么,X怎么知道其他两个计算机是可用的呢?也就是说,当X和其他两个计算机通讯发现得到响应要过很长时间,它不能确定这两台计算机到底还能不能继续活下去,也许这次通讯有延迟了,下一次它们又活过来了没有延迟了,也许下次延迟更长了一点,也许下次延迟稍微短了一点,这些随机概率问题使得X不能确定Y和Z到底是出了什么问题造成延迟的,是因为处理了某个特别耗费CPU的任务还是因为死锁等原因?当然,有些天真的设计者会说,只要我们将性能监控到位,如果延迟超过一定时间,我们人工介入告诉X确切情况就可以,那么这种人工介入的分布式系统不是一个天然自洽的自动化系统了,不在我们讨论范围之内,而且这样的系统会让人疲于奔命。

  因为X不能确定Y或Z是否可用,所以X仅仅只能和Y与Z中一台基于攻击时间达成共识,就无法完全三台机器全部投入战斗的计划。注意的是,X Y Z三台中任何一台都可能会出现延迟,这就造成了三台机器之间任何通讯都是无法确认可靠的,比如X发出消息给Z,Z确认后回执给X,但是这段时间X突然死机了,那么Z要等待X多长时间才能知道它收到确认呢?还是再次等待X回复确认的确认,这样无限循环下去也不能解决它们之间通讯可能出现随机不可靠的问题。

  所有关键问题在于:由于这三台机器之间通讯是无法保证100%可靠,它们就不能就任何事情达成共识。

  下面以分布式拍卖案例说明这种情况以及Paxos的基本原理?

  在传统拍卖场景中,价高者先得,这些拍卖者都是在同一个房间,彼此能够直接看得到对方的报价,如果我们假设分布式拍卖是将这些拍卖者分离到不同的地方,这样我们可以用拍卖者之间的联系模拟分布式计算机之间的通讯。

  假设拍卖者各自在自己家里拍卖,通过邮局信件发出自己的拍卖信息,拍卖者之间除非等到邮局投递人告诉他们彼此之间的报价,否则是无法知道对方报价的。如果邮局信件投递这个环节出了问题,投递速度慢了甚至无法投递了,那么整个拍卖程序就无法继续进行下去。

 

Paxos解决共识思路

 

  Paxos是一个解决共识问题consensus problem的算法,现实中Paxos的实现以及成为一些世界级软件的心脏,如Cassandra, Google的 Spanner数据库, 分布式锁服务Chubby. 一个被Paxos管理的系统实际上谈论的是值 状态和跟踪等问题,其目标是建造更高可用性和强一致性的分布式系统。

  Paxos完成一次写操作需要两次来回,分别是prepare/promise, 和 propose/accept:

 

  第一次由提交者Leader向所有其他服务器发出prepare消息请求准备,所有服务器中大多数如果回复诺言承诺就表示准备好了,可以接受写入;第二次提交者向所有服务器发出正式建议propose,所有服务器中大多数如果回复已经接收就表示成功了。

  为了详细描述这个两段过程,首先让我们定义一下我们将使用的一些名词术语:

  • 一个流程是系统中计算机的一个. 人们使用有关复制或节点等词语表达,都差不多。
  • 一个客户端是属于系统中一个成员的计算机,但是询问系统值是什么或者要求系统获取一个新的值。

  Paxos构建分布式数据库的小片段: 它仅仅实现流程将一个新的东西精确地写入系统中,流程是由Paxos的一个实例管治,可以失败或者不知道任何东西、或者大多数流程都知道一个同样的值,这就是共识,Paxos并不真的告诉我们如何用它来构建数据库或类似的东西,它只是负责独立节点之间通讯的流程, 这些流程服务器会基于一个新值执行决定,Paxos会存储一个值数据,只是一次性的,一旦你第一次设置以后就不能再改变它。

 

Paxo读操作

  其实Paxos精华是在写操作,将读操作放在写操作前面讲解,是着重Paxos以大多数服务器达成共识为重要标志,通过读取判断是否达成共识这一状态。

  为了从Paxos系统中读取一个值数据,客户端会请求读取所有流程中存储的当前值,然后从大多数流程服务器中获得这个值,如果数量凑不够大多数或者没有足够的客户端响应,读取操作失败,下面图示你会看到一个客户端询问其他节点他们的值是多少,这些节点返回值给客户端,当客户端获得了大多数节点的响应,返回的值都是同样的,它就算成功地读操作了,并顺便保存读结果。

  与单节点系统(只有一台服务器)相比这有些奇怪,这两个系统中,客户端都需要观察系统已决定状态,但是在非分布式系统中像MySQL或一个memcached服务器中, 客户端只需直接向标准的状态存储的服务器地址获取状态即可,在简单的Paxos中, 客户端也是同样的方式观察状态,但是因为并没有标准的状态存储的服务器地址,它需要询问所有的成员,以便能够确定仅有一个会报告值数据,实际上是大多数节点都持有的值数据,如果客户端询问一个节点,有可能这个节点流程已经过期,得到了错误的值数据,流程失效过期的原因有很多:由于不可靠的网络导致本应送达到它们的消息丢失了;或者他们也许当机然后使用了一个过期状态恢复;或者算法还在运行计算中,流程并没有正好得到消息等等。在现实中使用Paxos实现时,其实不需要每个节点都进行一次读取,会有更好的读取方式,但是他们都是拓展的原始 Paxos 算法。

 

Paxos写操作

  当一个客户端要求写入系统一个新值时,让我们看看Paxos让我们集群的流程都做了什么?下面的过程都是只有一个值的写入,最终我们能用这个流程作为原始数据,允许值数据在彼此之间一个个设置,但是基本的Paxos算法管治了一个新值数据的写操作流程, 然后做重复的事情。

  首先Paxos管理的系统中一个客户端要求写入一个新值,客户端这里如图所示是红圈,其它流程是蓝圈, Paxos能保证客户端发送它们的写请求到Paxos集群中任何成员, 这里演示中客户端随机挑选流程中任意一个,这种方式是重要且巧妙的,意味著没有任何单点风险,意味着我们的Paxos管治系统能继续保持在线可用,无论任何一个节点当机或其他不可用原因无响应。如果我们设计一个特定节点作为“推荐人proposer”或者 "the master" 等, 如果这个主节点死机,那么整个系统就崩溃了。

  当写请求被接受后,Paxos流程会接受这个写新值到系统中请求“建议”, “建议”是Paxos中一个正式概念: 向一个Paxos管治的系统建议可能会成功或失败,需要步骤来确保共识能够达成维系,这个建议以准备消息从那些与客户端连接的流程节点们被发往整个系统。

序列号

  这个准备消息保存在被建议的值数据中,它们也称为序列号sequence number,序列号是由建议流程产生的,它定义了接受流程应该准备接受带有序列号的建议,这个序列号是关键: 它用于表明新旧建议之间的区别,如果两个流程试图获得需要设置一个值,Paxos认为最后一个流程应该有优先权,这样让流程分辨哪个是最后一个,这样它就能设置最新的值。

  这些接受的流程能够进行在系统中关键的检查:这个在到来的准备消息中序列号是我见过的最高级别吗?如果是,那就很cool, 我能准备好接受将要到来的值数据,那就不要管之前听到的任何其他值数据了,你能看到这个过程在右边演示中:客户端每隔一段向一个流程建议一个新值,这个流程发送准备消息给其他流程,然后那些流程注意到这是一个成功的更高的超过旧的新序列号,然后就放手那些旧建议。

  这里有一个顺序的设计(先发送准备消息),这是为避免单点风险,如果没有这个顺序,Paxos中成员就无法分辨哪个建议是他们可以有信心地准备接受的。

  我们不能想象有另外不同的共识算法,不是按照如下步骤:首先发送第一个消息询问其他流程,以确保将设置的新值是最新的值,尽管方式可以再简单些,但是可能就不能满足共识算法安全的需求了,如果两个流程正好同时建议不同的值,如下所示:

  大自然经常会这样欺骗我们,每个包都能另外一半的流程相信它们接受的也许是正确也许是错误的值,系统将进入一个僵局,存在两个相同数量的组却有不同的值,那么就无法确定大多数这个概念了,这个僵局能够被第一个Paxos消息避免,因为Paxos的序列号,那些有问题的建议将有被其他更低的序列号,这样序列号更高的建议就会毫不含糊地被大多数流程接收,它们也首先获得了更高的序列号,然后如果接受到更低的序列号就会拒绝,Paxos 就是这样通过用序列号控制整个系统的时间节奏。

上图演示了客户端首先发一个准备消息给Paxos流程,Paxos流程会检查下一步将到来的建议的序列号,以分辨是否准备接受这个新值,所有流程都是这样消除歧义,共识由此达成。

  注意:保证没有两个建议使用相同的序列号是很重要的,这是确保他们的顺序,这样每个序列号只有一个建议,这样才能比较两个建议,实现Paxos时,全局唯一有序的序列号实际是精确系统时间和集群中节点数量的拷贝,随着时间不断增加,从来不会重复。

 

Paxos第一阶段:准备Perpare/诺言Promises

  

        Paxos的第一阶段是prepare/promise,准备阶段就是将建议值发送到各个目标节点。

  当建议被发到目标节点后,流程会会检查建议中的序列号,是否是它们见到过的最高级,如果是最高级,它们会发出一个promise不再接受比这个新序列号更旧的建议了,这个诺言promise作为消息从许下诺言的流程发到提交建议新值的流程服务器,这个诺言消息给提交建议的流程后,提交建议的流程需要自己统计一下有多少其他流程已经发回它们的诺言promise了,如果判断数量上是否达到大多数?如果大多数流程已经同意接受这个建议或者更高级序列号的建议,这个提交建议的流程就能知道它获得了发言权(因为有大多数支持),这样就开始讲话,算法中的下一步处理将可能进行;如果回复诺言的节点数量没有达到大多数,也就是共识没有达成,这样这个节点提交的建议将退出,客户端要求的写操作失败。

  为了决定一个建议是否已经有足够的回复诺言promises, 提交建议者只是统计一下它接受到的 promise消息数量,然后和整个系统中节点服务器数量比较一下,“足够”意味着大多数(N/2 + 1)个流程服务器在某段时间内都回复了诺言promises。如果超过一半的流程服务器没有返回诺言,这意味着这个建议没有被大多数通过,那么在前面描述的读算法中就不能满足大多数的要求,也就不能达成共识,这个建议就退出。其他包括网络分区错误也可能会阻止大多数达成共识,

 

第二阶段:Paoxs接纳Acceptance

  当完成prepare/promise阶段,进入了 propose/accept阶段。

  一旦建议提交者已经从大多数其他流程服务器获得了诺言,它会要求许诺的流程服务器接收它们之前承诺接受的新值数据,这是一个“确认commit”阶段,如果没有冲突建议 失败或分区错误,那么这个新建议将被所有其他节点接受,那么Paxos过程就完成了。

  你能看到右边的演示,注意这个演示比上面promise在最后多了一个动作,也就是提交建议者将新值发给那些许诺言的流程服务器,让它们接受了这个新值。

  接受的过程也许可能会发生失败,在回复了诺言消息以后,在接受到Accept消息之前,如果有足够多的服务器正好在这个时间段失败,那么接受行为只能是少数服务器,那么Paxos进入了厄运状态:一些流程服务器接受了新值,而不是全部的,这种不一致已经在前面读操作中描述:一个客户端试图从系统中大多数节点服务器读取它们同意接受的值,它发现一些节点服务器报告有不同的值数据,这会引起读失败,但是Paxos还保持一致性,不允许在没有达成共识情况下任何写操作发生,这种坏的情况在实践中经常通过重复接受阶段来让大多数节点最终接受。

总结

  Paxos算法是保证在分布式系统中写操作能够顺利进行,保证系统中大多数状态是一致的,没有机会看到不一致,因此,Paxos算法的特点是一致性>可用性。

  vector clock向量时钟是另外一种保证复制的算法,其特点是可用性>一致性,但是,一旦发生冲突,不像Paxos能自行解决,需要人工干预编写代码解决。

  Paxos算法和Vector Clock都是由Leslie Lamport提出。

相关文章:

ADB学习笔记

简介: ADB的全称为Android Debug Bridge(调试桥), 它是一个客户端-服务器端程序,其中客户端是你用来操作的电脑, 服务器端是android设备。作用显而易见,能方便我们在PC上对手机进行调试的一些工作。 原理…...

http load介绍

前几天工作中要对项目的接口做简单压测,就使用了http load做了简单测试,下面介绍一下这款工具的使用说明。简介:http_load是基于linux平台的性能测试工具,它体积非常小,仅100KB。它以并行复用的方式运行,可…...

TestNG使用总结

TestNG简介: TestNG是一个测试框架,其灵感来自JUnit和NUnit,但同时引入了一些新的功能,使其功能更强大,使用更方便。 TestNG相较于Junit的优点: 可指定执行顺序, dependsOnMethods 属性来应对…...

面向对象编程的弊端

英文原文:What’s Wrong with OOP and FP 我不理解为什么人们会对面向对象编程和函数式编程做无休无止的争论。就好象这类问题已经超越了人类智力极限,所以你可以几个世纪的这样讨论下去。经过这些年对编程语言的研究,我已经清楚的看到了问题…...

flex 计算指定日期是本年度第几周

/** * 计算指定日期是本年度第几周 *传日年月日,返回number */ private function weekOfYear(yyyy:Number,mm:Number,dd:Number):Number{ var myDate:Date new Date(yyyy, mm - 1, dd); var startDate:Date new Date(yyyy,0,1); v…...

SpringCloud Zuul(四)之工作原理

一、筛选器概述 Zuul的中心是一系列过滤器,这些过滤器能够在HTTP请求和响应的路由期间执行一系列操作。 以下是Zuul过滤器的主要特征: 类型:通常定义路由流程中应用过滤器的阶段(尽管它可以是任何自定义字符串)执行…...

webservice学习记录笔记(一)

一、先理解什么是服务 现在的应用程序变得越来越复杂,甚至只靠单一的应用程序无法完成全部的工作。更别说只使用一种语言了。 写应用程序查询数据库时,并没有考虑过为什么可以将查询结果返回给上层的应用程序,甚至认为,这就是数…...

接口测试那些事儿

什么是接口? 首先,在讲接口测试之前,我们先要搞清楚接口类型的概念。 接口:可能是系统与系统(包括服务与服务)之间的调用,像A系统(服务)给B系统(服务&#x…...

CodeForces - 1084C The Fair Nut and String 思维

The Fair Nut found a string s. The string consists of lowercase Latin letters. The Nut is a curious guy, so he wants to find the number of strictly increasing sequences p1,p2,…,pk , such that: For each i (1≤i≤k), spi a.For each i(1≤i<k), there is…...

Gym - 101986B Parallel Lines dfs暴力

链接&#xff1a;点击查看 题意&#xff1a;偶数个点&#xff0c;两点可连成一条线&#xff0c;求平行线最大对数 题解&#xff1a;当时想的时候傻逼了&#xff0c;想成了每次选两个点就是16*15/2 * 14*13/2 ..... 其实不需要这样&#xff0c;因为每个点必须要匹配一个的&…...

POJ - 2406 Power Strings next数组应用循环节

题目链接&#xff1a;点击查看 Language:Default Power Strings Time Limit: 3000MS Memory Limit: 65536KTotal Submissions: 61784 Accepted: 25534Description Given two strings a and b we define a*b to be their concatenation. For example, if a "abc" and…...

CodeForces - 545D Queue 贪心 排序

题目链接&#xff1a;点击查看 Little girl Susie went shopping with her mom and she wondered how to improve service quality. There are n people in the queue. For each person we know time ti needed to serve him. A person will be disappointed if the time he …...

Jmeter访问HTTPS请求

公司最近在搞全站HTTPS改造&#xff0c;进一步提高网站的安全性&#xff0c;防止运营商劫持。那么&#xff0c;改造完成后&#xff0c;所有前后端的URL将全部为https。 So &#xff0c;研究下怎么用Jmeter访问https请求呢。 其实很简单&#xff0c; 第一步在jmeter中创建HTT…...

HDU - 6188 Duizi and Shunzi 贪心

Nike likes playing cards and makes a problem of it. Now give you n integers, ai(1≤i≤n) We define two identical numbers (eg: 2,2) a Duizi, and three consecutive positive integers (eg: 2,3,4) a Shunzi. Now you want to use these integers to form Shunzi and …...

JSON相关知识点

JSON是工作中经常会遇到的一种数据结构&#xff0c;下面来讲讲与他相关的一些知识点。 JSON简介&#xff1a; JSON: JavaScript Object Notation(JavaScript 对象表示法) JSON 是存储和交换文本信息的语法,类似 XML。 JSON 比 XML 更小、更快&#xff0c;更易解析。 JSONObj…...

牛客网 Applese 走方格

题目链接&#xff1a;点击查看 题解&#xff1a;我们容易发现到当n,m都为奇数时&#xff0c;是回不到原点的&#xff0c;因为你无论哪个方向走一去一回就是两步&#xff0c;所以n和m必然有一个偶数&#xff0c;那至于我们怎么走呢&#xff0c;看下图&#xff0c;注意的是n1,m2…...

mysql重置Root密码

方法一: 在my.ini的[mysqld]字段加入&#xff1a; skip-grant-tables 重启mysql服务&#xff0c;这时的mysql不需要密码即可登录数据库 然后进入mysql mysql>use mysql; mysql>更新 user set passwordpassword(新密码) WHERE Userroot; mysql>flush privileges; 运…...

idea常用技巧收集

idea相比eclipse的优点我在这里就不赘述了&#xff0c;更多参考&#xff1a;idea官网,本文重点讲下自己在idea使用过程中常用的一些技巧&#xff0c;以后随时更新…… 主要分成三大块&#xff1a; 1. 系统设置 2. 快捷键 3. 其他设置 系统设置 主题风格设置&#xff1a;默…...

架构设计 例子和实践 系统设计说明书

架构设计 例子和实践 系统设计说明书(架构、概要、详细)目录结构演进架构中的领域驱动设计Web架构设计经验分享软件架构设计从MVC框架看MVC架构的设计领域驱动设计(Domain Driven Design)参考架构详解关于垂直切分Vertical Sharding的粒度企业应用集成与开源ESB产品ServiceMix和…...

初识spring RestTemplate

《spring实战》读书笔记之初识spring RestTemplate。首先需要先了解下什么是REST。 REST&#xff1a;官方解释&#xff0c;表述性状态转移。 感觉还是不知所云&#xff0c;参考下怎样用通俗的语言解释REST&#xff0c;以及RESTful&#xff1f; 即URL定位资源&#xff0c;用H…...

程序员着装的改变

是什么力量&#xff0c;让任何地方的程序员都享有「免于体面的自由」&#xff1f; 在今天的社会里&#xff0c;工程师往往代表着知识水平和社会地位。每当普通人听到这个头衔&#xff0c;总会报之以敬仰的目光&#xff1a; 但有一种工程师&#xff0c;虽然也是如假包换的高级技…...

ZOJ - 2968 Difference Game 思维

题目链接&#xff1a;点击查看 Now you are going to play an interesting game. In this game, you are given two groups of distinct integers and C coins. The two groups, named Ga and Gbrespectively, are not empty and contain the same number of integers at firs…...

20个高级Java面试题汇总

转载自 20个高级Java面试题汇总 译文链接&#xff1a;http://www.codeceo.com/article/20-java-advanced-interview-questions.html 英文原文&#xff1a;Advanced Java Interview Questions 翻译作者&#xff1a;码农网 – 小峰 这是一个高级Java面试系列题中的部分。这一部分…...

单元测试框架-Junit介绍

在工作中编写接口脚本中经常用到junit作为测试框架&#xff0c;下面总结一下junit的用法和编写规范&#xff0c;供大家参考。 junit简介&#xff1a; 基于Java语言的单元测试框架&#xff0c;在日常工作中被广泛运用于单元测试和接口测试。 junit官网&#xff1a;http://jun…...

javaSE之动态代理

动态代理技术&#xff1a; 使程序更加灵活&#xff0c;可以在代理java类的时候加入一些功能。 很类似过滤器&#xff0c;区别&#xff1a; 过滤器是自己编写西横须实现的功能 动态代理是JVM内部机制 实现步骤&#xff1a; 1.真是业务对象&#xff08;被代理对象&#xff09; 2…...

CodeForces - 500B New Year Permutation floyd+选择排序

User ainta has a permutation p1, p2, ..., pn. As the New Year is coming, he wants to make his permutation as pretty as possible. Permutation a1, a2, ..., an is prettier than permutation b1, b2, ..., bn, if and only if there exists an integer k (1…...

支付系统的防重设计

转载自 支付系统的防重设计 导读 “目前在互联网应用的大部分支付场景中&#xff0c;对接支付宝、微信移动支付产品这样需要用户参与支付流程的支付方式已经变得非常普遍&#xff0c;类似的还有PC端银行网银支付&#xff1b;而通过绑定用户银行卡、对接银行卡快捷支付通道直接…...

Hibernate 主键生成策略

<generator>:主键生成策略 increment:递增,hibernate自动产生主键.max(id) ,采用带走1算法,多进程/集群环境下不推荐使用. identity:设置表主键是自增字段,映射文件采用该策略,依赖底层库, auto_increment identity 适用于MySQL、DB2、MS SQL Server&#xff0c;…...

flex 事件机制详解

事件机制的工作流程 1&#xff1a;关于事件流 当一个事件发生&#xff0c;必然存在一个派发事件的对象&#xff0c;这里称之为目标对象。 当事件发生后flashPlayer生成一个携带数据的对象&#xff0c;然后检查目标对象是否处于显示层中&#xff0c;如果是则遍历从根容器一直到目…...

codeforces 501 C. Misha and Forest 巧妙的拓扑排序

Lets define a forest as a non-directed acyclic graph (also without loops and parallel edges). One day Misha played with the forest consisting of n vertices. For each vertex v from 0 to n - 1 he wrote down two integers, degreev and sv, were the first inte…...

HDU - 3746 Cyclic Nacklace next数组求 循环节

题目链接&#xff1a;点击查看 CC always becomes very depressed at the end of this month, he has checked his credit card yesterday, without any surprise, there are only 99.9 yuan left. he is too distressed and thinking about how to tide over the last days. …...

CodeForces - 557C Arthur and Table 预处理 前缀

题目链接&#xff1a;点击查看 题意&#xff1a;有n个桌腿&#xff0c;要砍掉某些桌腿&#xff0c;使剩下的桌腿中长度最大的桌腿的数量如果超过一半。砍掉每个桌腿需要付出代价。求最小的代价和&#xff0c;操蛋&#xff0c;砍掉的意思是直接去掉&#xff0c;我理解成了&…...

MD5加密算法详解

注&#xff1a;MD5不是绝对的安全&#xff0c;有俩md5解决 /******************************************************************************* * keyBean 类实现了RSA Data Security, Inc.在提交给IETF 的RFC1321中的keyBean message-digest * 算法。 *****************…...

每天一个adb命令:screen 命令详解

screen命令分为截屏screencap命令及录制视频screenrecord命令。 screencap命令&#xff1a; sage: screencap [-hp] [-d display-id] [FILENAME]-h: this message-p: save the file as a png.-d: specify the display id to capture, default 0. If FILENAME ends with .png …...

markdown编写入门

什么是markdown&#xff1f; Markdown 是一种轻量级的「标记语言」&#xff0c;通过简单的标记符号来格式化排版&#xff0c;是文本展现的更加优美&#xff0c;形象。 markdown优点&#xff1a; 1.不像office&#xff0c;存在版本兼容问题&#xff0c;markdown无此问题&#…...

CCPC-Wannafly Winter Camp Day5 (Div2, onsite)

题目链接&#xff1a;点击查看 Kropki&#xff1a; 题目描述&#xff1a; 你有一个11到nn的排列p_1, p_2, \dots, p_np1​,p2​,…,pn​&#xff0c;对于所有的i (1\leq i\leq n-1)i(1≤i≤n−1)&#xff0c;如果p_ipi​和p_{i1}pi1​中&#xff0c;有一个数是另一个的两倍&…...

十分钟快速了解 ES6 Promise

转载自 十分钟快速了解 ES6 Promise 什么是Promise Promise最早由社区提出并实现&#xff0c;典型的一些库有Q&#xff0c;when&#xff0c; bluebird等&#xff1b;它们的出现是为了更好地解决JavaScript中异步编程的问题&#xff0c;传统的异步编程最大的特点就是地狱般的回…...

POJ - 2955 Brackets 入门区间dp

We give the following inductive definition of a “regular brackets” sequence: the empty sequence is a regular brackets sequence,if s is a regular brackets sequence, then (s) and [s] are regular brackets sequences, andif a and b are regular brackets seque…...

小乐乐学数学 哈理工第八届程序设计竞赛同步赛(高年级)H 树状数组 + 离线 + 互质区间

链接&#xff1a;https://ac.nowcoder.com/acm/contest/301/H 来源&#xff1a;牛客网 题目描述 小乐乐上了一节数学课&#xff0c;数学老师讲的很好&#xff0c;小乐乐听的也如痴如醉。 小乐乐听了老师的讲解&#xff0c;知道了什么是素数&#xff0c;现在他想做几个习题。 …...

《Maven实战》读书笔记

之前对Maven有些认识&#xff0c;通过这本书《Maven实战》一起系统的回顾一下&#xff0c;总结的东西不会很全面&#xff0c;但都是日常工作中最常用的。 简介&#xff1a; maven翻译为“知识的积累”&#xff0c;基于项目对象模型&#xff08;Project Object Model&#xff0…...

记一次爬虫实践(一):思路及模拟登录

需求背景 因为我们的应用通常运行在h5上&#xff0c;因此图片格式选择了加载较快的webp格式&#xff0c;但是运营提起有在pc上批量下载图片&#xff08;要求图片格式&#xff09;的需求&#xff0c;目前比较麻烦&#xff0c;需要登录h5-找到接口中对应图片资源-一张张另存为到…...

SSH免密码登录

公司服务器很多的话&#xff0c;如果每次连接都需要输入密码&#xff0c;那就太麻烦了。So&#xff0c;免密登录就可以大大提高我们的工作效率了。 下面介绍ssh免密登录的方法&#xff1a; 实现步骤&#xff1a; 1.在你的自己的机器下面使用ssh-keygen命令来实现创建公钥 使…...

log4j学习demo

log4j简介 Log4j是Apache的一个开放源代码项目&#xff0c;是项目中比较常用的日志记录组件。 引入log4j <dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.14</version></dependency> log4…...

flex验证座机,手机的框架

import mx.utils.StringUtil; import mx.validators.ValidationResult; import mx.validators.Validator; public class PhoneValidator extends Validator { public function PhoneValidator() { super(); } private var _phoneInvalid:String"正确格式(010-865…...

CodeForces - 555C Case of Chocolate set pair

题目链接&#xff1a;点击查看 题意&#xff1a;有一个n*n的矩形&#xff0c;给你对角线上的坐标&#xff0c;给你一个方向&#xff0c;问能走几个坐标&#xff0c;遇到之前已经经过的坐标就停止 题解&#xff1a;当给你一个坐标(x,y)&#xff0c;方向向上时&#xff0c;他能…...

HDU - 2328 Corporate Identity / POJ - 3080 Blue Jeans kmp 枚举

题目连接&#xff1a;点击查看 题意&#xff1a;n个字符串最长公共子串&#xff0c;相同长度就找字典序小的&#xff0c;poj那个是长度小于3&#xff0c;输出那句话 题解&#xff1a;以某一字符串为基准&#xff0c;枚举每个子串&#xff0c;然后暴力kmp即可&#xff0c;特记…...

ACID中C与CAP定理中C的区别

转载自 ACID中C与CAP定理中C的区别 ACID和CAP定理中都有C&#xff0c;代表Consistent一致性&#xff0c;很多人容易将这两个C混为一谈&#xff0c;其实这两个一致性是有区别的。 事务的定义是一系列操作要么全部成功&#xff0c;要么全部不成功&#xff0c;数据库的事务机制是…...

CodeForces - 450B Jzzhu and Sequences 规律

Jzzhu has invented a kind of sequences, they meet the following property: You are given x and y, please calculate fn modulo 1000000007 (109  7). Input The first line contains two integers x and y (|x|, |y| ≤ 109). The second line contains a single …...

HDU - 4389 X mod f(x) 数位dp

题目链接&#xff1a;点击查看Here is a function f(x):int f ( int x ) {if ( x 0 ) return 0;return f ( x / 10 ) x % 10;}Now, you want to know, in a given interval [A, B] (1 < A < B < 10 9), how many integer x that mod f(x) equal to 0. Input The fi…...

spring装配bean

最近在看《spring实战》一书&#xff0c;记录下spring装配bean这一章中自己学到的一些知识点。下面简单说明下bean和装配这两个概念的意思。 bean&#xff1a;在spring中代表组件&#xff0c;通过bean将不同的组件联系在一起。装配&#xff1a;是指创建应用对象之间协作关系的行…...