- 博客(223)
- 资源 (6)
- 收藏
- 关注
原创 spring boot 的starter
平时spring boot项目使用mybatis的可能很大概念都会见到引入依赖<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>xx.xx.xx</version></dependency>
2020-10-22 23:41:13
284
原创 延时队列
延时队列背景平时,可能我们需要到某个时间执行某个任务,比如每周一统计部门人员的工作量,或者每10分钟执行某个任务,这种就是定时器的使用场景。定时器使用比较多,也有比较多的解决方案。另外,除了定时器,还有一种情况是需要过了多少时间后执行某个任务,这个任务只执行一次,这种情况不像定时器会周期性地执行定时任务,它只会执行一次就可以,就是常说的延时任务。设想可以将延时任务放到一条队列里,这条队列就是延时队列,而另外有定时器去延时队列里取任务,取出任务执行一次,那这个延时任务就只会执行一次,从而也达到了延时
2020-10-07 23:28:02
254
原创 Java的随机数原理
Java生成随机数时,可以会使用以下方法final int i = new Random().nextInt(int bound);或者final double v = Math.random();初一看,以为是两种方式,其实第二种的底层也是使用了Random的方法nextDouble(),所以我们主要看Random的方法即可。原理计算机生成随机数,有几种方式1.物理方式正在意义上...
2019-07-07 13:08:46
2709
原创 Redis(六)Script
Redis从2.6.0开始,可以使用命令EVAL,EVALSHA执行Lua脚本。脚本命令 EVAL script numkeys key [key ...] arg [arg ...] 比如 EVAL "return {KEYS[1], KEYS[2], ARGV[1], ARGV[2], ARGV[3]}" 2 key1 key2 a1 a2 a3双引号"…"的内容就...
2019-01-27 22:50:45
375
原创 Redis(五)Pipeling
请求响应协议和RTTRedis是使用TCP的客户端-服务端模式,叫做请求-响应协议。例如 Client: INCR X Server: 1 Client: INCR X Server: 2 Client: INCR X Server: 3 Client: INCR X Server: 4像这样需要请求-响应4个链路周期,每次...
2019-01-20 19:14:31
348
原创 MapStruct
一般java web开发的程序员,都有一个共同的体会,接受请求参数都会使用一个vo类,这个vo类里封装了所有需要接受的参数,然后对参数进行业务逻辑处理,处理完后会持久化处理,通常每个业务表都会对应一个bean类,然后就需要将vo对象转化为bean对象再持久化,这个过程中,就需要new bean对象,给bean对象里的每个属性赋值;请求处理完,还需要有返回,通常返回也会封装一个vo类,...
2018-11-24 23:08:04
768
翻译 kafka(一)入门
kafka跟activemq,rocketmq类似,也是其中一种消息中间件。Step1:下载kafka包https://kafka.apache.org/downloads 下载 kafka_2.11-1.1.0.tgz>tar -zxvf kafka_2.11-1.1.0.tgz>cd kafka_2.11-1.1.0Step2:启动kafkakafka需要用到zookeeper,...
2018-06-19 00:43:22
1865
1
原创 查询: exists、in、not in 和 not exists
现在两个表`user`和`user_role`表:user: user_role:1. 现在需要用 exists 作用子查询来查`user`表mysql> select * from user t where exists (select * from user_role r where t.id = r.user_id);2. 我们也可以用 in 来 查询`user`表mysql>...
2018-05-29 17:09:53
4316
1
原创 查询:group by和having
现在一用户表`user`,数据如下:1.查出名称`name`重复的记录mysql> select name, count(*) as name_count from user group by name having name_count > 1;2.查出年龄`age`大于1,名称`name`有多少种情况,分组:mysql> select age, name, count(*) ...
2018-05-29 14:16:02
591
原创 跳跃表-skiplist
前序现在有一组数据,然后要从这组数组中找到某个数,比如要查找数7,一般来说,逐个逐个来查找的话,那么时间复杂度就是O(n),当n的数量达到上百万,或上千万时,那性能是非常差的,在我们系统中是不能接受的。也许我们想到了hash,平衡二叉树结构来提高性能,今天我们来讲另一个结构:跳跃表-skiplist。比如二叉树,它会提取一些节点作为树的根节点,当然这里树指整棵树也指树的子树,类似地,我们跳跃表也可...
2018-05-28 23:45:32
374
原创 合并排序merge sort
合并排序算法是用分而治之的策略实现对n个进行排序。合并排序的基本思想:将需要排序的元素分成大概相同的2个子集合,分别给2个子集合进行排序,最终将2个排序好序的子集合合并成一个集合。<待续>...
2018-05-27 22:21:13
5929
1
原创 TCP协议-滑动窗口、拆包和粘包
TCP、UDP都可以完成从一端往另一端发送数据,只是UDP只是负责从发送端将数据发送出去就完了,不再管数据是否发送到接收端是否已经接收到了;而TCP不仅负责发送数据,还确保数据是否送达,TCP是可靠的,而且它也是可以流控的,管理发送的速度,不能超过设备的承受能力。TCP特性1.可靠性Reliability,TCP提供数据传的可靠性,确保接收端是否已接收到数据,如果超时没有收到接收端的确认,则会重新...
2018-04-22 11:14:40
3090
1
原创 Java的类装载体系
在Java的沙箱中,类装载器体系结构的第一道防线。因为java的字节码是由类装载器装载入Java虚拟机的。不同的类装载器提供不同的命名空间,命名空间可以隔离不同的类装载喊之间装载的类,有助于安全的实现。一、class文件检验器class文件检验器保证装载的class文件内容有正确的结构,而且这些class文件相互协调一致。class文件检验器只是在字节码执行之前对class文件进行一次分析检验它的...
2018-04-18 00:21:42
297
原创 HashMap笔记-JDK1.8
之前写过一篇HashMap笔记,不过是JDK1.7(含)之前HashMap,JDK在8后对HashMap做了很多的优化,在key冲突情况下的HashMap中的元素会形成一条链表,如果冲突key过多,则链表会越长,查询会变成线性时间复杂度O(log(n)),JDK8加入了红黑树来优化这种情况,所以也进行了再次研究下源码。我们先从put方法入手。JDK8的HashMap在插入元素时final V pu...
2018-04-07 22:31:00
265
原创 红黑树
参照:http://daoluan.net/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/%E7%AE%97%E6%B3%95/2013/09/25/rbtree-is-not-difficult.htmlhttp://daoluan.net/%E5%AD%A6%E4%B9%A0%E6%80%BB%E7%BB%93/%E6%95%B0%E6%8D%AE%E7%BB%93...
2018-03-04 15:39:50
435
原创 平衡二叉树
什么是平衡二叉树wiki:https://en.wikipedia.org/wiki/AVL_tree1.它是一颗空树,即是没有节点的树,或者是具有以下性质的二叉树: 2.树的左子树和右子树的高度之差(平衡因子)的绝对值不能超过1,并且左子树和右子树也是平衡二叉树,如此循环。其中,平衡因子:左子树的高度 - 右子树的高度,所以左子树高度比右子树高度小,则平衡因子就是负数,反之为正数,相等则为0。如...
2018-02-16 18:14:43
336
转载 synchronized的实现原理
转自:http://blog.csdn.net/chenssy/article/details/54883355记得刚刚开始学习Java的时候,一遇到多线程情况就是synchronized,相对于当时的我们来说synchronized是这么的神奇而又强大,那个时候我们赋予它一个名字“同步”,也成为了我们解决多线程情况的百试不爽的良药。但是,随着我们学习的进行我们知道synchronized是一
2018-01-21 15:30:58
314
原创 (十七)分组聚合
一般来说,消费者进行远程调用时,会调用远程的一个提供者。现在可以消费者调用一个方法,可以调用提供者多个方法再聚合结果返回。public <T> Invoker<T> refer(Class<T> type, URL url) throws RpcException { url = url.setProtocol(url.getParameter(...
2017-12-14 17:32:59
382
原创 MySQL(三)复制
MySQL复制功能,可以让一台服务器的数据与其他服务器保持同步,一台主库可以同步到多台备库,而一台备库只能有一台主库。MySQL支持的两种复制方式:基于行的复制和基于语句的复制。MySQL的复制步骤:1.主库将数据更新记录到二进制日志(BinLog);2.主库通知备库有数据更新;3.备库将主库的BinLog复制到自己的中断日志(Relay log);4.备库读取中断日志
2017-12-06 16:50:12
301
原创 MySQL(二)BinLog恢复数据
有时,我们误删了MySQL数据库的一些数据,肯定希望能够恢复我们误删的数据,这是可以解决的。有一个解决的方案是使用MySQL的二进制日志,也是我们经常说的BinLog,不过前提是,在启动MySQL时已经启用BinLog功能。查看BinLog功能是否启用:mysql> show variables like 'log_%';看到第一行的Variable_name为log_bin,对应的V
2017-12-02 11:24:40
367
原创 JMM-Java内存模型
JMM由来Java语言规范规定了JVM要维护内部线程类似顺序化语言:只要程序的最终结果等同于它在严格顺序化环境中执行的结果,允许编译器生成指令的次序跟源代码的次序不同,并且处理器可以乱序或者并行地执行指令,可以改变将处理器的高速缓存(寄存器)写入提交到主内存的变量的次序,所以存储在处理器缓存中的值,对于其他处理器并不可见。那为什么编译器改变源代码的执行次序,在近些年重新排序后的指令
2017-11-26 13:28:24
288
原创 (十六)优雅停机
dubbo的优雅停机,借助于java虚拟机的关闭钩子来实现。打开关闭钩子需要配置dubbo启动参数dubbo.shutdown.hook为true,才会使用关闭钩子启用优雅停机。在钩子里,调用dubbo的容器(有spring,log4j,jetty等容器,即com.alibaba.dubbo.container.Container的实现类)的stop方法,释放相关资源。spring在关闭时,...
2017-11-24 16:01:05
2984
转载 CLH队列
NUMA与SMPSMP(Symmetric Multi-Processor),即对称多处理器结构,指服务器中多个CPU对称工作,每个CPU访问内存地址所需时间相同。其主要特征是共享,包含对CPU,内存,I/O等进行共享。SMP的优点是能够保证内存一致性,缺点是这些共享的资源很可能成为性能瓶颈,随着CPU数量的增加,每个CPU都要访问相同的内存资源,可能导致内存访问冲突,可能会导致CPU资源的浪
2017-11-22 14:42:16
6018
原创 ReentrantReadWriteLock
一、原理read write lock 读写锁程序对一个资源的访问,一般可分为两种目标,一种是读取资源的信息,另一种是修改资源的信息,两种操作分为:读操作和写操作。在程序对一个资源进行读操作时,是允许其他程序也可以对资源进行读操作的,也可以另一种说法,读操作是共享的,因此,读写锁中的读锁也叫共享锁;在程序对一个资源进行写操作时,是不允许其他程序也去访问资源的,不管是写还是读操作
2017-11-18 21:59:33
216
原创 Zookeeper(五)Watcher机制
0.Watcher结构和传参先看看Watcher定义的结构:public interface Watcher { /** * This interface defines the possible states an Event may represent */ public interface Event { /**
2017-10-22 17:15:18
756
转载 一致性hash
介绍和C库源代码,用于一致的哈希。什么是libconhashlibconhash是一个一致的散列库,可以在Windows和Linux平台上编译,具有以下功能:高性能且易于使用,libconhash使用红黑树管理所有节点以实现高性能。默认情况下,它使用MD5算法,但也支持用户定义的哈希函数。根据节点的处理能力轻松扩展。一致散列为什么你需要一致的散列现在
2017-10-03 11:08:47
740
原创 (十五)RpcContext对象
比如现在消费者A调用提供者B,在RPC调用之前,消费者可以调用RpcContext.getContext().setAttachment(key, value);设置一些隐含参数,然后在提供者B可以通过RpcContext.getContext().getAttachment(key);拿到key的value。如果B又接着调用C,那么RpcContext则会放着B的调用C的参数,而之前A调用...
2017-09-12 17:05:45
5510
原创 (十四)异步调用
异步调用可以通过文件配置:<dubbo:reference id="fooService" interface="com.alibaba.foo.FooService"> <dubbo:method name="findFoo" async="true" /></dubbo:reference>在我们的业务层调用dubbo
2017-09-12 17:01:28
672
2
原创 VisualVM监视
整理下怎么通过JDK提供的视图化工具来监视java应用。1.配置文件远程机器上,建立jstatd 的 security policy 文件,比如建立在$JAVA_HOME/bin目录下:文件jstatd.all.policy:grant codebase "file:${java.home}/../lib/tools.jar" { permission java.sec
2017-09-03 22:54:49
334
转载 线上服务内存OOM问题定位三板斧
相信大家都有感触,线上服务内存OOM的问题,是最难定位的问题,不过归根结底,最常见的原因:本身资源不够申请的太多资源耗尽58到家架构部,运维部,58速运技术部联合进行了一次线上服务内存OOM问题排查实战演练,将内存OOM问题定位三板斧分享出来,希望对大家也有帮助。 题目某服务器上部署了Java服务一枚,出现了OutOfMemoryError,请问有可能是什么原因,问题应该如何定位?不妨设服务进程P...
2017-09-01 15:34:02
3810
1
转载 线上服务CPU100%问题快速定位实战
题目某服务器上部署了若干tomcat实例,即若干垂直切分的Java站点服务,以及若干Java微服务,突然收到运维的CPU异常告警。问:如何定位是哪个服务进程导致CPU过载,哪个线程导致CPU过载,哪段代码导致CPU过载? 步骤一、找到最耗CPU的进程工具:top方法:执行top -c,显示进程运行信息列表键入P (大写p),进程按照CPU使用率排序图示:如上图,最耗CPU的进程PID为10765 ...
2017-09-01 13:13:20
1326
2
原创 slf4j和log4j的源码及异步日志
我们在项目中,一般这样使用slf4j来记录日志:org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(Test.class);从这个日志Logger创建入手来看看源码:org.slf4j.LoggerFactory.getLogger(String name){ ILoggerFactory iLoggerFacto
2017-08-23 10:31:27
3735
转载 volatile和Cache一致性协议之MESI
转自:http://www.cnblogs.com/dolphin0520/p/3920373.htmlvolatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生机。 volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件
2017-08-14 17:46:06
15331
27
原创 (十三)异常分析
调用dubbo服务,有时出现异常信息Forbid consumer xxx.xxx.xxx.xxx(ip) access service xx.xx(service全包的名称) from registry xxx.xxx.xxx.xxx(提供者的ip) use dubbo version xxx(dubbo的版本号), Please check registry access list (wh...
2017-08-11 01:43:20
464
原创 分布式事务-例子讲解
从一个典型例子入手讲下分布式事务。分布式事务的典型例子:跨行转账银行A的账号 Bob银行B的账号 Smith银行A的模块,库ABob向Smith转账100元两阶段两阶段提交prepare(Bob - 100) 节点Aprepare(Smith + 100) 节点Bcommit(Bob)commit(Smith)事务完成两阶段提交的核心
2017-08-09 22:38:52
3830
原创 (十二)服务雪崩-熔断器
由于分布式系统将不同模式做成不同的服务,在一个系统1中,可能会调用了不同服务,比如会调用服务A、B、C,而服务跟服务之间也会相互调用的,比如服务D、E会调用服务A;当调用服务A失败时,系统1、服务D、服务E都会失败了,这样由于一个服务有问题,从而导致多个系统或者服务不可用,产生了服务雪崩。因此,提出一个熔断器,快速返回一个失败值(而不是在阻塞等待服务的返回,或者服务失败抛出来的异常导致调用者...
2017-08-01 10:31:46
2686
原创 (十一)并发控制
一、消费者并发控制消费者对同一个方法可以进行并发数的控制,dubbo也是基于过滤器的设置功能来实现并发控制的。通过配置actives的值,在可以Consumer配置,也可以在Provider配置,一般可以在提供者配置的,可以在提供者配置,提供者比较清楚服务能够承受的并发数。actives默认 0 每服务消费者每服务每方法最大并发调用数@Activate(group = Constan...
2017-07-15 16:29:19
532
原创 (十)dubbo原理
本文讨论的原理是,假设dubbo框架使用protocol是"dubbo",server和client底层传输数据是"netty"。 原理机制远程调用时,发送请求的封装对象com.alibaba.dubbo.remoting.exchange.Request远程调用时,接收返回的封装对象com.alibaba.dubbo.remoting.exchange.Response请求发...
2017-07-14 11:52:50
1139
原创 (九)监控模块-monitor
先用一张图来说明dubbo中的monitor模块结构:基于Filter来实现服务调用监控功能@Activate(group = {Constants.PROVIDER, Constants.CONSUMER})public class MonitorFilter implements Filter { private static final Logger logger ...
2017-07-08 11:37:15
6737
原创 (八)过滤器-Filter
序前dubbo会扫描META-INF/dubbo/internal/,META-INF/dubbo/,META-INF/services/目录下的文件,比如,过滤器的扩展类,则会扫描com.alibaba.dubbo.rpc.Filter文件的扩展类,如该文件的内容:afterFilter=lam.dubbo.provider.filter.AfterFilterbeforeFil...
2017-07-08 11:09:36
406
java连接redis的驱动包
2014-04-19
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人