Java
文章平均质量分 71
无始之名
Nothing is better than reading code.
展开
-
一个简单却是实用的分布式ID解决方案light-id
动机希望可以有一个容易部署,容易维护,原理简单(意味着不容易出问题),且性能还不错的分布式ID解决方案,没错,是方案,而不是方法。ID组成signsequencework id1 bit53 bit10 bitsign : 固定1bit符号标识,即生成的ID为正数;sequence : 2^53个取值,9007199254740992;worker id...原创 2019-08-01 22:22:47 · 1450 阅读 · 1 评论 -
Spring系列——MyBatis(XML版)
原文链接:http://www.dubby.cn/detail.html?id=9049 我相信读者如果看了《Spring系列——MyBatis》,肯定会不爽,因为习惯了用XML来写SQL,用什么注解?害得我又要重新学习,而且某些特性注解确实没有XML方便。所以,我来了,带来这篇XML版的MyBatis。 访问www.dubby.cn获取更多精彩内容。1. 你需要准备 如果你看过原创 2017-10-26 19:28:24 · 541 阅读 · 0 评论 -
Unsupported major.minor version 52.0
编译的时候用的Java版本较高,而运行时用的Java版本较低版本对照关系如下:J2SE 9 = 53J2SE 8 = 52J2SE 7 = 51J2SE 6.0 = 50J2SE 5.0 = 49JDK 1.4 = 48JDK 1.3 = 47JDK 1.2 = 46JDK 1.1 = 45原创 2017-12-02 22:41:38 · 186 阅读 · 0 评论 -
记一个执行了16分钟的请求
原文链接:http://www.dubby.cn/detail.html?id=90761.现象这是内部监控系统记录下这个请求的耗时:紧接着监控系统开始告警:为什么呢?因为有这么一个接口,我简单描述一下他干了什么吧:他接受一个图片的url,然后在服务端请求这个图片,读出字节后再输出给response。2.危害 这个接口可能并没有什么意义,但是在某些场景下确实有存在的必要。在此不讨论它存在的意义,原创 2017-12-22 18:26:19 · 263 阅读 · 0 评论 -
图形验证码
原文链接:https://blog.dubby.cn/detail.html?id=9081演示结果如下:用的是SpringBoot,当然其实这个和框架没啥关系,直接用servlet也是一样的操作:AuthResult.java:public class AuthResult { private String authCode; private String c原创 2018-01-04 13:15:48 · 425 阅读 · 0 评论 -
Ubuntu下,使用Java画图,中文乱码
原文链接:https://blog.dubby.cn/detail.html?id=9082原因其实很简单,你使用的字体不支持中文,或者你的操作系统没有支持中文的字体,你需要先安装有个中文字体:sudo apt-get install ttf-wqy-zenhei进入J2SDK的库目录中的字体目录,位于/usr/lib/jvm 中的某个目录 可能为 java-6-sun 可能为 j原创 2018-01-04 13:17:06 · 1360 阅读 · 0 评论 -
如果使用Maven打包成一个完整可执行的Jar包
原文链接:https://blog.dubby.cn/detail.html?id=9083Maven提供了这么一个plugin,Apache Maven Shade Plugin。他的作用就是用来打包一个超级Jar包(被称作uber-jar),其中包含了他依赖的其他Jar包。使用也是非常简单:pom.xml:project xmlns="http://maven.apache.原创 2018-01-04 13:49:51 · 24190 阅读 · 7 评论 -
Java实现多线程下载文件
原文地址:https://blog.dubby.cn/detail.html?id=90901.基本原理先使用head方法查询得到对应文件的Content-Length,然后拆分成多个部分,交由多个线程去处理,使用"Range", "bytes=" + start + "-" + end这个header来指定下载文件的哪个部分。2.代码实现 为了方便展示,我是用了一个类来实原创 2018-01-16 18:57:00 · 6762 阅读 · 0 评论 -
MyBatis入门——了解基本概念
原文链接:https://blog.dubby.cn/detail.html?id=90931. 了解MyBatis1.1 MyBatis是什么?使用Java操作数据库的话,JDK给我们提供了一层对各个数据库的封装,也就是JDBC,它屏蔽了数据库之间的差异,使用JDBC可以统一操作。但是他长期以来被人诟病的就是重复代码太多。封装参数需要一个一个set,还需要你把ResultSet一...原创 2018-02-09 10:10:55 · 988 阅读 · 0 评论 -
MyBatis插入记录获取自增的ID(MySQL)
如果想只用简单的查询语句查出刚刚插入的记录的自增ID,我们可能会想到select max(id) from table_name,但是,很明显这是不可取的,只要稍微有点并发,这就是个错误的结果。没错,使用LAST_INSERT_ID()就可以了。SELECT LAST_INSERT_ID()为什么可以,因为这个是基于connection的,每个数据库连接是相互独立的,在使用各种ORM框架操作数据库时原创 2017-10-25 19:47:38 · 1729 阅读 · 0 评论 -
雪花算法(snowflake)
雪花算法简单描述: + 最高位是符号位,始终为0,不可用。 + 41位的时间序列,精确到毫秒级,41位的长度可以使用69年。时间位还有一个很重要的作用是可以根据时间进行排序。 + 10位的机器标识,10位的长度最多支持部署1024个节点。 + 12位的计数序列号,序列号即一系列的自增id,可以支持同一节点同一毫秒生成多个ID序号,12位的计数序列号支持每个节点每毫秒产生4096个ID序号。看原创 2017-10-16 21:59:08 · 67650 阅读 · 13 评论 -
Spring系列——访问MySQL
原文链接:http://www.dubby.cn/detail.html?id=90411.我们要做什么本文介绍如果使用Spring + JPA来实现最简单的MySQL访问的web应用。2.你需要什么MySQL 5.6或者更高版本大约15分钟一个最爱的编辑器或者IDEJDK 1.8 +Maven 3.0+3.创建项目3.1 项目结构maven项目,结构如下:└── src └──原创 2017-10-20 16:09:09 · 1014 阅读 · 0 评论 -
伪共享(False Sharing)
原文地址:http://ifeve.com/false-sharing/ 原译文地址:http://ifeve.com/falsesharing/ 作者:Martin Thompson 译者:丁一缓存系统中是以缓存行(cache line)为单位存储的。缓存行是2的整数幂个连续字节,一般为32-256个字节。最常见的缓存行大小是64个字节。当多线程修改互相独立的变量时,如果这些变量共转载 2017-10-28 21:56:32 · 431 阅读 · 0 评论 -
使用Disruptor的几个代码演示
原文链接:http://www.dubby.cn/detail.html?id=9052代码地址:https://github.com/dubby1994/disruptor-demo 关于Disruptor的原理,实在是太过复杂,限于我水平有限,这里就不一一展开。如果读者有兴趣,可以去看他们的官方文档,代码库已迁移到GitHub,https://github.com/LMAX-Exchange原创 2017-10-29 12:04:28 · 3533 阅读 · 0 评论 -
Spring系列——使用JPA来操作数据
原文链接:http://www.dubby.cn/detail.html?id=9042代码地址:https://github.com/dubby1994/spring-demo JPA全称Java Persistence API,Java持久性API(简称JAP)是类和方法的集合,以数据关系映射持久并存储到数据库,这是由Oracle公司提供方案技术。可以减少开发者自己操作数据库时需要很多臃肿的原创 2017-10-21 19:15:46 · 341 阅读 · 0 评论 -
Spring系列——上传文件
原文链接:http://www.dubby.cn/detail.html?id=90431. 我们要做什么使用Spring实现一个最基本的文件上传,文件下载的web应用。2.你需要什么MySQL 5.6或者更高版本大约15分钟一个最爱的编辑器或者IDEJDK 1.8 +Maven 3.0+3. 创建项目3.1 项目依赖pom.xml<?xml version="1.0" encoding原创 2017-10-21 21:22:11 · 696 阅读 · 0 评论 -
Spring系列——@RequestMapping
原文链接:http://www.dubby.cn/detail.html?id=90441. 基本用法可以修饰类,也可以修饰方法。修饰类是代表URI由此类(controlller)里的方法处理,修饰方法是详细指定哪个方法处理哪个URI请求。2. HTTP方法method可以指定特定的HTTP方法才可以映射:@RequestMapping(path = "/hello", method = Reque原创 2017-10-22 21:42:37 · 615 阅读 · 0 评论 -
Spring系列——定时任务
原文链接:http://www.dubby.cn/detail.html?id=9046 本文简单介绍在Spring项目中怎么使用定时任务.1. 你需要准备的JDK 1.8 +Maven 3.0+2. 动手写代码2.1 项目依赖pom.xml<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache原创 2017-10-25 14:22:29 · 259 阅读 · 0 评论 -
Spring系列——MyBatis
原文链接:http://www.dubby.cn/detail.html?id=9047 本来是打算今天写使用JdbcTemplate来操作数据库的,可是转念一想,这根本不会有人用,最多也就是让读者了解其原理,所以就直接跳到了MyBatis这一节吧。毕竟,这是很实用的。1. 你需要做的准备JDK 8 +Maven 3.0 +MySQL在MySQL中间一个测试库,并创建测试表CREAT原创 2017-10-25 18:57:31 · 309 阅读 · 0 评论 -
MyBatis入门——了解配置
原文链接:https://www.dubby.cn/detail.html?id=90941、mybatis-config.xml这个配置文件的结构如下:propertiessettingstypeAliasestypeHandlersobjectFactorypluginsenvironmentsenvironmenttransactionManagerdataSo...原创 2018-10-14 11:55:45 · 198 阅读 · 0 评论 -
多线程下载文件
原文链接:https://www.dubby.cn/detail.html?id=90901.基本原理先使用head方法查询得到对应文件的Content-Length,然后拆分成多个部分,交由多个线程去处理,使用"Range", "bytes=" + start + "-" + end这个header来指定下载文件的哪个部分。2.代码实现为了方便展示,我是用了一个类来实现,其余都是内部类...原创 2018-10-14 11:57:42 · 732 阅读 · 0 评论 -
【浅度渣文】Jackson之jackson-core
原文链接:http://www.dubby.cn/detail.html?id=9069我们在这里使用jackson-core提供的JsonParser和JsonGenerator来实现基本的序列化和反序列化。1.数据和实体类我们先定义出JSON字符串:{ "id":123456789, "text":"我是杨正,我在http://www.dubby.cn", "fromUse...原创 2018-10-17 14:19:06 · 685 阅读 · 0 评论 -
【浅度渣文】Jackson之jackson-databind
原文链接:http://www.dubby.cn/detail.html?id=9070前几篇介绍Jackson的文章(Jackson介绍,Jackson之jackson-core),虽然很好,但是我相信你并愿意在项目中使用,因为使用起来很复杂,也许这也是很多人愿意使用Fastjson的原因吧。为什么会感觉这么复杂呢,因为jackson-core提供的是很低级的API,我们可以充分的了解细节,...原创 2018-10-17 14:19:44 · 2224 阅读 · 0 评论 -
【浅度渣文】Jackson之jackson-annotations
原文链接:http://www.dubby.cn/detail.html?id=9071字段命名@JsonProperty可以指定字段的命名(还可以指定这个字段需要参与序列化和反序列化)。@JsonProperty.value:指定的字段名字@JsonProperty.index:指定顺序,默写数据格式是基于顺序(JSON不是这种数据格式)@JsonProperty.defaultV...原创 2018-10-17 14:20:15 · 455 阅读 · 0 评论 -
自己动手写一个Redis客户端
原文链接:https://www.dubby.cn/detail.html?id=9121使用JavaFX,不依赖任何其他依赖,实现的一个简单的Redis客户端,编写的初衷是觉得Redis Desktop Manager太难用,并且Redis的RESP比较简单,所以这里就尝试着写了下RESPREdis Serialization Protocol,这里给出官方的文档链接。为啥Redis要...原创 2018-12-28 10:10:01 · 674 阅读 · 1 评论 -
常用加密解密(1)——消息摘要
原文链接:https://www.dubby.cn/detail.html?id=9122文章目录1. 常见编码1.1 Hex1.2 Base641.3 Base322. 消息摘要2.1 MD52.2 SHA2.3 MAC1. 常见编码为什么要介绍编码呢?因为在Java中,加密/解密都是对byte的操作,一段文本的byte[]经过加密后的bye[]可能是一段很随机的字节数组,如果不经过编码...原创 2018-12-28 10:10:59 · 755 阅读 · 0 评论 -
常用加密解密(2)——对称加密
原文链接:https://www.dubby.cn/detail.html?id=9123文章目录AESDESDESedeIDEA本文主要介绍常用的对称加密算法的Java实现<dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on&...原创 2018-12-28 10:12:54 · 557 阅读 · 0 评论 -
常用加密解密(3)——非对称加密
原文链接:https://www.dubby.cn/detail.html?id=9124最常用的非对称加密算法应该就是RSA,而且非对称加密算法的实现比较复杂,所以这里只介绍RSA。密钥长度密钥默认长度工作模式填充方式512~65536(必须是64的倍数)密钥默认长度:1024工作模式:ECB填充方式:NoPadding,PKCS1Padding等其他RS...原创 2018-12-28 10:13:41 · 775 阅读 · 0 评论 -
常用加密解密(4)——数字签名
原文链接:https://www.dubby.cn/detail.html?id=9125之前介绍了《常用加密解密(1)》里面提到了消息摘要,那么这一篇的数字签名和消息摘要有什么区别呢?事实上数字签名就是带上非对称加密的消息摘要。消息摘要的目的是防数据被篡改;而数字签名是抗否认。签名的过程是:总结就是,使用私钥加签,使用公钥验签import java.security.*;im...原创 2018-12-28 10:14:28 · 923 阅读 · 0 评论 -
Redis删除大Key
原文链接:https://www.dubby.cn/detail.html?id=9112这里说的大key是指包含很多元素的set,sorted set,list和hash。删除操作,我们一般想到有2种,del和expire。DELTime complexity: O(N) where N is the number of keys that will be removed. Whe...原创 2018-10-15 10:58:42 · 8023 阅读 · 1 评论 -
Lettuce和Jedis的基准测试
原文链接:https://www.dubby.cn/detail.html?id=91081.准备工作本地需要安装Redis,使用JMH做基准测试的框架:<dependency> <groupId>org.openjdk.jmh</groupId> <artifactId>jmh-core</artifactId>...原创 2018-10-15 10:58:25 · 5004 阅读 · 3 评论 -
Java加密之IV
原文链接:https://www.dubby.cn/detail.html?id=9097AES是一种**分组密码**。密码学中,分组(block)密码的工作模式(mode of operation)允许使用同一个分组密码密钥对多于一块的数据进行加密,并保证其安全性。分组密码自身只能加密长度等于密码分组长度的单块数据,若要加密变长数据,则数据必须先被划分为一些单独的密码块。通常而言,最后一块...原创 2018-10-14 11:58:24 · 8074 阅读 · 1 评论 -
JVM dump和分析
原文链接:https://www.dubby.cn/detail.html?id=90981、dumpjmap -dump:live,format=b,file=~/Desktop/dump.hprof 1110其他参数意义:Usage: jmap [option] <pid> (to connect to running process) j...原创 2018-10-14 11:58:39 · 3830 阅读 · 0 评论 -
Hystrix问题记录
原文链接:https://www.dubby.cn/detail.html?id=91001、CommandKey缓存问题考虑这样一个场景,先new了一个Command(commandKey=“commandA”),他的隔离策略是信号量隔离(ExecutionIsolationStrategy.SEMAPHORE),之后又new了一个Command(commandKey=“commandA”)...原创 2018-10-14 11:59:09 · 6385 阅读 · 0 评论 -
Spring Boot实现Web Socket
原文链接:https://www.dubby.cn/detail.html?id=9102实现代码依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId&...原创 2018-10-14 11:59:25 · 329 阅读 · 0 评论 -
Tomcat实现Web Socket
原文链接:https://www.dubby.cn/detail.html?id=91031、依赖本文使用的是Tomcat9项目结构也是最基本的servlet的项目结构:代码地址:https://github.com/dubby1994/tomcat-web-socket-study其实啥依赖都不需要,但是需要几个api,这些在Tomcat里都已经提供了,但是代码里还是需要提供一下...原创 2018-10-14 12:00:23 · 5384 阅读 · 1 评论 -
Netty实现Web Socket
原文链接:https://www.dubby.cn/detail.html?id=9104获取代码 https://github.com/dubby1994/netty-study/tree/master1.依赖 <dependency> <groupId>io.netty</groupId> <artifactId>net...原创 2018-10-15 10:57:20 · 278 阅读 · 0 评论 -
WebSocket的Frame协议解析
原文链接:https://www.dubby.cn/detail.html?id=9105先给出WebSocket Frame的协议:复制抓包抓到的数据:81 85 30 6c e2 9a 54 19 80 f8 49字段分析:8185306ce29a541980f8491000000110000101001100000110110011...原创 2018-10-15 10:57:42 · 11364 阅读 · 0 评论 -
Web Socket 性能对比——Spring Boot vs Tomcat vs Netty
原文链接:https://www.dubby.cn/detail.html?id=9106统计结果精确到5位小数;每次请求都预热过了等待上一个消息响应后再发送下一个消息实现方式消息类型消息长度发送消息数总耗时(s)Messages/s单方向单次耗时(ms)吞吐(MChars/s单方向)Spring BootText10010000032.3583...原创 2018-10-15 10:58:06 · 7274 阅读 · 3 评论 -
Spring系列——RESTful的web项目
原文链接:http://www.dubby.cn/detail.html?id=90401.目标是什么构建一个web应用,我们可以请求:http://localhost:8080/greeting返回一个JSON:{"id":1,"content":"Hello, World!"}还可以发起一个带参数的请求:http://localhost:8080/greeting?name=User返回一个JS原创 2017-10-20 12:51:45 · 5162 阅读 · 1 评论