自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Sam_Deep_Thinking

努力深入思考和总结

  • 博客(305)
  • 问答 (12)
  • 收藏
  • 关注

原创 UUID几个缺点

第一个UUID字符串占用的空间比较大。第二个索引效率很低。第三个生成的ID很随机,不是人能读懂的。第四个做不了递增,如果要排序的话,基本不太可能。...

2018-03-21 10:47:45 10362

原创 IDEA 2017.3版本下Mybatis plugin 3.53安装使用

IDEA版本 2017.3mybatis插件版本 Mybatis plugin 3.53下载地址: http://plugins.jetbrains.com/plugin/7293-mybatis-plugin破解打开IDEA的插件设置界面,选择【Install plugin from disk】后,点击确定按钮。关闭IDE...

2018-03-19 10:13:29 4331 2

原创 业务流水号(交易号)生成方法

概述在大流量下订单号生成方法一文中介绍了如何生成不重复的订单号,主要原理是利用数据库自增ID。但是像业务流水号之类的,其实不利用数据库也是可以的,只是要保证唯一性,做起来不太好做。下文介绍一种方法来生成流水号,如果不是那种特别变态的调用量,产生重复的机会还是很少的。但是如果是那种无论如何都不能重复的,不建议用本文的方法了。流水号生成规则 时间+四位的机器号+10位的...

2018-03-09 12:56:16 30737 1

原创 大流量下订单号生成方法

