首页

来自智得网
跳转至: 导航、​ 搜索

精选文章

Paxos查看全文
Paxos的两阶段.png
Paxos是一种共识算法,共识算法往往用作分布式系统下实现一致性的一种手段。

Paxos是Leslie Lamport在1990提出的,Lamport在文中虚构了一个希腊城邦 Paxos 来阐述该理论,因为论文未和审稿人就修改意见达成一致,该文章未能在当年进行发表。 在 1998 年和 2001 年,Lamport分别写了两篇论文,《The Part-Time Parliament》和《Paxos Made Simple》来解释Paxos协议。 Paxos将共识算法分为了两个阶段,分别是投票阶段和审议阶段,通过两个阶段在集群中半数以上的结点完成一致性的共识。 名词解释 共识算法是保证分布式集群中多个结点达到最终一致性的算法。 共识算法不能解决拜占庭问题(数据的丢失以及错误问题) 保证多个结点数据一致性可以通过下列方式: Paxos将结点分为提议者( Proposer ),接收者( Acceptor ),学习者(Learner)。在提交数据的时候除了提交的值之外,还会提交递增的版本号。 结点类型 流程 Paxos将写入流程分为两个阶段,第一个阶段是投票阶段,第二个阶段是执行阶段。 投票 Paxos的第一阶段是Proposer发起提议,提议的过程中Proposer会结合Acceptor的返回判断是否进行第二阶段的提交操作。 Proposer发起某个版本的提议。 Acceptor接收Proposer的提议,Acceptor会记录之前Proposer提交的数据版本,并且将之前保存的数据版本以及已经接收的值返回给Proposer。

Proposer接收到Acceptor的返回之后,有两种情况会直接放弃提议…
事务隔离查看全文
事务的隔离级别.png
事务的隔离性是事务的四大特性之一,原子性,持久性,隔离性,一致性。

隔离性定义了事务在并发过程中事务操作的结果以及过程是否对并发中的其他事务可见。 事务的隔离级别一般分为读未提交,读已提交,可重复度以及串行化等四个级别。 除了串行化因为定义了对同一条数据的读写只能串行完成,所以不存在对同一条数据的并发问题,显而易见也就不会出现数据可见性的问题。但是串行化因为对于热点数据的锁定严重影响了数据库的性能,随着数据库产品的完善,一般的数据库产品都会提供多种隔离级别让用户选择。 不同隔离级别下可能会出现的数据异常情景分为下列几类: 当前常见的隔离级别对上述异象情况的解决如下: 实现隔离级别一般使用到的技术有互斥锁,读写锁,乐观锁,MVCC。 互斥锁 互斥锁模型,在不同的数据库事务进行数据临界区的时候,需要首先执行加锁操作,只有成功获取锁的事务才能继续执行,否则会先进入等待直到获取锁的事务执行结束,重新请求加锁操作。 互斥锁在串行化隔离级别以及实现写操作的过程中被广泛应用。 读写锁 读写锁分为读锁和写锁,写锁是互斥锁,也就是在写操作执行的过程中,不允许其他操作包括读操作执行,但是读锁是共享的,在没有请求的场景,多个事务可以同时查询同样的数据。 读写锁可以实现读已提交。 乐观锁 相较悲观锁,乐观锁使用了更加乐观的并发机制,或者将事务按照依赖关系进行拓扑排序,或者在提交的时候再延迟校验事务是否可以提交。 基于乐观程度的不同,可以分为以下三个等级: 基于Lock:最悲观的实现,需要在操作开始前,甚至是事务开始前,对要访问的数据库对象加锁,对冲突操作Delay;

基于Timestamp:乐观的实现,每个事务在开始时获得全局递增的时间戳…
切片【Golang】查看全文
切片结构图.png
一般编程语言的数组都是静态大小的,由列表等数据结构提供动态大小的线性数据结构。但是Golang语言提供了可以自动扩容的动态数组——切片(Slice),切片支持追加,遍历,截取、随机访问等能力。

Golang中的切片由切片数据结构以及底层数组构成。 Golang的数据结构是一个值类型的结构体,包含的信息如下: 指向底层数组的指针,切片结构体本身不存储数据,数据都存储在底层的数组上。 切片的长度指切片中元素的个数。 切片的容量是指底层数组可以容纳的元素个数。 切片中元素不一定是从数组的起始位置开始的,所以切片的容量不一定是底层数组的长度,而是底层数组长度减去第一个元素的位置。 多个切片可以复用底层的同一个数组,所以对数组中数值的修改会反应在每个应用它的切片上。 当append数据,切片底层的数组长度不足时,会启动扩容的机制,产生一个新的数组,将数据拷贝到新的数组上。 Golang也提供数组类型的数据结构,数组是长度是不可变化的,需要在声明数组的时候确定的长度的值,一般是传入明确的数组长度或者通过数组的值而确定数组的长度。 切片的声明和数组类似,但是不需要传入切片的长度,或者通过make方式构建,此时传入一个初始长度。

切片不能使用“==”进行比较,所以切片不能作为map结构的Key。

热门分类

算法题库

精选内容