自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

哆啦A梦

用于汇总一些基础知识及平时踩过的坑

原创 jdk1.7 HashMap发生死锁探究

标题标题jdk1.7 HashMap发生死锁探究当我们多线程并发对同一个HashMap对象进行put操作操作时,会埋下死锁的隐患,原因是put()方法可能会发生扩容,扩容的说话会移动链表上的节点,多线程情况下会使链表上的节点互相依赖,当我们在get()操作的时候,如果key对应的node节点恰好是上诉互相依赖节点,则比较hash值与key是否都相同的时候,如果不相同则比较next节点,结果互相...

2020-03-31 23:45:35 376

原创 YApi接口平台-接口挡板

YApi是一个开源的平台,官方平台链接,如下https://hellosean1025.github.io/yapi/index.html,目前很多大公司在使用,主要优势我认为有2个,第一该平台开源,搭建方便;第二该平台解决了前后端分离开发的痛点,前端同学在前期(后端接口不具备使用情况)无需等后端接口,与后端可以同时开始进行项目开发,只要按照双方约定的接口格式。 ...

2019-10-25 11:37:38 1014

原创 mac 开发工具

1、下载jetbrains-agent.jar包2、将下载的zip包解压到安装bin目录下,如下图所示3、修改idea bin目录下的idea.vmoptions文件,在最后一行添加-javaagent:jetbrains-agent.jar4、对该jar包进行赋权cd /Applications/IntelliJ\ IDEA.app/Contents/bin/ ...

2019-10-14 14:21:39 40

原创 通过服务名称查询端口号、pid、进程号

在工作中我们要按照http的端口号来映射服务地址,例如一个app的接口可以分成多种来源,如:h5接口、原生接口、或者购物车接口等等,前端调用这次接口的域名可能是多个,对应服务端的接口部署在不同的项目上,可以将多个项目同时部署在一台机器上,这时就会出现多个项目对应同一个服务器ip,这时要启动多个端口,需要运维在nginx中配置接口来源,例如将http://h5.login.com的域名映射到10.2...

2019-09-02 17:04:48 1962

原创 Mybatis批量插入sql语句 + 返回id

我们在保存数据操作时,可能会遇到批量插入的操作,有3中方法来操作该保存:一、Mybatis插入数据,返回id在sql语句上添加下面代码useGeneratedKeys="true" keyProperty="id"例如:<insert id="insert" useGeneratedKeys="true" keyProperty="id"> IN...

2019-07-17 16:11:23 586

原创 设计模式之状态模式

