Paxos算法

1.Basic Paxos

假设我们要实现一个分布式集群,这个集群是由节点 A、B、C 组成,提供只读 KV 存储服务。你应该知道,创建只读变量的时候,必须要对它进行赋值,而且这个值后续没办法修改。因此一个节点创建只读变量后就不能再修改它了,所以所有节点必须要先对只读变量的值达成共识,然后所有节点再一起创建这个只读变量。

image.png

1.1三种角色

在 Basic Paxos 中,有提议者(Proposer)、接受者(Acceptor)、学习者(Learner)
三种角色,他们之间的关系如下:
image.png
提议者(Proposer):提议一个值,用于投票表决。为了方便演示,你可以把图 1 中的客户端 1 和 2 看作是提议者。但在绝大多数场景中,集群中收到客户端请求的节点,才是提议者(图 1 这个架构,是为了方便演示算法原理)。这样做的好处是,对业务代码没有入侵性,也就是说,我们不需要在业务代码中实现算法逻辑,就可以像使用数据库一样访问后端的数据。
接受者(Acceptor):对每个提议的值进行投票,并存储接受的值,比如 A、B、C 三个节点。 一般来说,集群中的所有节点都在扮演接受者的角色,参与共识协商,并接受和存储数据。
学习者(Learner):被告知投票的结果,接受达成共识的值,存储保存,不参与投票的过程。一般来说,学习者是数据备份节点,比如“Master-Slave”模型中的 Slave,被动地接受数据,容灾备份。

前面不是说接收客户端请求的节点是提议者吗?这里怎么又是接受者呢?

一个节点(或进程)可以身兼多个角色。想象一下,一个 3 节点的集群,1 个节点收到了请求,那么该节点将作为提议者发起二阶段提交,然后这个节点和另外2 个节点一起作为接受者进行共识协商,如下图:
image.png

什么是二阶段提交?

在两阶段提交过程中,主要分为了两种角色协调者(coordinator)和参与者(participants),协调者主要就是起到协调参与者是否需要提交事务或者中止事务,参与者主要就是接受协调者的响应并回复协调者是否能够参与事务提交,当接受到协调者提交事务的命令后提交事务等功能。
image.png
image.png·
image.png

1.2如何达成共识

(1)准备阶段

先来看第一个阶段,首先客户端 1、2 作为提议者,分别向所有接受者发送包含提案编号的准备请求:
注意:在准备请求中是不需要指定提议的值的,只需要携带提案编号就可以了
image.png
当节点 A、B 收到提案编号为 1 的准备请求,节点 C 收到提案编号为 5 的准备请求后,将进行这样的处理
image.png
由于之前没有通过任何提案:
节点 A、B 将返回一个 “尚无提案”的响应。也就是说节点 A 和 B 在告诉提议者,我之前没有通过任何提案呢,并承诺以后不再响应提案编号小于等于 1 的准备请求,不会通过编号小于 1 的提案。
节点 C 也是如此,它将返回一个 “尚无提案”的响应并承诺以后不再响应提案编号小于等于 5 的准备请求,不会通过编号小于 5 的提案。
继续:
另外,当节点 A、B 收到提案编号为 5 的准备请求,和节点 C 收到提案编号为 1 的准备请求的时候,将进行这样的处理过程:
image.png
节点 A、B收到提案编号为 5 的准备请求的时候,因为提案编号 5 大于它们之前响应的准备请求的提案编号 1,而且两个节点都没有通过任何提案,所以它将返回一个 “尚无提案”的响应,并承诺以后不再响应提案编号小于等于 5 的准备请求,不会通过编号小于 5 的提案
节点 C收到提案编号为 1 的准备请求的时候,由于提案编号 1 小于它之前响应的准备请求的提案编号 5,所以丢弃该准备请求,不做响应

(2)接受请求

