自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(21)
  • 收藏
  • 关注

原创 ZooKeeper实现分布式锁

ZooKeeper实现分布式锁public class DistributedLock { // zookeeper server 列表 private String connectString = "xx.xx.xx.xx:2181"; // 超时时间 private int sessionTimeout = 20000; private ZooKeeper zk; private String rootNode = "locks";

2021-08-04 08:05:51 167

原创 Gossip协议:流言蜚语,原来也可以实现一致性

Gossip协议:流言蜚语,原来也可以实现一致性有一部分同学的业务在可用性上比较敏感,比如监控主机和业务运行的告警系统。这个时 候,相信你希望自己的系统能在极端情况下(比如集群中只有一个节点在运行)也能运行。 回忆了二阶段提交协议和 Raft 算法之后,你发现它们都需要全部节点或者大多数节点正常 运行,才能稳定运行,那么它们就不适合了。而根据 Base 理论,你需要实现最终一致性, 怎么样才能实现最终一致性呢?在我看来,你可以通过 Gossip 协议实现这个目标。Gossip 协议,顾名思义,就像流言

2021-08-03 22:05:57 415 1

原创 一致哈希算法:如何分群,突破集群的“领导者”限制?

一致哈希算法:如何分群,突破集群的“领导者”限制?如果我们通过 Raft 算法实现了 KV 存储, 虽然领导者模型简化了算法实现和共识协商,但写请求只能限制在领导者节点上处理,导致了集群的接入性能约等于单机,那么随着业务发展,集群的性能可能就扛不住了,会造成系 统过载和服务不可用,这时该怎么办呢?其实这是一个非常常见的问题。在我看来,这时我们就要通过分集群,突破单集群的性能限制了。说到这儿,有同学可能会说了,分集群还不简单吗?加个 Proxy 层,由 Proxy 层处理来自 客户端的读写请求,接收到读写

2021-08-03 20:55:09 240

原创 Raft算法(三):如何解决成员变更的问题?

Raft算法(三):如何解决成员变更的问题?在日常工作中,你可能会遇到服务器故障的情况,这时你就需要替换集群中的服务器。如果 遇到需要改变数据副本数的情况,则需要增加或移除集群中的服务器。总的来说,在日常工 作中,集群中的服务器数量是会发生变化的。讲到这儿,也许你会问:“Raft 是共识算法,对集群成员进行变更时(比如增加 2 台服务器),会不会因为集群分裂,出现 2 个领导者呢?”在我看来,的确会出现这个问题,因为 Raft 的领导者选举,建立在“大多数”的基础之上,那么当成员变更时,集群成员发生

2021-08-03 08:21:09 790

原创 Raft算法(一):如何选举领导者?

Raft算法(一):如何选举领导者?Raft 算法属于 Multi-Paxos 算法,它是在兰伯特 Multi-Paxos 思想的基础上,做了一些简 化和限制,比如增加了日志必须是连续的,只支持领导者、跟随者和候选人三种状态,在理 解和算法实现上都相对容易许多。除此之外,Raft 算法是现在分布式系统开发首选的共识算法。绝大多数选用 Paxos 算法的 系统(比如 Cubby、Spanner)都是在 Raft 算法发布前开发的,当时没得选;而全新的系统大多选择了 Raft 算法(比如 Etcd、Cons

2021-08-02 13:44:32 857

原创 Paxos算法(二):Multi-Paxos不是一个算法,而是统称

Paxos算法(二):Multi-Paxos不是一个算法,而是统称Basic Paxos 只能就单个值(Value)达成共识,一旦遇到为一系列的值实现共识的时候,它就不管用了。虽然兰伯特提到可以通过多次执行 Basic Paxos 实例(比如每接收到一个值时,就执行一次 Basic Paxos 算法)实现一系列值的共 识。但是,很多同学读完论文后,应该还是两眼摸黑,虽然每个英文单词都能读懂,但还是不理解兰伯特提到的 Multi-Paxos,为什么 Multi-Paxos 这么难理解呢?在我看来,兰伯特

2021-08-02 13:42:18 258

原创 Paxos算法(一):如何在多个节点间确定某变量的值?

Paxos算法(一):如何在多个节点间确定某变量的值?提到分布式算法,就不得不提 Paxos 算法,在过去几十年里,它基本上是分布式共识的代名词,因为当前最常用的一批共识算法都是基于它改进的。比如,Fast Paxos 算法、 Cheap Paxos 算法、Raft 算法、ZAB 协议等等。而很多同学都会在准确和系统理解 Paxos 算法上踩坑,比如,只知道它可以用来达成共识,但不知道它是如何达成共识的。 这其实侧面说明了 Paxos 算法有一定的难度,可分布式算法本身就很复杂,Paxos 算法自然也不会

2021-08-02 13:40:33 222

原创 Mysql 中写操作时保驾护航的三兄弟!

Mysql 中写操作时保驾护航的三兄弟!1.两阶段提交这个名词你应该听到过很多次了,在这里再介绍下这位老朋友。所谓的两阶段提交,从字面意思来看应该是有两个步骤来进行约束的。事实上也是如此。这两个步骤中的主角就是我们今天要讲的重要角色中的两位:binlog 和 redo log。提到两阶段提交,SQL 语句的执行流程就绕不过去了。没辙,虽然提了很多遍,但还得再拉出来溜溜。只不过这次的侧重点和前面的会有些不同。具体到操作流程上是这样的当执行某个写操作的 SQL 时,引擎将这行数据更新到内存的同时把

2021-07-22 18:30:37 95

原创 Redis基础笔记--自认为很详细(●ˇ∀ˇ●)

1.Redis 学习笔记2.Redis 简介Redis 是我们在互联网应用中使用最广泛的一个 NoSQL 数据库,基于 C 开发的键值对存储数据库,Redis 这个名字是 Remote Dictionary Service 字母缩写。很多人想到 Redis,就想到缓存。但实际上 Redis 除了缓存之外,还有许多更加丰富的使用场景。比如分布式锁,限流。特点:支持数据持久化支持多种不同的数据结构类型之间的映射支持主从模式的数据备份自带了发布订阅系统定时器、计数器3.Redis 安装四

2021-07-09 15:00:16 508

原创 2020-11-04

如何以管理员省份修改hosts文件快捷键win+x 如图所示然后再点击windows powershell(管理员)(A)进入命令窗口然后再输入以下命令C:\Windows\System32\drivers\etc进入etc,在输入notepad hosts就会打开hosts文件,修改文件点击保存关闭就行了...

2020-11-04 18:26:05 96

原创 CAS相关

CAS底层原理概念CAS的全称是Compare-And-Swap,它是CPU并发原语它的功能是判断内存某个位置的值是否为预期值,如果是则更改为新的值,这个过程是原子的CAS并发原语体现在Java语言中就是sun.misc.Unsafe类的各个方法。调用UnSafe类中的CAS方法,JVM会帮我们实现出CAS汇编指令,这是一种完全依赖于硬件的功能,通过它实现了原子操作,再次强调,由于CAS是一种系统原语,原语属于操作系统用于范畴,是由若干条指令组成,用于完成某个功能的一个过程,并且原语的执行必须是连续

2020-09-09 13:26:19 371 1

原创 ByteArrayOutputStream

public class ByteArrayOutputStreamTest { @Test public void test() { RandomAccessFile raf = null; ByteArrayOutputStream bos = null; try { raf = new RandomAccessFile(new File("ByteArrayOutputStreamTest"), "rw");

2020-09-07 18:40:12 477

原创 IO流将字符串变为大写输出

//public class SystemIn {// public static void main (String[] args) throws Exception{// InputStreamReader isr=new InputStreamReader(System.in);//System.in是一个InputStream 外面套一层转换流(包装流)// BufferedReader br=new BufferedReader(isr);//在这里再套一层

2020-09-07 18:30:10 690

原创 IO流日志文件操作

public class logger { public static void log(String str) { PrintStream out=null; try { out=new PrintStream(new FileOutputStream("logtext"));//指定一个新的打印流 System.setOut(out);//System.out是标准输出流,其实就是打印流PrintStream的一个

2020-09-07 18:26:27 556

原创 Mysql基础中的常见函数

一般分为两类函数1.单行函数:如concat,length,ifnull2.分组函数:avg,max,min数学函数1.round:四舍五入2.ceil 向上取整3.floor 向下取整4.truncate 截断,小数点后截断到几位5.mod 取余7.instr:返回子串第一次出现的索引,如果找不到就返回0;6.rand:获取随机数,返回0-1之间的小数8.replace:替换所有的子串日期函数now:返回当前系统日期+时间curdate:返回当前系统日期不包含时间curti

2020-09-07 16:11:46 122

原创 反射的一些其他操作

public class OtherTest { @Test public void test1(){ Class clazz=Person.class; Constructor[] constructors=clazz.getConstructors();//获取当前运行类中声明为public的构造器 for(Constructor c:constructors){ System.out.println(c);

2020-09-06 15:16:53 133

原创 Iterator主要有三个方法:hasNext(),next(),remove() 以及 ResultSet 结果集的next()方法区别

hasNext():判断是否存在下一个元素,这时指针并不会下移next():指针下移,返回该指针所指向的元素remove():删除当前指针所指向的元素。1.当创建完成指向某个集合或者容器的Iterator对象时,这时指针其实指向的是第一个元素的上方,即指向一个空。2.当调用hasNext()方法的时候,只是判断以一个元素的有无,并不移动指针。3.调用next方法,向下移动指针,并且返回指针指向的元素,如果指针指向的内存中没有元素,则会报异常。而JDBC里结果集有一个next()方法 相当

2020-09-04 13:49:56 1029

原创 从内核与用户空间理解NIO和BIO

linux 系统会划分为User space and Kernel spacecpu对空间管理分为4个不同的级别:Ring0–Ring3。 Ring0下,可以执行特权指令,在Ring3则有很多限制。linux系统则利用这一特性,使用了其中两级来分别运行linux内核与应用程序,这样使操作系统本身得到充分的保护。 用户代码运行在Ring3,内核代码运行在Ring0.内核空间与用户空间是程序执行的两种不同的状态,通过系统调用和硬件中断能够完成从用户控件到内核空间的转移用户和内核空间理解IOIO输入为例,

2020-09-04 13:30:57 819

原创 Selector选择器的使用

/** * @author lihai * @date 2020/8/26-17:59 *//* * 一、使用 NIO 完成网络通信的三个核心: * * 1. 通道(Channel):负责连接 * * java.nio.channels.Channel 接口: * |--SelectableChannel * |--SocketChannel * |--ServerSocketChannel * |--DatagramChannel *

2020-09-02 23:53:44 472

原创 创建对象的几种方式

public class Student implements Cloneable, Serializable { private int id; public Student() { } public Student(Integer id) { this.id = id; } @Override protected Object clone() throws CloneNotSupportedException {

2020-09-02 21:21:55 321

原创 类的初始化和对象的初始化

在类加载过程中,准备阶段是正式为类变量(static成员变量)分配内存并设置初始值的阶段,而初始化阶段是真正开始执行类中定义的java程序代码(字节码)并按程序猿的意图去初始化类变量的过程。更直接的说初始化阶段是执行类构造器方法的过程。()方法是由编译器自动收集类中的所有类变量的赋值动作和静态代码块static{}中的语句合并产生的,其中编译器收集的顺序是由语句在源文件中出现的顺序锁决定。 类构造器()与实例构造器()不同,它不需要程序员进行显式调用,虚拟机会保证在子类类构造器()执行之前,父类的类构造(

2020-09-02 20:58:08 1658 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除