糖果机器:分为投入硬币-》转动手柄-》抛出糖果代码:状态上下文类:GumballMachine.java/** * 投币机 */@Data@ToStringpublic class GumballMachine { State soldOutState; State noQuarterState; State hasQuarterState;...

2019-05-08 19:17:18 51

原创 java自定义注解

自定义一个注解,用来检测某个值是否符合1、注解接口:SensitiveWordCheck.java,SensitiveWordValidator.class为实现类/** * @Description: */@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementTyp...

2019-05-07 11:17:44 131

原创 java架构统一处理接口调用前后日志打印

利用切面技术,统一处理接口调用前后,接口信息的日志打印情况/** * Controller控制层处理切面,负责处理服务层调用前后的操作。 * */@Slf4j@Aspect@Componentpublic class HandlerControllerLoggerAspect{ /** * 切面处理方法 * * @param joinP...

2019-05-07 10:24:23 940

原创 java架构统一处理异常

该统一异常处理基于springboot架构,利用切面技术,在service层或者controller层抛出异常后,被控制层切面捕获,转换后统一返回1、切面:控制层异常类,HandlerExceptionAspect.java/** * 控制层异常切面 */@Slf4j@ControllerAdvicepublic class HandlerExceptionAspect { ...

2019-05-07 10:17:08 1691

原创 设计模式之组合模式

组合模式定义:允许将对象组合成树形结构来表现“整体部分”层次结构。组合能使客户以一致方式处理个别对象以及对象组合1、例如通过将菜单和菜单项放到相同的结构中,我们创建一个“整体部分”层次结构,即3由菜单和菜单项组成的对象树2、组合模式让我们能用树行方式创建对象的结构,树里面包含了组合以及个别的对象3、组合包含组件,组件有俩种:组合与叶子节点元素、4、组合使用户不再需要操心面对的是组合...

2019-04-30 19:28:12 56

原创 Nginx完美解决跨域问题

1、跨域问题存在情况:当我们当前的域名与请求接口的域名不在同一个域名下时,在浏览器Console下会看到,跨域的错误提示,下面举一个例子来说明:1)前提条件:i、当前域名http://kuayu.comii、请求接口域名:http://csdn.b.com/cat当在前端页面通过ajax请求接口域名的数据时,会报跨域错误2、解决跨域方法解决跨域有多种方式,如果请求的接口...

2019-01-23 10:47:45 5934 3

原创 Redis-HyperLogLog内部实现原理源码解析

1、HyperLogLog算法时一种非常巧妙的近似统计大量去重元素数量的算法,它内部维护了16384个桶来记录各自桶的元素数量,当一个元素过来,它会散列到其中一个桶。当元素到来时,通过 hash 算法将这个元素分派到其中的一个小集合存储,同样的元素总是会散列到同样的小集合。这样总的计数就是所有小集合大小的总和。使用这种方式精确计数除了可以增加元素外,还可以减少元素。一个HyperLogLo...

2019-01-17 10:30:50 1560

原创 Redis-字典遍历内部实现原理源码

1、遍历Redis1)Redis对象树的主干是一个字典,如果对象很多,那么这个树会很大,当我们执行keys命令时,首先它会遍历整棵树,查找出满足条件的key,其次会判断遍历出的key对应的对象是否过期,如果过期则从主干中删除掉 void keysCommand(client *c) {     dictIterator *di; // 迭代器     dictEn...

2019-01-17 10:23:21 210

原创 Redis-懒惰删除内部实现

        异步线程在Redis内部有个特别的名称,叫作BIO(background IO),意思是后台运行的io线程,不过内存回收本身不是io操作,只是cpu计算消耗比较大。1、Redis的内部对象共享机制会阻碍异步线程的改造,原因是懒惰删除是要测底删除某个对象,不能藕断丝连,如果底层数据的共享的,就不能做到彻底删除了效果。所以为了支持懒惰删除,只能将对象共享机制彻底抛弃。2、异步删...

2019-01-17 10:15:42 780

原创 Redis-LFU与LRU内部实现原理源码分析

1、LRU模式有效控制内存的大小,将冷数据从内存中淘汰出去,在Redis里引入一个新的淘汰形式LFU                                     1)LFU全称是Least Frequently Used 表示按最近的访问频率进行淘汰,更加准确的判断一个key别访问的热度2、Redis对象的热度Redis中所有对象结构头中都有一个24bit字段,这个字段用来记录...

2019-01-17 10:11:15 827

原创 Redis-基树数源码原理分析

 1、Rax是Redis内部比较特殊的一种数据结构,它是有序字典树,按照key进行排序,支持快速定位、插入、删除操作。它与zset排序不同,zset是按照score排序,而Rax是按照key进行排序。 集中数据结构的特点如下图所示                       咱们可以将英语字典开成一棵radix tree,key是每个单词,value是对应的解释;也可以应用到时间...

2019-01-17 10:05:48 74

原创 Redis-紧凑列表源码原理分析

1、Redis 5.0 增加了新的数据结构listpack,它是对ziplist结构的改进,优点是在存储空间上更加节省以及在结构上比ziplist更精简1)结构体 struct listpack<T> {     int32 total_bytes; // 占用的总字节数     int16 size; // 元素个数     T[] entrie...

2019-01-17 10:03:50 241

原创 Redis-跳跃列表原理源码分析

1、Redis 的 zset 是一个复合结构,结构特点:1)需要通过hash 结构来存储 value 和 score 的对应关系2)要支持按照 score 来排序3)还要按照指定 score 的范围来获取 value 列表的4)要实现上诉的功能的结构,作者想到了跳跃列表5)zset的结构:通过一个hash字典加跳跃列表skiplist 2、跳跃列表结构1)基本结...

2019-01-17 10:02:39 114

原创 Redis-快速列表原理源码分析

1、早期版本存储list集合,采用ziplist和linkedlist,但由于链表的附加空间高,prev和next就要占去16个字节,而且每个节点的内存都要单独分配,会加剧内存的碎片化,所以后面的版本对结构进行了改造,使用快速列表(quicklist)1)实例 > rpush codehole go java python (integer) 3 > de...

2019-01-17 10:01:18 115 2

原创 Redis-压缩列表源码原理解析