第二个阶段也就是接受阶段,首先客户端 1、2 在收到大多数节点的准备响应之后,会分别发送接受请求:
image.png
客户端 1 收到大多数的接受者(节点 A、B)的准备响应后,根据响应中提案编号最大的提案的值,设置接受请求中的值。因为该值在来自节点 A、B 的准备响应中都为空(也就是图 5 中的“尚无提案”),所以就把自己的提议值 3 作为提案的值,发送接受请求[1, 3]
当**客户端 2 **收到大多数的接受者的准备响应后(节点 A、B 和节点 C),根据响应中提案编号最大的提案的值,来设置接受请求中的值。因为该值在来自节点 A、B、C 的准备响应中都为空(也就是图 5 和图 6 中的“尚无提案”),所以就把自己的提议值 7 作为提案的值,发送接受请求[5, 7]。

当三个节点收到 2 个客户端的接受请求时,会进行这样的处理:
image.png
当节点 A、B、C 收到接受请求[1, 3]的时候,由于提案的提案编号 1 小于三个节点承诺能通过的提案的最小提案编号 5,所以提案[1, 3]将被拒绝
当节点 A、B、C 收到接受请求[5, 7]的时候,由于提案的提案编号 5 不小于三个节点承诺能通过的提案的最小提案编号 5,所以就通过提案[5, 7],也就是接受了值 7,三个节点就 X 值为 7 达成了共识。

2.Multi-Paxos

兰伯特提到的 Multi-Paxos 是一种思想,不是算法。而Multi-Paxos 算法是一个统称,它是指基于 Multi-Paxos 思想,通过多个 Basic Paxos实例实现一系列值的共识的算法(比如 Chubby 的 Multi-Paxos 实现、Raft 算法等)

Basic Paxos 是通过二阶段提交来达成共识的。在第一阶段,也就是准备阶段,接收到大多数准备响应的提议者,才能发起接受请求进入第二阶段(也就是接受阶段):
image.png
多次执行 Basic Paxos的局限性:
而如果我们直接通过多次执行 Basic Paxos 实例,来实现一系列值的共识,就会存在这样几个问题:
一、如果多个提议者同时提交提案,可能出现因为提案冲突,在准备阶段没有提议者接收到大多数准备响应,协商失败,需要重新协商。你想象一下,一个 5 节点的集群,如果 3个节点作为提议者同时提案,就可能发生因为没有提议者接收大多数响应(比如 1 个提议者接收到 1 个准备响应,另外 2 个提议者分别接收到 2 个准备响应)而准备失败,需要重新协商。
二、2 轮 RPC 通讯(准备阶段和接受阶段)往返消息多、耗性能、延迟大。你要知道,分布式系统的运行是建立在 RPC 通讯的基础之上的,因此,延迟一直是分布式系统的痛点,是需要我们在开发分布式系统时认真考虑和优化的。
如何解决:
引入领导者和优化 Basic Paxos 执行来解决。

2.1Chubby 的 Multi-Paxos实例

首先,它通过引入主节点,实现了兰伯特提到的领导者(Leader)节点的特性。也就是说,主节点作为唯一提议者,这样就不存在多个提议者同时提交提案的情况,也就不存在提案冲突的情况了。
另外,在 Chubby 中,主节点是通过执行 Basic Paxos 算法,进行投票选举产生的,并且在运行过程中,主节点会通过不断续租的方式来延长租期(Lease)。比如在实际场景中,几天内都是同一个节点作为主节点。如果主节点故障了,那么其他的节点又会投票选举出新的主节点,也就是说主节点是一直存在的,而且是唯一的。
其次,在 Chubby 中实现了兰伯特提到的,“当领导者处于稳定状态时,省掉准备阶段,直接进入接受阶段”这个优化机制。
最后,在 Chubby 中,实现了成员变更(Group membership),以此保证节点变更的时候集群的平稳运行。
在 Chubby 中,为了实现了强一致性,读操作也只能在主节点上执行。 也就是说,只要数据写入成功,之后所有的客户端读到的数据都是一致的。具体的过程,就是下面的样子:

