程序员Sherwin

有温度的程序员


  • 首页

  • 关于

  • 标签

  • 分类

  • java高级系列

  • java基础

  • java面试

  • 归档

  • 读书

  • 电影

  • 搜索

6.有关float精度问题

发表于 2019-06-19 | 分类于 java基础

先来引入一个问题

1
System.err.println(9990000110F<=9990000000F);

运行结果是: true

然后你的问题就来了,这个是谁大呢?

1
2
System.err.println(9990000110F);
System.err.println(9990000000F);

看看结果是什么?

1
2
9.9899996E9
9.9899996E9

其实这两个值在jvm是相等的,float有个规定,当位数超过8位时候自动转为科学计数法,然后就存在失真的情况.记录下,水坑来的.

16.zookeeper

发表于 2019-06-13 | 分类于 java高级

前言

相信大家对 ZooKeeper 应该不算陌生。但是你真的了解 ZooKeeper 是个什么东西吗?如果别人/面试官让你给他讲讲 ZooKeeper 是个什么东西,你能回答到什么地步呢?

我本人曾经使用过 ZooKeeper 作为 Dubbo 的注册中心,另外在搭建 solr 集群的时候,我使用到了 ZooKeeper 作为 solr 集群的管理工具。前几天,总结项目经验的时候,我突然问自己 ZooKeeper 到底是个什么东西?想了半天,脑海中只是简单的能浮现出几句话:“①Zookeeper 可以被用作注册中心。 ②Zookeeper 是 Hadoop 生态系统的一员;③构建 Zookeeper 集群的时候,使用的服务器最好是奇数台。” 可见,我对于 Zookeeper 的理解仅仅是停留在了表面。

阅读全文 »

17.ZooKeeper数据模型和常见命令

发表于 2019-06-13 | 分类于 java高级

看本文之前如果你没有安装 ZooKeeper 的话,可以参考这篇文章:《使用 SpringBoot+Dubbo 搭建一个简单分布式服务》 的 “开始实战 1 :zookeeper 环境安装搭建” 这部分进行安装(Centos7.4 环境下)。如果你想对 ZooKeeper 有一个整体了解的话,可以参考这篇文章:《可能是把 ZooKeeper 概念讲的最清楚的一篇文章》

ZooKeeper 数据模型

ZNode(数据节点)是 ZooKeeper 中数据的最小单元,每个ZNode上都可以保存数据,同时还是可以有子节点(这就像树结构一样,如下图所示)。可以看出,节点路径标识方式和Unix文件
系统路径非常相似,都是由一系列使用斜杠”/“进行分割的路径表示,开发人员可以向这个节点中写人数据,也可以在节点下面创建子节点。这些操作我们后面都会介绍到。
ZooKeeper 数据模型

提到 ZooKeeper 数据模型,还有一个不得不得提的东西就是 事务 ID 。事务的ACID(Atomic:原子性;Consistency:一致性;Isolation:隔离性;Durability:持久性)四大特性我在这里就不多说了,相信大家也已经挺腻了。

在Zookeeper中,事务是指能够改变 ZooKeeper 服务器状态的操作,我们也称之为事务操作或更新操作,一般包括数据节点创建与删除、数据节点内容更新和客户端会话创建与失效等操作。对于每一个事务请求,ZooKeeper 都会为其分配一个全局唯一的事务ID,用 ZXID 来表示,通常是一个64位的数字。每一个ZXID对应一次更新操作,从这些 ZXID 中可以间接地识别出Zookeeper处理这些更新操作请求的全局顺序。

ZNode(数据节点)的结构

每个 ZNode 由2部分组成:

  • stat:状态信息
  • data:数据内容

如下所示,我通过 get 命令来获取 根目录下的 dubbo 节点的内容。(get 命令在下面会介绍到)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[zk: 127.0.0.1:2181(CONNECTED) 6] get /dubbo    
# 该数据节点关联的数据内容为空
null
# 下面是该数据节点的一些状态信息,其实就是 Stat 对象的格式化输出
cZxid = 0x2
ctime = Tue Nov 27 11:05:34 CST 2018
mZxid = 0x2
mtime = Tue Nov 27 11:05:34 CST 2018
pZxid = 0x3
cversion = 1
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 1

这些状态信息其实就是 Stat 对象的格式化输出。Stat 类中包含了一个数据节点的所有状态信息的字段,包括事务ID、版本信息和子节点个数等,如下图所示(图源:《从Paxos到Zookeeper 分布式一致性原理与实践》,下面会介绍通过 stat 命令查看数据节点的状态)。

Stat 类:

Stat 类

关于数据节点的状态信息说明(也就是对Stat 类中的各字段进行说明),可以参考下图(图源:《从Paxos到Zookeeper 分布式一致性原理与实践》)。

数据节点的状态信息说明

测试 ZooKeeper 中的常见操作

连接 ZooKeeper 服务

