Zookeeper -- ZAB协议
本文将简要介绍Zookeeper的ZAB协议 基本概念ZAB VS Base-Paxos Base-Paxos是**通用的分布式一致性算法** ZAB协议不是Base-Paxos的典型实现,而是特别为Zookeeper设计的一种**支持崩溃恢复的原子广播协议** 相对于ZAB协议,Base-Paxos主要存在2个问题:**活锁问题+全序问题** 活锁问题是指在Base-Paxos算法中,由于并不存在Leader角色,**新轮次可以不断抢占旧轮次**,如此循环往复,产生活锁 全序问题是指如果消息a在消息b之前发送,则所有Server应该看到相同的结果,但Base-Paxos并不保证这一点 ZAB的解决方案 为了解决活锁问题,ZAB协议引入了Leader角色,所有的事务请求只能由Leader处理,但是单Leader会存在单点问题,ZAB协议进而引入崩溃恢复模式 为了解决全序问题,ZAB协议引入了ZXID(全局单调递增的唯一ID)和利用TCP的FIFO特性 服务器角色Zookeeper中服务器有三种角色:**Leader、Follower和Observer**,其中Observer与ZAB协...
Java 8 -- Optional
本文主要介绍Java 8的 Optional 的简单使用 Address1234567@Data@AllArgsConstructor@NoArgsConstructorpublic class Address { private String province; private String city;} of + ofNullable相关代码托管在java8_demo 123456789101112131415161718@Test(expected = NoSuchElementException.class)public void emptyTest() { // 声明一个空的Optional对象 Optional<Address> nameOptional = Optional.empty(); // java.util.NoSuchElementException: No value present nameOptional.get();}@Test(expected = NullPointerExcep...
Java 8 -- Default Method
本文主要介绍Java 8的 default 方法的简单使用 简介 default方法作为接口的一部分由实现类继承 default方法的目标用户是类库设计者 以兼容的方式解决类库的演进问题 冲突解决一个类可以实现多个拥有默认方法的接口,从而实现行为的多继承,按照下列步骤解决冲突 类或父类中声明的方法的优先级高于任何声明为默认方法的优先级 子接口的default方法优先级高于父接口的default方法 显式选择使用哪一个default方法 类与接口定义相关代码托管在java8_demo 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647interface A { default String hello() { return "Hello From A"; }}interface B extends A { @Override default String he...
Java 8 -- Stream
本文主要介绍Java 8的 Stream的简单使用 简介流与集合的区别计算的时机 是否全部载入内存 能否添加或删除元素 类似于 集合 是 能 DVD 流 否,按需计算 不能 网络流媒体 消费一次流只能遍历一次,遍历后即被消费,类似于网络流相关代码托管在java8_demo 12345List<String> strs = Arrays.asList("zhong", "ming", "mao");Stream<String> stream = strs.stream();stream.forEach(s -> System.out.println(s)); // Lambda// throw java.lang.IllegalStateException: stream has already been operated upon or closedstream.forEach(System.out::println); // 方法引用,相关内容请参照「Java8回忆录 - Lambda...
Java 8 -- Lambda
本文主要介绍Java 8的 Lambda 表达式的简单使用 基本语法12(parameters) -> expression(parameters) -> {statements;} Apple相关代码托管在java8_demo 123456789@Data@AllArgsConstructor@NoArgsConstructorpublic class Apple { public static enum COLOR { GREEN, RED } public static final int HEAVY_WEIGHT = 200; private COLOR color; private Integer weight;} 实例12345678910111213141516171819202122232425(String s) -> s.length()// 等价于int f(String s){ return s.length(); }(Apple a) -> ...
Java 8 -- 行为参数化
本文主要介绍行为参数化 基础概念 行为参数化:将方法或代码作为参数或值进行传递 谓词:一个返回 boolean 值的函数,在 Java8 中是一个函数式接口(java.util.function.Predicate) 代码实例目录结构如下,相关代码托管在java8_demo 12345678910111213141516171819202122├── main│ └── java│ └── me│ └── zhongmingmao│ ├── domain│ │ └── Apple.java│ ├── filter│ │ ├── FilterJava7.java│ │ └── FilterJava8.java│ └── predicate│ ├── java7│ │ ├── ColorPredicate.ja...
InnoDB -- 事务隔离级别
本文主要介绍InnoDB的事务隔离级别关于Next-Key Lock的内容,请参照「InnoDB备忘录 - Next-Key Lock」,这里不再赘述 脏读、不可重复读、幻读脏读在不同的事务下,当前事务可以读到其它事务中尚未提交的数据,即可以读到脏数据 不可重复读在同一个事务中,同一个查询在T1时间读取某一行,在T2时间重新读取这一行时候,这一行的数据已经发生修改,不可重复读的重点是修改(Update) 幻读在同一事务中,同一查询多次进行,由于包含插入或删除操作的其他事务提交,导致每次返回不同的结果集,幻读的重点在于插入(Insert)或者删除(Delete) 两类读操作一致性非锁定读 InnoDB通过行多版本控制的方式来读取当前执行时间数据中行的数据,如果读取的行正在执行DELETE或UPDATE操作,这时读操作不会等待行上锁的释放,而是读取行的一个快照数据 非锁定读机制极大地提高了数据库的并发性,这是InnoDB默认的读取方式 READ COMMITED和REPEATABLE READ支持一致性非锁定读:在READ COMMITED下,总是读取被锁定行的最新的快照数据,在REPEATABLE...
InnoDB -- Next-Key Lock
本文主要介绍InnoDB存储引擎的Next-Key Lock MVCC InnoDB支持MVCC,与之MVCC相对的是LBCC MVCC中读操作分两类:Snapshot Read(不加锁)和Current Read(加锁) MVCC的好处:**Snapshot Read不加锁**,并发性能好,适用于常规的JavaWeb项目(OLTP应用) 隔离级别InnoDB支持4种事务隔离级别(Isolation Level) 隔离级别 描述 READ UNCOMMITTED (RUC) 可以读取到其他事务中尚未提交的内容,生产环境中不会使用 READ COMMITTED (RC) 可以读取到其他事务中已经提交的内容,Current Read会加锁,存在幻读现象,Oracle和SQL Server的默认事务隔离级别为RC REPEATABLE READ (RR) 保证事务的隔离性,Current Read会加锁,同时会加Gap Lock,不存在幻读现象,InnoDB的默认事务隔离级别为RR SERIALIZABLE MVCC退化为LBCC,不区分Snapshot Read和Curre...
InnoDB -- B+Tree索引
本文主要介绍InnoDB存储引擎的B+Tree索引 B+Tree数据结构 所有叶子节点出现在同一层 叶子节点包含关键字信息 叶子节点本身构成单向有序链表 叶子节点内部的记录也构成单向有序链表 索引节点不包含关键字信息,这样能容纳更多的索引信息,B+Tree的高度很低,查找效率很高 关于B+Tree的更多内容请查看维基百科 MyISAM与InnoDBMyISAM 索引文件与数据文件是**分离**的 MyISAM的索引文件采用B+Tree索引 叶子节点data域记录的是**数据存放的地址** 主索引(唯一)与辅助索引(可重复)在结构上没有任何区别 InnoDB 数据文件本身是按照B+Tree组织的索引结构(主索引:Primary Index或聚集索引:Clustered Index),而叶子节点data域记录的是**完整的数据信息** InnoDB**必须有主键**,如果没有显式定义主键或非NULL的唯一索引,InnoDB会自动生成6 Bytes的ROWID作为主键 辅助索引(Secondary Index)也是按B+Tree组织,叶子节点data域记录的是**主键值**,因此主键不宜定...
InnoDB -- 数据页结构
本文主要介绍InnoDB存储引擎的数据页结构 数据页结构 File Header参考链接:Fil Header 总共38 Bytes,记录页的头信息 名称 大小(Bytes) 描述 FIL_PAGE_SPACE 4 该页的checksum值 FIL_PAGE_OFFSET 4 该页在表空间中的页偏移量 FIL_PAGE_PREV 4 该页的上一个页 FIL_PAGE_NEXT 4 该页的下一个页 FIL_PAGE_LSN 8 该页最后被修改的LSN FIL_PAGE_TYPE 2 该页的类型,0x45BF为数据页 FIL_PAGE_FILE_FLUSH_LSN 8 独立表空间中为0 FIL_PAGE_ARCH_LOG_NO 4 该页属于哪一个表空间 Page Header参考链接:Page Header 总共56 Bytes,记录页的状态信息 名称 大小(Bytes) 描述 PAGE_N_DIR_SLOTS 2 在Page Directory中Slot的数量,初始值为2 PAGE_HEAP_TOP 2 堆中第一个记录的指针 ...















