【笔记】Zookeeper应用

[笔记系列文章说明]: 该类型的文章是笔者学习过程中整理的学习笔记.

说明

zookeeper是一个分布式的,为分布式应用提供数据一致性服务的程序.

Zookeeper是怎么来的?

分布式系统: 是一个硬件或软件组件分布在不同的网络计算机上,彼此之间仅仅通过 消息传递 进行通信和协调的系统。

在这个消息传递的过程中遇到的问题: 传输中数据被篡改,数据丢失处理,数据超时处理,数据的事务控制,可以统称为数据的一致性问题.

解决分布式系统中数据传输的一致性问题的理论基础:CAID,CAP(一致性,可用性,分区容错性),BASE等一致性方面的理论

结合理论基础,演变出分布式数据一致性协议算法,如2PC,3PC,Raft ,Paxos算法等.

解决消息传递过程中的两个问题:
1,消息传递中的消息篡改,消息容错机制

拜占庭将军问题:

  拜占庭帝国有许多支军队,不同军队的将军之间必须制定一个统一的行动计划,从而做出进攻或者撤退的决定,同时,各个将军在地理上都是被分隔开来的,只能依靠军队的通讯员来进行通讯。然而,在所有的通讯员中可能会存在叛徒,这些叛徒可以任意篡改消息,从而达到欺骗将军的目的。

解决方式:比如系统中的数字签名,数据加密

阅读更多

【笔记】Java程序员对服务器一词的解释

[笔记系列文章说明]: 该类型的文章是笔者学习过程中整理的学习笔记.

分类

HTTP服务器: 主要用作Http请求转发

Servlet容器: 满足Servlet规范的容器,

应用服务器: 满足J2EE规范的Web容器

对比

根据他们的主要用途,用图表的形式给出

名称 HTTP服务器 Servlet容器 支持J2EE 厂家
Tomcat × × apache
Apache × × apache
Jboss × × Redhat
Nginx × × Igor
WebLogic × Oracle
WebSphere × IBM
Resin × × CAUCHO
Jetty × × Webtide

【笔记】Java RMI(远程方法调用) 实例与分析

[笔记系列文章说明]: 该类型的文章是笔者学习过程中整理的学习笔记.

目的

通过本文,可以加深对Java RMI的理解,知道它的工作原理,怎么使用等. 也为了加深我自己的理解,故整理成文.不足之处,还望指出.

概念解释

RMI(RemoteMethodInvocation): 远程方法调用,顾名思义,通过远程的方式调用非本地对象的方法并返回结果。使用远程调用通常解决本地计算瓶颈问题,例如分布式记算,最近很火的阿尔法狗人机大战,据说运算使用上千个CPU。
JRMP(java remote method protocol): java远程方法协议,这是完成java到java远程调用的协议,基于TCP协议。
stub与skeleton: 这两个概念下面会用到,这里解释下,skeleton是放在服务端的代理,它知道真正的对象在哪。stub是放在客户端的代理,它记录了查找和调用skeleton信息。理解成远程对象引用也成.

容易混淆的概念

远程方法调用与远程过程调用的区别:远程方法调用是java独有的,基于JRMP对象流协议实现,支持传输java序列化对象。远程过程调用是基于socket技术实现的,不能传输java对象,socket套接字协议支持多种语言。它们都是基于TCP协议传输。远程方法调用传输的是java序列化对象和基本数据类型,而远程过程调用不支持传输对象。

RMI调用模型:

从宏观看,想要远程调用需要做两件事情,1,服务端向本地对象注册表中注册能被调用的远程对象. 2,客户端向远程对象注册表请求远程对象的引用.

阅读更多

【笔记】程序中的乐观锁与悲观锁,以及动手实现乐观锁

[笔记系列文章说明]: 该类型的文章是笔者学习过程中整理的学习笔记.

概念

这里抛开数据库来谈乐观锁和悲观锁,扯上数据库总会觉得和Java离得很远.

悲观锁: 一段执行逻辑加上悲观锁,不同线程同时执行时,只能有一个线程执行,其他的线程在入口处等待,直到锁被释放.

乐观锁: 一段执行逻辑加上乐观锁,不同线程同时执行时,可以同时进入执行,在最后更新数据的时候要检查这些数据是否被其他线程修改了(版本和执行初是否相同),没有修改则进行更新,否则放弃本次操作.

从解释上可以看出,悲观锁具有很强的独占性,也是最安全的.而乐观锁很开放,效率高,安全性比悲观锁低,因为在乐观锁检查数据版本一致性时也可能被其他线程修改数据.从下面的例子中可以看出来这里说的安全差别.