进入安装 ZooKeeper文件夹的 bin 目录下执行下面的命令连接 ZooKeeper 服务(Linux环境下)(连接之前首选要确定你的 ZooKeeper 服务已经启动成功)。

1
./zkCli.sh -server 127.0.0.1:2181

连接 ZooKeeper 服务

从上图可以看出控制台打印出了很多信息,包括我们的主机名称、JDK 版本、操作系统等等。如果你成功看到这些信息,说明你成功连接到 ZooKeeper 服务。

查看常用命令(help 命令)

help 命令查看 zookeeper 常用命令

help 命令

创建节点(create 命令)

通过 create 命令在根目录创建了node1节点,与它关联的字符串是”node1”

1
[zk: 127.0.0.1:2181(CONNECTED) 34] create /node1 “node1”

通过 create 命令在根目录创建了node1节点,与它关联的内容是数字 123

1
2
[zk: 127.0.0.1:2181(CONNECTED) 1] create /node1/node1.1 123
Created /node1/node1.1

更新节点数据内容(set 命令)

1
[zk: 127.0.0.1:2181(CONNECTED) 11] set /node1 "set node1"

获取节点的数据(get 命令)

get 命令可以获取指定节点的数据内容和节点的状态,可以看出我们通过set 命令已经将节点数据内容改为 “set node1”。

1
2
3
4
5
6
7
8
9
10
11
12
set node1
cZxid = 0x47
ctime = Sun Jan 20 10:22:59 CST 2019
mZxid = 0x4b
mtime = Sun Jan 20 10:41:10 CST 2019
pZxid = 0x4a
cversion = 1
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 9
numChildren = 1

查看某个目录下的子节点(ls 命令)

通过 ls 命令查看根目录下的节点

1
2
[zk: 127.0.0.1:2181(CONNECTED) 37] ls /
[dubbo, zookeeper, node1]

通过 ls 命令查看 node1 目录下的节点

1
2
[zk: 127.0.0.1:2181(CONNECTED) 5] ls /node1
[node1.1]

zookeeper 中的 ls 命令和 linux 命令中的 ls 类似, 这个命令将列出绝对路径path下的所有子节点信息(列出1级,并不递归)

查看节点状态(stat 命令)

通过 stat 命令查看节点状态

1
2
3
4
5
6
7
8
9
10
11
12
[zk: 127.0.0.1:2181(CONNECTED) 10] stat /node1
cZxid = 0x47
ctime = Sun Jan 20 10:22:59 CST 2019
mZxid = 0x47
mtime = Sun Jan 20 10:22:59 CST 2019
pZxid = 0x4a
cversion = 1
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 11
numChildren = 1

上面显示的一些信息比如cversion、aclVersion、numChildren等等,我在上面 “ZNode(数据节点)的结构” 这部分已经介绍到。

查看节点信息和状态(ls2 命令)

ls2 命令更像是 ls 命令和 stat 命令的结合。ls2 命令返回的信息包括2部分:子节点列表 + 当前节点的stat信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
[zk: 127.0.0.1:2181(CONNECTED) 7] ls2 /node1
[node1.1]
cZxid = 0x47
ctime = Sun Jan 20 10:22:59 CST 2019
mZxid = 0x47
mtime = Sun Jan 20 10:22:59 CST 2019
pZxid = 0x4a
cversion = 1
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 11
numChildren = 1

删除节点(delete 命令)

这个命令很简单,但是需要注意的一点是如果你要删除某一个节点,那么这个节点必须无子节点才行。

1
[zk: 127.0.0.1:2181(CONNECTED) 3] delete /node1/node1.1

在后面我会介绍到 Java 客户端 API的使用以及开源 Zookeeper 客户端 ZkClient 和 Curator 的使用。

参考

  • 《从Paxos到Zookeeper 分布式一致性原理与实践》

关于我

发表于 2019-06-13

联系方式

  • 手机:
  • Email:
  • 微信:

个人信息

  • 魏先生/男/1990年
  • 本科/计算机科学与技术
  • 技术博客:http://blog.weiyuanbiao.cn/
  • 荣誉奖励:获得了什么奖(获奖时间)
  • Github:https://github.com/Snailclimb
  • Github Resume: http://resume.github.io/?Snailclimb
  • 期望职位:Java 研发程序员/大数据工程师(Java后台开发为首选)
  • 期望城市:广州

项目经历

xxx项目

项目描述

介绍该项目是做什么的、使用到了什么技术以及你对项目整体设计的一个感受

责任描述

主要可以从下面三点来写:

  1. 在这个项目中你负责了什么、做了什么、担任了什么角色
  2. 从这个项目中你学会了那些东西,使用到了那些技术,学会了那些新技术的使用
  3. 另外项目描述中,最好可以体现自己的综合素质,比如你是如何协调项目组成员协同开发的或者在遇到某一个棘手的问题的时候你是如何解决的。