流量不大的情况下,订单号生成很久之前写过一篇利用DB生成业务主键的文章,介绍了利用DB来生成唯一的ID。当时便是用这种方式来生成订单号的。只不过拿到ID后,根据订单业务,简单加个前缀而已。@Servicepublic class KeyGen{ @Autowired private KeyGenRepository keyGenRepository; publi...

2018-03-08 12:30:02 4806

原创 创建订单实现幂等的一点思考

幂等的概念大部分文章都会说,同一个操作,进行多次操作后,结果是一样的,就可以说这个操作是支持幂等的。感觉不太准确,比如一个http get操作,可能每次的结果都不一样,但是其实是幂等的。看了很多文章,感觉下面的定义比较准确: 一个操作如果多次任意执行所产生的影响(或者叫副作用),都是相同的。创建订单的幂等如果一个用户分两次下单,购买的商品都是一样的。第一次...

2018-03-06 13:55:49 8272

原创 索引表和ES的一点点思考

索引表设计在电商项目中,物理库存系统是个极其重要的系统,订单支付后,就会开始来占用物理库存。一般情况下,库存系统都是要分库的,因为主要的操作是写操作,例如占用/释放/取消等写操作。使用分库可以降低数据库写的压力。尽管写操作为主,但是读操作也是有的。比如说,库存占用的时候,得先查询是否有库存,而这个查询操作并不都会带上分库因子(用于路由到具体的某个数据库),而是一些比较宽松的查询条件,这些查...

2018-03-01 12:22:47 13505 14

原创 Spring Cloud Feign简单使用

概述在Spring Cloud EureKa Ribbon 服务注册-发现-调用一文中简单的介绍了在Spring Cloud中如何使用EureKa和Ribbon。文章中使用了RestTemplate去访问其他的restful微服务接口。其实在Spring Cloud还可以使用Feign来访问其他的restful微服务接口。使用起来更加的简洁明了。集成Feign修改一下S...

2018-02-24 16:54:52 1422

原创 Spring Cloud EureKa Ribbon 服务注册-发现-调用

概述用一个简单的例子演示Spring Cloud中EureKa和Ribbon的基本用法。版本和环境IDEASpring Boot 1.5.·0JDK 1.8Maven 3构建eureka server在Spring Cloud,可以使用eureka来管理微服务,微服务可以注册到eureka中。首先可以用IDEA的Spring Initi...

2018-02-24 14:44:47 7593 6

原创 Spring Boot集成Mybatis简洁版

概述现在互联网应用中,大部分还是使用Mybatis来操作数据库的,本文介绍一下Spring Boot中如何集成Mybatis。创建Spring Boot工程在Spring Boot 开篇-创建和运行 一文中有一个小节介绍了如何使用Spring Boot的组件来创建工程。如果要集成Mybatis,只需要把Mysql和Mybatis这两个组件勾选一下即可。当然也可以

2018-02-05 15:50:13 928

原创 Spring Boot 直接用jar运行项目

概述在Spring Boot 开篇-创建和运行一文中,介绍了如何创建一个Sprint Boot项目并且运行起来。但是运行的方式是在IDEA中直接Run起来的。还有另一中方式可以可以把Spring Boot程序运行起来,就是直接在命令行中执行jar包。打成jar包以往的WEB程序需要打成WAR包,部署到Tomcat上,而Spring Boot支持打包成JAR的形式,就算是

2018-02-05 13:17:58 56526 1

原创 Spring Boot 开篇-创建和运行

概述还没玩过Spring Boot,现在越来越多的公司在用了,不得不学习了。本篇是Spring Boot的开篇,简单介绍一下如何创建一个Spring Boot项目和运行起来。环境准备1、JDK 1.8 2、IDEA 3、Spring Boot的版本是1.5.10创建Spring Boot的工程new一个project选择Sprin...

2018-02-02 16:37:33 2662

原创 深入理解Java虚拟机(第一版)-第三章读书笔记

深入理解Java虚拟机(第一版)-第三章读书笔记

2017-12-11 21:24:08 877

原创 深入理解Java虚拟机(第一版)-第二章读书笔记

深入理解Java虚拟机(第一版)-第二章读书笔记

2017-11-26 08:19:38 1428 1

原创 扩展ThreadPoolExecutor的一种办法

概述在JAVA的世界里,如果想并行的执行一些任务,可以使用ThreadPoolExecutor。 大部分情况下直接使用ThreadPoolExecutor就可以满足要求了,但是在某些场景下,比如瞬时大流量的,为了提高响应和吞吐量,最好还是扩展一下ThreadPoolExecutor。全宇宙的JAVA IT人士应该都知道ThreadPoolExecutor的执行流程:core线程还能应付的,则不断

2017-10-18 17:21:00 6350 7

原创 netty实战-netty client连接池设计

概述最近有很多网友在咨询netty client中,netty的channel连接池应该如何设计。这其实是个稍微有些复杂的主题,牵扯到蛮多技术点,要想在网上找不到相关的有相对完整的参考文章,确实不太容易。在本篇文章中,会给出其中一种解决方案,并且附带完整的可运行的代码。如果网友有更好的方案,可以回复本文,我们一起讨论讨论,一起开阔思路和眼界。阅读本文之前需要具备一些基础知识知道netty的一些基础

2017-09-15 13:58:31 27524 12

原创 netty实战-自定义解码器处理半包消息

概述在李林锋的Netty系列之Netty编解码框架分析中介绍了各种解码器,也推荐组合LengthFieldBasedFrameDecoderByteToMessageDecoder这两个解码器来处理业务消息。但是有时候为了灵活性,会直接选择继承ByteToMessageDecoder来处理业务消息,但是直接继承ByteToMessageDecoder,则需要自己处理半包问题。在李林锋的【netty

2017-09-10 10:29:23 14703 35

原创 <netty权威指南>笔记-分隔符解码器处理半包问题

概述在以回车换行结尾的消息如何处理半包问题 一文中介绍了如何处理以回车换行的消息的半包问题,如果消息用分隔符来切割的,那么如何处理半包问题呢?可以组合使用 DelimiterBasedFrameDecoder StringDecoder来处理半包问题。netty分隔符解码器服务端代码package nettyguide.encode.delimiter.server;import i

2017-09-05 19:07:37 3416

原创 <netty权威指南>笔记-以回车换行结尾的消息如何处理半包问题

概述TCP底层会发生粘包和拆包,这个是TCP的一个特性。为了减少网络数据传输的次数,TCP总是希望让网络数据到达一定量级的时候才将数据发送出去,而不是缓存区一有数据就马上发送数据。TCP底层会根据缓冲区是否被填满了,来决定是否发送数据。但是从业务层面上看,这个是不合理的。因为一份业务数据可能很小,还不足以填满缓冲区,这样底层TCP就不会立刻把这份业务数据发送出去,而是等到好几份业务数据的大小填满缓冲

2017-09-01 23:28:36 3915

原创 netty实战之百万级流量NioEventLoopGroup线程数配置

编写netty服务端程序的时候,会使用到两个线程组 EventLoopGroup parentGroup = new NioEventLoopGroup(); EventLoopGroup childGroup = new NioEventLoopGroup();那么parentGroup和childGroup分别应该设置多少个线程呢?关于netty的线程组概念,李林锋的Netty系

2017-08-30 14:26:41 38523 15

原创 netty实战之ChannelOption配置

服务端ServerBootstrap之ChannelOption配置public static void main(String[] args) throws InterruptedException { EventLoopGroup parentGroup = new NioEventLoopGroup(); EventLoopGroup childGroup =

2017-08-29 19:23:05 12697 1

原创 netty学习十三:零拷贝底层实现原理

零拷贝概述零拷贝可以避免无谓的copy动作,为了说清楚这一点,本文会先从传统的读写操作开始介绍。传统读操作当应用发起一个从磁盘读取文件的操作时,请求会先经过内核,由内核与磁盘进行交互。数据会从磁盘拷贝到内核的缓存区中。这个copy动作由DMA完成,整个过程中基本上不消耗CPU。DMA 硬件和软件的信息传输,可以使用DMA(direct memory access)来完成如果应用想拿到信息,还得

2017-08-28 20:15:42 13661 5

原创 netty学习十二:了解NIO Buffer中的postion和capacity和limit

netty学习十二:了解NIO Buffer中的postion和capacity和limit

2017-08-22 06:27:16 2032 1

原创 netty学习十一:NIO客户端服务端通讯demo

netty学习十一:NIO客户端服务端通讯demo

2017-08-20 15:26:38 1377

原创 netty学习十:google grpc框架环境搭建以及第一个demo

概述本文将会介绍两部分内容: 1、window 7 上搭建grpc环境; 2、构建关于grpc的java小demo.下载grpc java依赖包为了能生成针对java的grpc客户端和服务端代码(官方叫stub),需要下载一些java包和grpc编译器以及一些gradle 插件java依赖包 compile ‘io.grpc:grpc-netty:1.4.0

2017-08-13 18:44:12 6158

原创 netty学习九:(window7上)python客户端通过thrift调用java服务端

概述本文简单介绍使用python编写客户端代码,通过thrift rpc框架,调用java端远程服务。在64位window 7上安装pythonpython对应的下载链接:python下载本文使用的版本是 python-2.7.9下载完后文件名字是 python-2.7.9.amd64.msi点击直接安装,一路next即可。下载JetBrains PyCharmpython最好的IDE当

2017-08-10 11:34:25 3120

原创 netty学习八:在window上安装thrift以及第一个小demo

下载thrift window编译器需要先下载编译器,本文用的版本是: thrift-0.10.0.exe对应的下载链接:thrift编译器将下载好后的thrift-0.10.0.exe重命名成thrift.exe,并配置到window path路径上,假设thrift.exe是放置在如下目录: D:\test\software\lib\thrift那么直接

2017-08-09 09:28:37 1782

原创 netty学习七:集成protobuf完成单个对象序列化以及在网络上传输

概述本文介绍使用netty集成google的protobuf框架,完成proto JAVA对象的序列化和反序列化。编写proto文件protobuf使用.proto文件来描述对象结构体的信息。 Person.proto文件的位置 src/main/java/protobuf/seconddemo/Person.protosyntax = "proto2";package protobuf;

2017-08-07 21:41:23 2850

原创 netty学习六:第一个protobuf小demo

概述本文介绍google的protobuf框架的环境搭建以及使用它编写一个小demo。配置proto编译器如果要在window上使用proto编译器,需要下载针对window的编译器,本文使用的是: protoc-3.3.0-win32.zip解压完后,将protoc.exe编译器所在的路径设置到path路径上. C:\sam\software\protobuf\bin这点使用windo

2017-08-06 18:08:25 1087

原创 netty学习五:websocket小demo

netty学习五:websocket小demo

2017-08-05 07:50:09 1364

原创 netty学习四:监听channel的读写空闲情况

概述netty提供了一个IdleStateHandler类,可以用监听channel的读写空闲状态。构造方法如下: public IdleStateHandler(long readerIdleTime, long writerIdleTime, long allIdleTime,TimeUnit unit) { }1、当隔了readerIdleTime后,如果客户端未发送信息到服务端,那么会触发c

2017-07-30 17:21:22 5594 1

原创 netty学习三:基于socket的聊天小demo

netty学习三:基于socket的聊天小demo

2017-07-30 12:53:33 1526 1

原创 netty学习二:基于socket通讯的小demo

netty socket编程小demo

2017-07-29 16:07:42 1797

原创 netty学习一:用netty构造http服务的小demo

概述netty可以支持http、socket、websocket,本文会做一个小demo,简单介绍一下如何用netty搭建一个http服务。netty虽然可以提供http服务,但是相比spring mvc、struts2等框架,netty显得比较底层,很多spring mvc提供的功能,netty统统都没有。步骤编写netty程序的步骤都比较相似: 1、 启动group监听客户端请求 2、编写I

2017-07-23 10:50:18 3441

原创 利用Apache工具和Guava对ArrayList进行分页

概述之前写过一篇对ArrayList进行分页,介绍如何用JAVA API对ArrayList进行分页,下面再介绍另外两种方法。使用Apache工具使用Apache的ListUtils类,一行代码即可解决。import java.util.Arrays;import java.util.List;import org.apache.commons.collections4.ListUtils;imp

2017-06-14 15:28:44 5182

原创 下载Spring源代码

概述惭愧,工作好几年了,现在才来开始研究Spring的源代码。Spring 源代码路径https://github.com/spring-projects/spring-framework.git直接使用git clone https://github.com/spring-projects/spring-framework.git下载的过程比较漫长,慢慢等。使用Gradle 构建代码Spring是

2017-06-09 10:13:48 734

原创 JAVA+信号量:阻塞线程

概述为了提高接口的响应速度,可以使用ThreadPoolExecutor + Runnable 或者ThreadPoolExecutor 并发调用 技术来并行执行task。但是ThreadPoolExecutor有个特点,就是当core线程不足以应付请求的时候,会将task加入到队列中。一旦使用队列,那么就可能出现队列爆掉或者队列导致的内存溢出问题。为了尽快提供接口响应速度,但是又不想使用队列特性

2017-06-05 09:08:21 2382

原创 ThreadPoolExecutor + Runnable

概述在ThreadPoolExecutor 并发调用 一文中介绍了ThreadPoolExecutor + Callable的方法并行执行task,其实ThreadPoolExecutor还有另一种用法, ThreadPoolExecutor + Runnable。如果你不理会task执行的结果,可以使用这种方法。 代码public class TestExecutorCountDown

2017-06-05 08:31:10 2668

原创 重构大型业务型写接口-并行处理注意点

概述为了提高接口的处理速度,通常会使用并行的方式。在JAVA中可以使用ThreadPoolExecutor 或者ForkJoinPool 。像并行查询或者并行调用外部接口,经常会用到这两种技术,基本上没什么坑。但是如果是使用这两种技术来重构大型的业务型写接口,则需要小心细致。 task切分task粒度切分是个技术活。必须大小合适。尽量保证执行task的每个线程...

2017-06-04 22:01:36 2195

原创 利用ConcurrentHashMap和计数器实现锁

概述在某些场景下,我们想让线程根据某些业务数据进行排队,简单代码如下:import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.concurrent.ConcurrentHashMap;import ...

2017-05-27 13:51:11 2699

原创 ThreadPoolExecutor 并发调用

概述通常为了提供任务的处理速度,会使用一些并发模型,ThreadPoolExecutor中的invokeAll便是一种。 代码package test.current;import java.util.ArrayList;import java.util.Arrays;import java.util.List;import java.util.concurrent.Callable;

2017-05-05 21:22:45 2474

空空如也

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

TA关注的人

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