1、Redis为了节约内存空间,zset和hash在对象比较少的时候,采用压缩列表(ziplist)来存储,可以用过debug object key 来查看结构1)ziplist的结构体 struct ziplist<T> {     int32 zlbytes; // 整个压缩列表占用字节数     int32 zltail_offset; // 最后一...

2019-01-17 10:00:03 95

原创 Redis-字符串源码原理

1、Redis的字符串结构被设计成一个[SDS]结构,字符串实际内容是被存放在一个数组中,如下表 struct SDS<T> {   T capacity; // 数组容量   T len; // 数组实际长度   byte flags; // 特殊标识位,不理睬它   byte[] content; // 数组内容 } 当...

2019-01-15 09:19:36 211

原创 Redis-字段源码原理

1、dict是Redis服务器中出现最为频繁的复合型数据结构,用到地方很多,例如hash结构,整个Redis所有key和value组成一个全局的字典、带过期时间的key集合、zset集合汇总存储value和score直接映射关系等等1)结构体: struct RedisDb {     dict* dict; // all keys  key=>value   ...

2019-01-14 21:03:49 175

原创 JVM第二篇之字节码加载、组成部分

1、Class字节码的加载1)ClassLoaderde的继承关系从BootStrapClassLoader开始,然后是ExtClassLoader,最后是AppClassLoader2)BootStrapClassLoader用户加载java自带核心类(例如java.lang.*)3)ExtClassLoader加载jre/lib/ext/目录下的jar包4)AppClassLo...

2019-01-14 21:00:15 84

原创 Redis-压缩列表内部实现

1、Redis为了节约内存空间,zset和hash在对象比较少的时候,采用压缩列表(ziplist)来存储,可以用过debug object key 来查看结构1)ziplist的结构体 struct ziplist<T> {     int32 zlbytes; // 整个压缩列表占用字节数     int32 zltail_offset; // 最后一...

2019-01-14 20:59:34 1425 2

原创 JVM第三篇之内存结构、OOM现象

1、Java对象的内存结构1)32位系统下存储对象头所需空间 16字节:Class指针4字节 + Mark Word空间4字节 若是数组再 + 4字节表示数组的长度2)64位系统及64位JVM:开启指针压缩,Class指针4字节 + Mark Word空间8字节3)32位系统,使用new Object(),JVM分配8个字节的空间4)32位系统,使用new Integet(),对象...

2019-01-14 10:55:42 56

原创 JVM第四篇之益处、常用java工具

1、StackOverFlowError:栈溢出1)实例:下面代码报java.lang.StackOverErrorpublic class StackeOverFlowTest{   public static void main(String []args){    new StackOverStackTest().testStackOver();} pub...

2019-01-14 10:55:31 155

原创 Java通信各种输入流输出流、java的io与内存及常见的通信方式NIO AIO等介绍

一、通信概述1、常用流的介绍:1)SocketInPutStream:继承于FileInputStream,本身的缓冲区是爱内核中2)DataInputStream :可以处理流中的不同的数据类型3)ZipInputStream、GZinputStream、JarInputStream:可以对数据做压缩和解压缩4)ByteArrayInputStream:通过内存的某些数据得到...

2019-01-14 10:55:19 54

原创 JVM之第一篇命令工具、字节码结构

1、Javap命令工具1)javap命令工具:可以查看编译后的指令2)const #1 = Method     #6.#21       //   java/lang/object.”<init>”:()V  代表意思:java.lang.Object类的构造方法,入口参数个数为0,返回值为void。3)<init>:构造方式,V代表返回值为void4)c...

2019-01-11 17:04:14 58

原创 计算机基础之第二篇

1、缓存1)分布式缓存:是一个共享中心,程序无需过于关系,一般来说,要读取数据先到缓存中读取,如果读取不到,在到数据库中读取,并放到缓存中,如果数据被修改,那么缓存中的数据也就失效了,必须同步到缓存中2)缓存用于非强制一致性,即使是数据库利用缓存的优势也是通过非绝对一致性完成的3)缓存荣复杂性开始变强,让一致性不是那么容易保证,因此他对可用性的要求肯定没有数据库高,它储存的数据可以允许...

2019-01-11 17:01:27 50

原创 计算机原理之第一篇

1、CPU1)CPU会有一级缓存、二级缓存、有的还会有三级缓存,其中CPU与一级缓存延迟的时间在2-3ns内,与二级缓存延迟10-15ns,与三级缓存在20-30内,但是与内存延迟在50ns内2)CPU用来做计算,内存只是用作运行数据时的一个存储,CPU调度线程及进程指令请求,CPU提供数据的计算功能2、多核3、Cache line:1)在CPU的三级缓存中,他将“连续的一段内...

2019-01-11 16:56:35 47

原创 设计模式之单例模式、命令模式

一、单例模式1、定义:确保一个类只有一个实例,并提供全局访问点1)保证该类只有一个实例2)提供全局的访问的入口3)某些情况下我们只想有一个实例,例如:线程池、缓存、对话框、注册表的对象和日志对象、显卡等设备程序的对象,如果是多个对象,会出现问题,例如资源浪费、程序的行为异常或者不一致的情况。2、单例模式三种方式1)加锁MethodSynSingleton.class...