所有的读请求和写请求都由主节点来处理。当主节点从客户端接收到写请求后,作为提议者,执行 Basic Paxos 实例,将数据发送给所有的节点,并且在大多数的服务器接受了这个写请求之后,再响应给客户端成功:
image.png
当主节点接收到读请求后,处理就比较简单了,主节点只需要查询本地数据,然后返回给客户端就可以了:
image.png

3.内容小结

1.兰伯特提到的 Multi-Paxos 是一种思想,不是算法,而且还缺少算法过程的细节和编程所必须的细节,比如如何选举领导者等,这也就导致了每个人实现的 Multi-Paxos 都不一样。而 Multi-Paxos 算法是一个统称,它是指基于 Multi-Paxos 思想,通过多个Basic Paxos 实例实现一系列数据的共识的算法(比如 Chubby 的 Multi-Paxos 实现、Raft 算法等)。
2.Chubby 实现了主节点(也就是兰伯特提到的领导者),也实现了兰伯特提到的“当领导者处于稳定状态时,省掉准备阶段,直接进入接受阶段” 这个优化机制,省掉 Basic Paxos 的准备阶段,提升了数据的提交效率,但是所有写请求都在主节点处理,限制了集群处理写请求的并发能力,约等于单机。
3.因为Chubby 的 Multi-Paxos 实现中,也约定了“大多数原则”,也就是说,只要大多数节点正常运行时,集群就能正常工作,所以 Chubby 能容错(n - 1)/2 个节点的故障。
4.本质上而言,“当领导者处于稳定状态时,省掉准备阶段,直接进入接受阶段”这个优化机制,是通过减少非必须的协商步骤来提升性能的。这种方法非常常用,也很有效。比如,Google 设计的 QUIC 协议,是通过减少 TCP、TLS 的协商步骤,优化 HTTPS 性能。我希望你能掌握这种性能优化思路,后续在需要时,可以通过减少非必须的步骤,优化系统性能。

本文转载于网络 如有侵权请联系删除