开源项目和技术文章

开源项目

  • Java-Guide :一份涵盖大部分Java程序员所需要掌握的核心知识。Star:3.9K; Fork:0.9k。

技术文章推荐

  • 可能是把Java内存区域讲的最清楚的一篇文章
  • 搞定JVM垃圾回收就是这么简单
  • 前端&后端程序员必备的Linux基础知识
  • 可能是把Docker的概念讲的最清楚的一篇文章

技能清单

以下均为我熟练使用的技能

  • Web开发:PHP/Hack/Node
  • Web框架:ThinkPHP/Yaf/Yii/Lavarel/LazyPHP
  • 前端框架:Bootstrap/AngularJS/EmberJS/HTML5/Cocos2dJS/ionic
  • 前端工具:Bower/Gulp/SaSS/LeSS/PhoneGap
  • 数据库相关:MySQL/PgSQL/PDO/SQLite
  • 版本管理、文档和自动化部署工具:Svn/Git/PHPDoc/Phing/Composer
  • 单元测试:PHPUnit/SimpleTest/Qunit
  • 云和开放平台:SAE/BAE/AWS/微博开放平台/微信应用开发

自我评价

自我发挥。切记不要过度自夸!!!

感谢您花时间阅读我的简历,期待能有机会和您共事。

ThreadLocal原理

发表于 2019-06-13 | 分类于 java高级系列

ThreadLocal

ThreadLocal简介

通常情况下,我们创建的变量是可以被任何一个线程访问并修改的。如果想实现每一个线程都有自己的专属本地变量该如何解决呢? JDK中提供的ThreadLocal类正是为了解决这样的问题。 ThreadLocal类主要解决的就是让每个线程绑定自己的值,可以将ThreadLocal类形象的比喻成存放数据的盒子,盒子中可以存储每个线程的私有数据。

如果你创建了一个ThreadLocal变量,那么访问这个变量的每个线程都会有这个变量的本地副本,这也是ThreadLocal变量名的由来。他们可以使用 get() 和 set() 方法来获取默认值或将其值更改为当前线程所存的副本的值,从而避免了线程安全问题。

阅读全文 »

12.字节码的初步认识,来自i=i++,i=++i原理分析

发表于 2018-11-05 | 更新于 2019-06-13 | 分类于 java高级系列

首先来代码:

1
2
3
4
5
6
7
public class TestPlusPlus {
public static void main(String[] args) {
int i = 0;
i++;
System.err.println(i);
}
}

然后执行 javap -c TestPlusPlus

阅读全文 »

学习能力

发表于 2018-10-17 | 更新于 2019-06-13 | 分类于 生活

学习能力

脚踏实地,循序渐进
比如你想要做Web开发,那么可能就需要明确阶段性的目标,如先从前端或是后端的某个点着手,一点点拓展到其他的技术栈。

而一上手就要做高大上,就要采用“MEAN”(MongoDB+Express+Angular.js+Nginx)技术栈之类的,是不现实的。

在这几年的招聘过程中,个人感觉现在的前端圈子非常浮躁,很多毕业没两年的年轻人都会打上这样的标签:“精通jQuery”、“精通React”、“熟练使用xxx进行HTML5移动开发”之类的,笔试或者提问一些CSS基础、JS基础、简单算法都答不上来。会这些上层应用框架再多,也只是做一些代码的搬运工作,不太需要智商投入的事情,何来的底气要那么高的待遇?

阅读全文 »

11.mybatis原理分析

发表于 2018-07-21 | 更新于 2019-01-23 | 分类于 java高级系列

mybatis运行流程

sql封装流程

结果集绑定方式

注意问题

10.二叉树.B+树.红黑树等各种树

发表于 2018-07-20 | 更新于 2019-01-23 | 分类于 java高级系列

树的简介

二叉树

B树

B+树

红黑树

14.Java 之 JUC

发表于 2018-07-18 | 更新于 2019-06-13 | 分类于 java高级系列

Java 之 JUC

1. JUC 简介

在 Java 5.0 提供了 java.util.concurrent(简称JUC)包,在此包中增加了在并发编程中很常用的工具类,用于定义类似于线程的自定义子系统,包括线程池,异步 IO 和轻量级任务框架;还提供了设计用于多线程上下文中的 Collection 实现等;

2. volatile 关键字

  • volatile 关键字: 当多个线程进行操作共享数据时,可以保证内存中的数据是可见的;相较于 synchronized 是一种
    较为轻量级的同步策略;
  • volatile 不具备”互斥性”;
  • volatile 不能保证变量的”原子性”;
    阅读全文 »
12…4
Sherwin Wei

Sherwin Wei

做一个有温度有梦想的程序员,坚持到底.
39 日志
8 分类
13 标签
GitHub Weibo
友情链接
  • sherwin博客
粤ICP备15018188号-1 © 2018 – 2019 Sherwin Wei
|