2019-01-11 16:48:35 82

原创 设计模式之工厂模式

1、抽象工厂1)定义:提供了一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类2)抽象工厂允许客户使用抽象的接口来创建一组相关的产品,而不需要知道实际产出的具体产品是什么,这样一来,客户就从具有的产品中被解耦3)以客户定制披萨为例:a)创建披萨店b)点餐,点某种披萨c)厨房开始做:准备材料、烘烤、切片、装盒,除了材料不同,其他的制作步骤都相同,所以完全可以将做披...

2019-01-11 16:37:36 110

原创 设计模式之观察者、装饰者

1、观察者模式1)定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所以依赖者都会受到通知并自动更新。解释:a)观察者模式定义了一系列对象之间的一对多关系b)当一个对象改变状态,其他依赖者都会受到通知 c)一个对象通常指主题,依赖者被称为许多观察者d)例如报纸出版社与订阅者的关系2)事例观察者统一接口:IObserver.java/**观察者统...

2019-01-11 16:12:17 62

原创 java开发跨域问题解决方案

1、扫描是跨域:简单来的说是你接口的域名与要请求接口的域名不在同一个域名下或者不是同一个端口时,访问HTTP请求存在跨域的问题。2、跨域解决方案:跨域资源共享(CORS)机制和JSONP方式3、具体解决方案:1)配置跨域资源共享场景:当业务存在跨域需求时,需要设置Access-Control-Origin及Origin白名单,当跨域请求携带Cookie时,才允许设置Access-C...

2019-01-11 15:43:15 1430 1

原创 Tomcat之设计模式

Tomcat框架中设计到的设计模式包括:模板模式、工厂模式、单例模式、门面模式、观察者模式、责任链模式、命令模式等,下面分别对这些设计模式做一些简单的解释。1、门面模式:该模式一般用在一个大的系统中有多个子系统,子系统之间进行相互通信,每个子系统又不能将各自内部的数据都暴露给对方,所以每个子系统都设计一个门面,将别的系统感兴趣的数据封装起来,通过这个门面来访问。Request和Respoons...

2019-01-11 15:28:03 58

原创 JVM之ClassLoader工作机制

ClassLoader功能:将Class加载到JVM中、审查每个类应该由谁加载,采用父优先的登记加载机制、将Class字节码重新解析成JVM统一要求的对象格式。1、整个JVM平台提供3层ClassLoader,这3层ClassLoader可以分为俩种类型,可以理解为为接待室服务的接待室和为会员服务的接待室。1)BootstrapClassLoader:就是接待室服务自身的,主要加载JVM自...

2019-01-11 15:24:29 65

原创 JVM之编译、指令及其他

1、JVM编译过程:                                                                   1)语义分析器:添加默认构造函数(MemberEnter中complete方法)、处理annotation(注解)(javacProcessingEnvironment类)、处理Attr(标注)(检查语义合法性并逻辑判断如变量的类型是否匹...

2019-01-11 15:11:59 71

转载 MAC idea 2018 1 安装及破解

一、下载IntelliJ IDEA 2018.1链接:https://confluence.jetbrains.com/display/IDEADEV/IDEA+2018.1+EAPideaIU-181.4445.20.dmg安装。二、下载包:http://idea.lanyus.com/jar/JetbrainsCrack-2.7-release-str.jar在Find...

2019-01-06 21:51:21 212

原创 初探消息中间件Kafka、ActiveMQ、RabbitMQ、RocketMQ的优缺点

我们在开发软件的时候,经常会用到消息队列,凭借其自身的特点,可以在满足业务需求的前提下,一定程度上系统的抗压性,但是消息队列使用不当或者是选择不当,效果可能不会那么好,所以我们有必要了解消息队列的优缺点。1、优点:解耦、异步、削峰解耦:解除俩个系统的耦合度,凭借中间层,减少俩个系统直接调用的耦合度。异步:系统直接的调用由同步变成了异步,例如系统A、B、C,系统生产的消息不仅可以提供给B...

2019-01-05 12:31:46 1049

原创 Redis - 命令行工具

使用Redis内置的命令行工具 redis-cli一些便捷的命令:1、执行单条命令平时在访问 Redis 服务器,一般都会使用 redis-cli 进入交互模式,然后一问一答来读写服务器,这种情况下我们使用的是它的「交互模式」。还有另外一种「直接模式」,通过将命令参数直接传递给 redis-cli 来执行指令并获取输出结果。 $ redis-cli incrby foo 5...

2019-01-05 09:43:20 932

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