相关文章

  • 嵌入式小知识 | Cortex-M3咬尾中断与晚到中断

    咬尾中断Cortex-M3内核发生中断时,硬件会自动将XPSR、PC、LR、R12、R3、R2、R1和R0这8个寄存器压入栈,其余的R4~R11、LR、XPSR寄存器的备份则需要由C编译器去做。我们知道每次中断操作有三部曲:入栈+ISR+出栈。Cortex-M3内核支持中断嵌套。所谓中断嵌套就是高优先级的中断可以打断低优先级的中断转而去执行高优先级的中断服务程序,当高优先级中断服务程序执行完毕再去接着执行低优先级的中断服务程序。若在高优先级中断服务程序执行过程中产生了低优先级中断,那么低优先级中断需要等高优先级中断服务程序执行完毕才能去执行。对于后者两个中断是串行执行的,如果按照每个中断备份、恢复寄存器的过程,那么高优先级中断先将上述8个寄存器压入栈中,等执行完毕再从栈中弹出这8个寄存器,紧接着低优先级中断再将这8个寄存器压入栈中,等执行完毕再从栈中弹出,这么做对这8个寄存器重复入栈出栈2次,浪费了时间,Cortex-M3内核采用咬尾中断机制避免这种问题发生,来看下图:Cortex-M3不会再出栈这些寄存器,而是继续使用上一个异常已经压栈好的结果,消除出栈和入栈操作的耗时。这样一来我们

  • 又一名视觉大牛从大厂离开!阿里达摩院 XR 实验室负责人谭平离职

    作者|王玥编辑|陈彩娴AI科技评论获悉,阿里巴巴达摩院XR实验室负责人谭平已于近日离职。谭平曾受邀担任国际顶级学术会议CVPR、SIGGRAPH、IROS领域主席,是3D视觉领域的标杆人物。谭平于2019年9月入职阿里人工智能实验室担任计算机视觉首席科学家,2021年以负责人身份坐镇XR实验室。达摩院XR实验室专注于研究XR眼镜及基于新移动计算平台的互联网应用技术,旨在构建一个让人类可以沉浸式体验的虚拟世界,并达成与真实物理世界的融合与联动。看得出XR实验室的靶点是近年来大火的元宇宙方向,而谭平的主要研究领域正是搭建元宇宙骨架的三维建模和全息技术研发。刚加入XR实验室时,谭平提到,由于自己主攻技术,他希望自己的加入更多地加强公司在这方面的技术储备与技术力量。能把技术利用好,和丰富的业务场景结合起来,给社会带来有价值的、有好处的产品。当时他提到,自己选择到阿里发展的原因有两点:中国包含阿里在内的互联网公司这几年的发展速度极快,他不愿意错失这个机遇;以及他觉得在XR实验室有很多业务可以跟自身技能相结合,给了自己广阔的发展天地。谭平刚加入时,他与XR实验室的目标是:打造逼真的虚拟国际,在未来

  • 当老师20年,我最怕的是考试

    内容来源于腾讯产业互联网产哥说 秋天,是九寨沟最灿烂的季节,这里有五彩的池水和漫山的秋叶。但这座大山里的教育,曾经却只有一种颜色。神奇的九寨,越来越难留住最年轻的一代,生源从海拔2000米的高原县城流失,去往川内的其他大城市,带给这座县城的教育更大的“余波”。在县里当了20多年的老师,杨洪梅一直在寻找一场“考试”的答案。背后的命题是如何因材施教,如何振兴县中教育,如何留住这里最年轻的一代。主笔:石头编辑:叉叉在四川省九寨沟县当了20多年老师,杨洪梅最害怕的就是考试。每次阅卷,杨洪梅的“舌头和指头”都要受罪,因为要翻阅几百上千份试卷。组卷更累,早年她用刻钢板和油印制作试卷,三四个小时下来,裙子沾满了油渍和墨汁,浑身上下没有一处干净的地方。 更让杨洪梅烦恼的,是考试的答案。她总是想知道每道题答案的正确率,以此判断每位学生的学习情况。但这项统计太复杂了,她只能在讲评试卷时,让学生统一举手,才能粗略地了解。那是一种“答案”就在手边、却没办法拿到的无力感。随着九寨沟旅游经济的发展,许多学生的父母陆续把孩子送出这座美丽的大山。近十年来,不断有学生离开九寨沟,去成都、绵阳或者更远的地方读书。他们离开

  • NeuroImage:任务态fMRI时间分辨的有效连接:共激活模式的心理生理交互

    《本文同步发布于“脑之说”微信公众号,欢迎搜索关注~~》摘要:用功能磁共振研究任务依赖的功能连接(FC)的调制对于揭示认知过程的神经性基质非常关键。目前大多研究方法假设任务期间是持续的FC,但最近研究发现这种假设太局限。虽然很多研究聚焦于静息态的功能动态,但基于任务的研究仍没有完全揭开网络调制。 此处,我们提出一个基于种子的方法通过揭示共激活模式的心理生理交互(PPI-CAPs)来探测任务依赖的脑活动调节。这个基于点过程的方法将任务调制的连接时间上分解为动态模块,这种动态模块当前的方法都无法捕捉,如PPI或动态因果模型。另外,它确定了单个frame分辨率共激活模式的出现,而非基于窗的方法。 在一个受试者看电视节目的自然设置中,我们找到了以后扣带回(PCC)为种子的共激活的几个模式,其发生率和极性在种子活动上或两者之间的交互上随观看的内容而改变。另外,我们发现跨时间和受试者的有效连接的一致性,让我们得以揭示PPI-CAPs和包含在视频中具体刺激之间的联系。 我们的研究表明,明确地追踪瞬态连接模式对于促进我们理解大脑不同区域在接收到一系列线索时是如何动态沟通的至关重要。简介方法 图1展示了

  • .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件

    .NET中使用TaskCompletionSource作为线程同步互斥或异步操作的事件2018-12-2207:50你可以使用临界区(CriticalSection)、互斥量(Mutex)、信号量(Semaphores)和事件(Event)来处理线程同步。然而,在编写一些异步处理函数,尤其是还有async和await使用的时候,还有一些更方便的类型可以用来处理线程同步。使用TaskCompletionSource,你可以轻松地编写既可以异步等待,又可以同步等待的代码来。等待事件我们创建一个TaskCompletionSource<object>对象,这样,我们便可以写出一个既可以同步等待又可以异步等待的方法:publicclassWalterlvDemo { privatereadonlyTaskCompletionSource<object>_source=newTaskCompletionSource<object>(); publicTaskWaitAsync()=>_source.Task; publicvoidWait()=>

  • 天对地,雨对风,向量对加班?这个脑洞清奇的对联AI,大家都玩疯了

    逗哏栗捧哏璞发自凹非寺 量子位报道|公众号QbitAIA:天对地,雨对风。 B:大陆对长空。这我也会。 A:那你出一个我给你对。 B:辣条对什么? A:额,没学过,我先问问AI。 B:问出来了么?对联秀,开场 AI说,辣条对香茗。这是一位名叫王斌的有志青年,开发的对联AI。出炉之后,网友一股脑儿的都去调戏AI,网站甚至一度要挂。我也出个认真的上联,考一考它:△突发现场:不会数数 不不不,认真的是这个:有道理,梅花开的时节确实不一样。另外,平仄也讲究。增加难度,上联出个有断句的:山可透光,水不染尘,好一个清明的世界。 如果再配上山花烂漫:来啊,快活啊。老司机啊,动车驾照拿好了吗?(误) 相信我,开车是个意外。要成为一名德智体全面发展的AI,除了对诗文,也要常练武。先来一招,猛虎硬爬山:名对名,动对动,形对形。矮又与高相映成趣,周全了。 不过,这意思是不想起床?那可不行,再来一招乌鸦坐飞机。这次是坐起来了。但好像也坐得太稳了,菩萨啊。 唉,不爱动就躺着吧,十年一觉扬州梦。阿嘞?这样居然跑起来了,还不是短跑。体能优异,又有爱国之心,成为栋梁之才指日可待。 不过,他日担当国之大任,还需对人工智

  • 一则有趣的XSS WAF规则探测与绕过

    前言本文是以B站一个有趣的XSS(已修复)为引子(为什么说有趣后面再解释),作为实例分析其WAF的规则,方便大家加深对XSSWAF探测以及针对性bypass的理解。进入主题一、一般waf是由多条正则配合使用,因而绕过也必须根据实际情况构造xss探针'";>ddd`的方式逐步理清waf规则,对于没被wa的再在chrome浏览器的element和source看xss探针的解析,慢慢耐心尝试即可。二、个人对于wafbypass的理解:本来应当被wa会生效的payload不在规则库里或用本来就不会生效的payload(这时候是大概率能通过waf的)经过服务器处理后payload最后生效了。三、过程1.首先是7师傅给了一个链接,让我们绕一绕b站的waf,callback参数存在xss。2.上xss探针:';">ddd`可以看到探针成功被解析为标签和属性。3.上经典payload(这里由于可以控制标签,优先使用<img><script>):对于<imgsrc=xonerror=alert(1)>对于<sc

  • R3 Corda 和 springboot 集成

    R3corda为什么Corda要集成springboot因为Corda内置的CordaWebserver已经被标记成弃用了,一般不再提供支持;再者,springboot的生态明显占优。太长不读篇独立的module依赖corda和cordappsConnectionRPCRunservertaskIntegrationtest精读篇1.独立的module依赖corda和cordapps在build.gradle文件添加corda和自行编写的cordapps的依赖,以及对于springboot的依赖//build.gradleinyour-apimodule ... dependencies{ compile"org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlin_version" testCompile"org.jetbrains.kotlin:kotlin-test:$kotlin_version" testCompile"junit:junit:$junit_version" test

  • (13)Hg19基因组的一些分析-生信菜鸟团博客2周年精选文章集

    搞生信研究的,大部分数据都是针对于人类的,那么人类的参考基因组就不得不知了!与hg19的突变相关的一些数据解释。Hg19基因组的分析R的bioconductor包TxDb.Hsapiens.UCSC.hg19.knownGene详解下载地址我就不贴了,随便谷歌一下即可!GenomeReferenceConsortiumHuman—》GRCh3Feb.2009(hg19,GRCh37)这个是重点Mar2006assembly=hg18=NCBI36.May2004assembly=hg17=NCBI35.July2003assembly=hg16=NCBI34以前的老版本就不用看啦,现在其实都已经有hg38出来啦,GRCh38(NCBI)andhg38(UCSC)参考:http://age.wang.blog.163.com/blog/static/119252448201092284725460/http://www.ncbi.nlm.nih.gov/projects/genome/assembly/grc/human/人的hg19基因组是3G的大小,因为一个英文字符是一个字节,所以也

  • Linux i2c子系统(一) _动手写一个i2c设备驱动

    i2c总线是一种十分常见的板级总线,本文以linux3.14.0为参考,讨论Linux中的i2c驱动模型并利用这个模型写一个mpu6050的驱动,最后在应用层将mpu6050中的原始数据读取出来 i2c子系统框架 下图就是我理解的i2c驱动框架示意图,类似中断子系统,i2c子系统中也使用一个对象来描述一个物理实体,设备对象与驱动分离,驱动结合设备对象对硬件设备的描述才可以驱动一个具体的物理设备,体现了分离的设计思想,实现了代码的复用,比如: 一个i2c控制器就对应一个i2c_board_info,它驱动就是s3c2410_i2c_driver,他们通过platform_bus_type协调工作。 一个i2c总线上的设备就对应内核中的一个i2c_client类型的对象,它的驱动就是的i2c_driver,二者通过i2c_bus_type协调工作。 同样是抽象的思路,对于i2c总线本身,内核也使用i2c_bus_type来描述。 事实上,对于任何一种总线,内核都有一个bus_type类型的对象与之对应,但是platform_bus_type并没有对应的实际的物理总线,这也就是platf

  • 算法第三章

    1.你对动态规划算法的理解(2分) 答:动态规划算法其实和分治法很像,本质都是把一个大的问题分解成若干个小问题,通过求解子问题得到原问题的解,而子问题一般是存在联系的,用分治法会消耗大量时间,子问题被重复计算多次,如果我们把已解决子问题的答案保存,需要时拿出来用,这样可避免大量计算,我们用一个表来记录这些结果,这是动态规划的思想。 2.分别列出编程题1、2的递归方程(2分) 第一题: for(inti=1;i<n;i++){      for(intj=0;j<i;j++){         if(a[j]<a[i]&&b[j]+1>b[i]){            b[i]=b[j]+1;       &nb

  • C#从入门到放弃--GUID

    C#中GUID生成 一、生成System.Guid格式的GUID 1varguid=System.Guid.NewGuid();复制 GUID生成 这样就可以获取到GUID,但是,通常ID需要的都是string格式的,“System.Guid”格式不能隐式装换成“string”,如下图: 那么,就需要进行类型装换。 二、将System.Guid格式转换成string 1varguid=System.Guid.NewGuid().Tostring("N");复制 转换成string “N”代表这生成大写的GUID,“n”则小写 三、SqlServer批量生成GUID(附加小技巧1) SqlServer在批量插入数据时,通常ID用GUID生成,也就是说,存在需要批量生成GUID的需求。可以采用以下语句: 1SELECTREPLACE(NEWID(),'-','')FROMTALBE_TEMP;复制 SQLSERVER批量生成GUID 说明: TALBE_TEMP是数据库里任意表名,当TALBE_TEMP表有100行时,就会生成100个新的GUID。可能有人会

  • golang项目:goa和micro

    https://github.com/goadesign/goa http://www.cnblogs.com/zhangqingping/p/5531171.html       https://github.com/micro/micro

  • 某物流客户Elasticsearch集群性能优化案例

    客户背景 客户使用ES来进行数据存储、快速查询业务订单记录,但是经常会出现业务高峰期ES集群的cpu负载、内存使用均较高,查询延迟大,导致前端业务访问出现大量超时的情况,极大影响其客户使用体验。 部分监控如下图: ​ 1) 集群架构如下: ​ 集群节点配置:8数据节点(16C64G);3主节点(8C32G) 2) 集群存在问题分析 业务层面 与客户业务人员沟通,业务处理中有几个聚合查询会占用较多的内存,且这类查询对准确性要求较高,需精确统计所有匹配结果。 架构层面 存在4-5T的单个较大索引,该索引字段多达2000+,分片大小普遍60G+,最高达到130G+,是制约查询性能的一个较大瓶颈,另外集群在业务高峰期还会出现经常的fullgc,这是出现访问超时的直接原因。如图: ​ Elasticsearch集群优化 与客户开发人员沟通了解集群在业务上存在的问题,结合我们在ES这块的服务经验,从语句参数、索引、架构等多个角度给客户提出调优建议。 1) 语句、参数调优 客户已提供4个慢查询语句,语句中聚合查询使用"execution_hint":"map",

  • c++基础知识vector

    vector #include<vector> #include<algorithm> vector<int>arr(26,0);//生成26个元素的数组arr,且都初始化为0 arr[str[i]-'a']++;//若str[i]是字母,则可以这样写。str[i]若是'a',则arr[0]++; sort(arr.begin(),arr.end());排序复制 遍历for(vector<int>::iteratorit=arr.begin();it!=arr.end();it++)或者复制 for(autoit=arr.begin();it!=arr.end();it++)复制 复制 初始化一个m行n列的vector为0: vector<vector<int>>arr(m,vector<int>(n,0));复制  

  • 沉淀再出发:Bean,JavaBean,POJO,VO,PO,EJB等名词的异同

    沉淀再出发:Bean,JavaBean,POJO,VO,PO,EJB等名词的异同 一、前言  想必大家都有这样的困惑,接触的东西越多却越来越混乱了,这个时候就要进行对比和深入的探讨了,抓住每一个概念背后的核心,才能彻底的解决问题,形成自己的理念和道理。 二、Bean,JavaBean,POJO,VO,PO,EJB等名词的比较  2.1、Bean    Bean的中文含义是“豆子”,Bean的含义是可重复使用的Java组件。所谓组件就是一个由可以自行进行内部管理的一个或几个类所组成、外界不了解其内部信息和运行方式的群体。使用它的对象只能通过接口来操作。Bean并不需要继承特别的基类(BaseClass)或实现特定的接口(Interface)。Bean的编写规范使Bean的容器(Container)能够分析一个Java类文件,并将其方法(Methods)翻译成属性(Properties),即把Java类作为一个Bean类使用。Bean的编写规范包括Bean类的构造方法、定义属性和访问方法编写规则。  2.2、javaBean &n

  • excel表数据导入mysql数据库

    使用xlrd模块 目前xrld最新版为2.0.1,不支持.xls文件,1.2.0版支持.xls文件 pip3installxlrd==1.2.0复制 1、数据库test中test_excel表,id为自增主键          2、F盘中有一张excel表--code_db.xlsx,数据如下    3、通过代码把表数据插入数据库中 importxlrd importpymysql #获取excel表对象 defopen_excel(): try: #使用xlrd创建一个工作薄对象 table=xlrd.open_workbook(r'F:\code_db.xlsx') except: print("openexcelfilefailed!") try: #根据工作表的名称创建表格对象 sheet=table.sheet_by_name('Sheet1')#通过表名称获取Sheet对象 returnsheet except: print("locateworksheetine

  • 注意ie6的盒模型

       浏览器版本多了,也是一个累,特别是ie家族的。    网上搜罗了一大堆,发现说的和我看到的不一样啊,结果才发现原来是对方表述有问题,省略了几个字就产生了歧义了。    按照网上说的ie6对盒模型解释不符合W3C标准,其实应该是ie6在怪异模式(quirksmode)下对盒模型解释不符合W3C默认标准,而ie6在标准模式模式下对盒模型解释符合W3C默认标准。    这个就涉及到怎么触发ie的工作模式了,主要还是通过doctype定义的。下面截了个图可以看得很明白: (Q:QuirksMode,怪异模式;S:StandardsMode,标准模式;A:AlmostStandardsMode,几乎标准模式)    感兴趣的朋友可以去这个网站看看(英文):https://hsivonen.fi/doctype/    这儿友情提示下:bootstrapV3对一些元素(特别是涉及到布局的元素)设置了 b

  • 华为悦盒EC6180V9 刷 ubuntu20.4_nas

    感谢: 海思机顶盒NAS社区 神雕Teasiu的开源项目 前言 华为悦享盒子刷ubuntuorNAS 前连天在群里看到大佬提到华为的移动盒子可以支持刷linux,因为盒子本身接口非常丰富,不需要像随身wifi一样多加转接线。 然后就是非常巧合的在家里犄角旮旯中找到了吃灰多年移动盒子? 于是就有了这篇文章 adb线刷 准备工作 华为悦享盒子(型号:EC6180V9) 接口参数: USB2.0*2 HDMI*1 SDcard*1 type-c*1 STB工具(华为盒子调试工具,用途:打开adb工具) usb公对公线/typec转usb线(用途:盒子连接电脑adb连接) hdmi线(用途:盒子连接显示器) HDMI显示器 开启adb 盒子设置中打开远程连接,并记录密码.若无密码默认密码=.287aW 盒子和电脑处于同一网络下,记录盒子IP STB工具开启adb权限 ②中输入1.中获取的密码 adb连接 adbconnect[IP] adbdevices 查看型号 cat/dev/block/mmcblk0p1|grep-ahi3798

  • 2、Struts2开始深入

    一、Struts2的配置文件加载顺序 1 、进入过滤器【StrutsPrepareAndExecuteFilter】跟代码,可以看到对应的文件加载顺序 进入StrtsPrepareAndExecuteFilter,跟里面的init方法:                  进入:                在进入:                  init_DefaultProperties()                ----加载default.properties   init_TraditionalXmlConfigurations();      ----加载struts-default.xml、struts-plugin.xml、struts.xml

  • 根据库存数量进行提交检验

    根据库存数量进行判断数量是否有无,无则提示 //p判断现有库存数量大于出库数量 //库存单的构建schema H3.DataModel.BizObjectSchemaschema=this.Request.Engine.BizObjectManager.GetPublishedSchema("D150516Schrygddhktx2lwxq4squp2zl2"); stringsql="select*fromi_D150516Schrygddhktx2lwxq4squp2zl2wherecoding=coding"; System.Data.DataTabletable=this.Engine.Query.QueryTable(sql,null); if(table!=null&&table.Rows.Count>0) { //new一个库存单的对象 H3.DataModel.BizObjecttargetBo=newH3.DataModel.BizObject(this.Engine,schema,this.Request.UserContext.UserI

相关推荐

推荐阅读