阅读更多

【笔记】Java中动态代理技术生成的类与原始类的区别

[笔记系列文章说明]: 该类型的文章是笔者学习过程中整理的学习笔记.

用动态代理的时候,对它新生成的类长什么样子感到好奇.有幸通过一些资料消除了心里的疑惑.

平时工作使用的Spring框架里面有一个AOP(面向切面)的机制,只知道它是把类重新生成了一遍,在切面上加上了后来定义的逻辑.这样就达到了动态的在原有类上增加一些功能.比如日志打印,拦截信息等.

这里只关心动态代理技术生成新的类,先不管虚拟机是如何去生成类,用了什么字节码生成技术,怎么产生字节码等这一系列动作.现在只关心最后生成的新类长什么样,它和老类有什么区别.为了获取到生成后的代理类的字节码并且反编译成我们能够看得懂的代码,需要实现一个动态代理例子.

阅读更多

【笔记】MongoDB学习

[笔记系列文章说明]: 该类型的文章是笔者学习过程中整理的学习笔记.

NOSQL

认识MongoDB

流行的数据库Oracle,SqlServer,MySql为关系性数据库,相对的,也有非关系性数据库,统称为NoSql,而MongoDB就是NoSql的其中一种.

关系性数据库特点

  • 高度组织化结构化数据
  • 结构化查询语言(SQL) (SQL)
  • 数据和关系都存储在单独的表中。
  • 数据操纵语言,数据定义语言
  • 严格的一致性
  • 基础事务

非关系型数据库特点

  • 代表着不仅仅是SQL
  • 没有声明性查询语言
  • 没有预定义的模式
  • 键 - 值对存储,列存储,文档存储,图形数据库
  • 最终一致性,而非ACID属性
  • 非结构化和不可预知的数据
  • CAP定理
  • 高性能,高可用性和可伸缩性

    由上可以看出,关系型数据库更加安全,严谨,而非关系型数据库更加追求性能.从他们遵从的原则同样可以得出以上结论

阅读更多

【笔记】Java实现二叉树遍历以及常用算法

[笔记系列文章说明]: 该类型的文章是笔者学习过程中整理的学习笔记.

分类

常用二叉树有:
完全二叉树,平衡二叉树,红黑树,满二叉树等

二叉树有4种遍历方式

  1. 前序遍历:

    首先访问根,再先序遍历左(右)子树,最后先序遍历右(左)子树

  2. 中序遍历:

    首先中序遍历左(右)子树,再访问根,最后中序遍历右(左)子树

  3. 后序遍历:

    首先后序遍历左(右)子树,再后序遍历右(左)子树,最后访问根

  4. 层次遍历:

    即按照层次访问,访问根,访问子女,再访问子女的子女(越往后的层次越低)(两个子女的级别相同,通常先左后右)

阅读更多

【笔记】Oracle中的排序与分页踩坑实录

[笔记系列文章说明]: 该类型的文章是笔者学习过程中整理的学习笔记.

起因

在项目中有用到某表作为数据来源,在页面以列表的形式显示。使用的数据库是Oracle,分页的时候使用到了rownum这个关键字。
列表有排序功能,自然也用到了order by。
接下来问题出现了,我在用order by查询数据库数据的时候显示的内容,和页面列表处显示的内容竟然不一致。心里想不明白,各种倒腾,终于弄明白了其中一二。

首先说结论

当使用order by与rownum结合时,请一定保证order by后有一个能保证唯一的列
例如 select t.* from person t order by t.age,t.id; //id为主键,age可能重复

接下来验证之前的现象和我得出的结论

1,首先创建表

1
create table A_LXZ (id int ,name VARchar2(10),age int)

2,插入数据

1
2
3
4
5
6
7
8
9
10
11
insert into A_LXZ(id,name,age)values(1,'a',3);
insert into A_LXZ(id,name,age)values(2,'b',4);
insert into A_LXZ(id,name,age)values(3,'c',5);
insert into A_LXZ(id,name,age)values(4,'d',6);
insert into A_LXZ(id,name,age)values(8,'h',7);
insert into A_LXZ(id,name,age)values(9,'i',7);
insert into A_LXZ(id,name,age)values(6,'f',7);
insert into A_LXZ(id,name,age)values(5,'e',7);
insert into A_LXZ(id,name,age)values(7,'g',7);
insert into A_LXZ(id,name,age)values(10,'j',8);
insert into A_LXZ(id,name,age)values(11,'k',9);
阅读更多