自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(36)
  • 收藏
  • 关注

原创 jdk1.8 HashMap&ConcurrentHashMap分析

一、HashMap1.8中的HashMap不同点有:数据结构:采用的是数组+链表+红黑树,当链表长度上已经有8个元素了,put第9个元素时,链表变为红黑树put()方法:在put()操作时采取的尾插法(1.7是头插法),头插法导致多线程put情况下会造成死循环扩容条件:1.8中if(++size>threshoId)而1.7中if ((size >= threshold) && (null != table[bucketIndex]))1,红黑树我们都知道

2021-03-03 00:56:26 365

原创 jdk1.7 HashMap&ConcurrentHashMap分析

一、基本了解 HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。HashMap 实现了 Map 接口,根据键的 HashCode 值存储数据,具有很快的访问速度,最多允许一条记录的键为 null,不支持线程同步。HashMap 是无序的,即不会记录插入的顺序。HashMap 继承于AbstractMap,实现了 Map、Cloneable、java.io.Serializable 接口。HashMap 继承于AbstractMap,实现了 Map、...

2021-02-26 00:31:54 263

原创 Mybatis学习笔记六之设计模式

一、设计模式 在软件工程领域,设计模式是一套通用的可复用的解决方案,用来解决在软件设计过程中产生的通用问题。它不是一个可以直接转换成源代码的设计,只是一套在软件系统设计过程中程序员应该遵循的最佳实践准则。Mybatis源码中使用了大量的设计模式,通过观察设计模式在源码中的应用,能够更深入的理解设计模式。结合前面源码的分析,我们这里只介绍Build构建者模式、工厂模式和代理模式。1,Build构建者模式 Builder构建者模式指:将一个复杂对象的构建与它的...

2020-11-09 19:44:58 221

原创 Mybatis学习笔记五之源码剖析

一、Mybatis底层工作原理 上篇文章中我们讲到Mybatis和数据库交互有两种方式,一是使用传统的Mybatis提供的API,第二是Mapper的代理方式。项目中一般都是使用第二种方式,那这两种方式的初始化过程有什么不同呢。 Mybatis在初始化的时候,会将Mybatis的配置信息全部加载到内存中,使用org.apache.ibatis.session.Configuration实例来维护。首先对Configuration对象介绍:Configuration对象的结构和...

2020-11-09 15:37:04 178

原创 mybatis学习笔记四之架构原理

一、架构设计我们可以把mybatis的功能架构分为三层:(1)接口层:提供给外部使用的接口API,开发人员可以通过这些API来操作数据库。接口层一接收到请求就会调用数据处理层来完成具体的数据处理。Mybatis和数据库交互有两种方式:使用传统的Mybatis提供的API:sqlSession.selectList("com.lagou.dao.IUserDao.selectList")使用Mapper的代理方式:IUserDao userDao = sqlSession.getMappe

2020-11-08 15:52:38 246

原创 mybatis学习笔记三之mybatis插件

一、插件介绍 一般情况下,开源框架都会提供插件或其他形式的扩展点,供开发者自行扩展。一是增加了框架的灵活性、二是开发者可以结合实际需求,对框架进行扩展。以Mybatis为例,我们可基于Mybatis插件机制实现分页、分表、监控等功能,在无形中增强功能。二、Mybatis插件 Mybatis框架具有强大的灵活性,在四大组件(Executor、StatementHandler、ParameterHandler、ResultSetHandler)处提供了简单易用的插件...

2020-11-06 00:17:20 256

原创 mybatis学习笔记二

一、Mybatis缓存mybatis提供了对缓存的支持,分为一级缓存和二级缓存,可以通过对下图来理解(1)、一级缓存是SqlSession级别的,在操作数据库是需要构造SqlSession对象,在对象中有一个数据结构(HashMap)用于存储缓存数据,不同的SqlSession之间的缓存数据区域(HashMap)是相互不影响的。测试:我们在一个SqlSession中,对User表通过id查询两次,看他们发出sql的情况(2)、二级缓存是Mapper级别的。多个SqlSession去.

2020-11-04 23:07:51 154 1

原创 mybatis学习笔记一

一、JDBC操作数据库代码:public static void main(String[] args) {Connection connection = null;PreparedStatement preparedStatement = null;ResultSet resultSet = null;try {// 加载数据库驱动Class.forName("com.mysql.jdbc.Driver");// 通过驱动管理类获取数据库链接connection =DriverMa

2020-11-02 21:11:11 846 1

原创 线程池

一、为什么需要线程池? 在实际应用中,线程是很占用系统资源的,如果对线程管理不善,很容易导致系统问题。因此,在大多数并发框架中都会使用线程池来管理线程。好处:(1)使用线程池可以重复利用已有的线程池继续执行任务,避免线程池在创建和销毁时造成消耗(2)由于没有线程创建和销毁时的消耗,可以提高系统响应速度(3)通过线程池可以对线程进行合理的管理,根据系统的承受能力调整可运行线程数量的大小 等二、线程池分类ScheduledThreadPoolExecutor:可以定时执行任务...

2020-06-11 00:00:14 175

原创 初学SpringCloud之Hystrix

一、高并发问题:模拟环境1.1,我们先创建好相关工程,还是用订单服务(order_service)调用商品服务(product_service),如下:我们都知道,一个Tomcat可以承受的并发量肯定是有限的,这里为了更好的演示问题,我设置为支持10个线程同时访问OrderController中的方法:@RestController@RequestMapping("/order")public class OrderController { @Autowired priva

2020-06-06 22:20:37 209

原创 初学SpringCloud之Feign

一、SpringCloud组件之Fegin 上篇文章我们讲了Ribbon,主要功能是负载均衡,也用它实现了远程调用(基于RestTemplate下用服务名称替换了ip地址),代码大概如下(OrderController中代码):/** * 基于ribbon的形式调用远程微服务 * 1.使用@LoadBalanced声明RestTemplate * 2.使用服务名称替换ip地址 */ @RequestMapping(value = "/buy/{i...

2020-06-06 16:24:44 181

原创 初学SpringCloud之Ribbon

一、负载均衡器Ribbon1.1,Ribbon概述 Ribbon是 Netflixfa 发布的一个负载均衡器,有助于控制 HTTP 和 TCP客户端行为。在 SpringCloud 中,Eureka一般配合Ribbon进行使用,Ribbon提供了客户端负载均衡的功能,Ribbon利用从Eureka中读取到的服务信息,在调用服务节点提供的服务时,会合理的进行负载。在SpringCloud中可以将注册中心和Ribbon配合使用,Ribbon自动的从注册中心中获取服务提供者的列表信息,并基...

2020-06-06 12:24:48 158

原创 初学SpringCloud之Eureka

一、SpringCloud组件之EurekaEureka是微服务的注册中心。注册中心可以说是微服务架构中的”通讯录“,它记录了服务和服务地址的映射关系。在分布式架构中,服务会注册到这里,当服务需要调用其它服务时,就这里找到服务的地址,进行调用。1.1,Eureka概述 Eureka是Netflix开发的服务发现框架,SpringCloud将它集成在自己的子项目spring-cloud-netflix中,实现SpringCloud的服务发现功能。1、Eureka Serv...

2020-06-05 12:31:34 157

原创 初学SpringCloud(一)

Spring Cloud是一个基于Spring Boot实现的云原生应用开发工具,它为基于JVM的云原生应用开发中涉及的配置管理、服务发现、熔断器、智能路由、微代理、控制总线、分布式会话和集群状态管理等操作提供了一种简单的开发方式。一、SOA与微服务的关系SOA(Dubbo):面向服务的架构,他是一种设计方法,其中包含多个服务,服务之间通过相互依赖最终提供一系列功能,一个服务通常以独立的形式存在,各个服务间通过网络调用。微服务架构:类似SOA,是在SOA上做的升华。微服务架构强调...

2020-06-03 22:55:50 169

原创 初学Spring Boot

一、Spring Boot Spring Boot是用来简化新Spring应用的初始搭建以及开发过程。不仅继承了Spring框架原有的优秀特性,而且还通过简化配置来进一步简化了Spring应用的整个搭建和开发过程。另外SpringBoot通过集成大量的框架使得依赖包的版本冲突,以及引用的不稳定性等问题得到了很好的解决。(整个Spring技术栈的大整合、J2EE开发的一站式解决方案)spring Boot优点:快速创建独立运行的Spring项目以及与主流框架继承。使...

2020-05-31 14:03:02 530

原创 kafka

一、消息队列(MQ)1.1,消息队列是消息的传输过程中保存消息的容器。它有两种模式:(1)点对点模式:一对一,消费者主动拉取数据,消费速度由自己控制,消息收到后消息清除。 缺点:只能一个消费者消费,且消费者需要主动监听队列。(2)发布/订阅模式:一对多,数据生产后,主动推送给所有订阅者。 缺点:不同客户端消费消息的速度可能不一样,而队列推送消息的速度是一样的,可能造成资源的浪费。1.2,消息队列的优点解耦、冗余、扩展、灵活性、可恢复性、顺序保证...

2020-05-30 17:50:06 310

原创 JVM虚拟机执行原理

JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。首先给大家看下jdk体系结构图:JD...

2020-05-25 23:53:49 275

原创 Mysql中的锁

一、从对数据操作的粒度分:表锁(偏读):MyISAM引擎,开销小,加锁快;无死锁,锁定粒度大,发生锁冲突的概率低,并发度最低查看表上加过的锁:show open tables;手动加表锁:lock table 表名 read(write),表名2 read(write)释放锁:unlock tables;行锁(偏斜):InnoDB引擎...

2020-05-24 10:41:36 219

原创 Mysql数据库索引优化

在讲Mysql数据库优化前先讲讲Mysql是怎样执行我们写的sql。一、Mysql分层连接层:提供与客户端连接的服务(只是和客户端建立连接)服务层:第一是提供各种用户使用的接口(select,insert...)。第二是提供SQI优化器(Mysql会自动等价优化我们写的sql)引擎层:提供了各种存储数据的方式(InnoDB MyISAM等)InnoDB(默认):事务优先 (适合高并发操作;行锁)每行数据都加个锁。支持外键MyISAM:性能优先(表锁)存储层:存储数据二...

2020-05-23 19:28:13 406

原创 MySql索引底层原理

一、索引 说到索引,大家理解的肯定是把它当做字典的偏旁或者一本书的目录页,更好的指引我们找到内容。可以去这样理解,但这样太表面了。 其实,索引是帮助MySql高效获取数据的排好序的数据结构。我们先讲讲数据结构。二、索引数据结构2.1 Hash表 Hash索引(hash index)基于哈希表实现,对于每一行数据,存储引擎都会对所有的索引列计算一个hash码(hash code),哈希码是一个较小的值,哈希索引将所有的哈希码存储在索引中,同时在哈希表中保存指向每个数据行...

2020-05-09 00:10:50 319

原创 Redis系列三

Redis集群一、为什么要使用Redis集群Redis是基于内存的数据库,机器的内存普遍在16~256G之间,如果我们的数据量有500G,这时必须使用Redis Cluster。二、数据分区我们在学习Redis集群之前我们先看看数据分区的概念,就是怎么将所有的数据合理的分配到不同的节点上。常有的分区方式有顺序分区和哈希分区。2.1 顺序分区就是将同一个范围内的数据存储到...

2020-05-04 17:08:40 218

原创 Redis系列二

Redis主从复制上篇文章中,我们了解了 Redis 两种不同的持久化方式,Redis 服务器通过持久化,把 Redis 内存中持久化到硬盘当中,当 Redis 宕机时,我们重启 Redis 服务器时,可以由 RDB 文件或 AOF 文件恢复内存中的数据。不过持久化后的数据仍然只在一台机器上,因此当硬件发生故障时,比如主板或 CPU 坏了,这时候无法重启服务器,有什么办法可以保证服务器发生故...

2020-05-04 11:30:38 252

原创 Redis系列一

一、初识Redis1,什么是redis使用C语言编写,遵守BSD协议的一个高性能key-value分布式内存数据库并提供持久化的NoSQL数据库2,redis特性:速度快Redis官方给出的数据是10W QPS(每秒可以操作数据10W次),这个数据会根据电脑性能和Redis的使用方式不同而略微不同,但是在万级数据中操作没有压力。redis为什么那么快呢?(1)纯内存操作...

2020-05-02 16:14:36 195

原创 数据库中间件mycat

海量数据存储问题 随着互联网的发展,数据的量级也是呈指数增长,从GB到TB再到PB,对数据的各种操作也愈加困难。如果使用关系型数据库解决海量存储的问题呢?此时就需要做数据库集群,为了提高查询性能将一个数据库的数据分散到不同的数据库中存储。1,什么是数据库分片简单来说,就是指通过某种特定的条件,将我们存放在同一个数据库中的数据分散存放到多个数据库(主机)上面,以达到分散单...

2020-04-12 23:50:32 327

原创 企业级搜索服务器solr

上篇文章我们讲到Luncene,Luncene在创建索引,维护索引时相当繁琐,这些slor都可以解决。 Solr是一个高性能,采用Java开发,基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎。Solr可以独立运行,运行...

2020-03-29 17:10:29 231

原创 全文检索基础 Lucene

Luncene是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,以此为基础在目标系统中建立起完整的全文检索引擎。全文检索:将非结构化数据中的一部分信息提取出来,重新组织,使其变得有一定结构,然后对此有一定结构的数据进行搜索,从而达到搜索相对较快的目的。这部分从非结构化数据中提取出的然后重新组织的信息...

2020-03-24 22:55:53 193

原创 SSM三大框架整合

SSM框架指的是SpringMVC(Controller层)、Spring(Service层)、Mybatis(Dao层)。其中,SpringMVC和Spring是一家,不需要整合。所以,只要】需Spring整合Mybatis即可。首先,给大家附上三大框架架构流程图如下:接下来讲述每个配置文件的配置,与上图稍有不同,效果一样1,配置Tomcat的web.xml文件...

2020-03-22 21:47:42 1369

原创 SpringMVC

springMVC是表现层框架,也就是我们常说的Controller层。一、MVC架构流程图:1,组件说明:DispatcherServlet:前端控制器用户请求到达前端控制器,它就相当于mvc模式中的c,dispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherServlet的存在降低了组件之间的耦合...

2020-03-22 11:08:52 89

原创 持久层框架Mybatis

MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。 Mybatis通过xml或注解的方式将要执行的各种statement配置起来,并通过java对象和stateme...

2020-03-21 10:32:39 922

原创 spring第二篇之AOP及其事物的管理

概念: AOP是一种面向切面编程思想,是OOP的延续。其核心思想就是:横向重复,纵向抽取。Spring AOP中的动态代理很好的体现了这种思想。如何去理解这种思想呢?如下图所示:AOP作用:不修改源码的情况下对程序进行增强。AOP可以进行权限校验、日志记录、性能监控、事务控制。Spring底层AOP实现原理:动态代理(增强一个类中方法)1,JDK动态代理(优先)被代理对...

2020-03-15 22:26:02 1134

原创 spring第一篇之ioc

Spring的核心是控制反转(ioc)和面向切面(AOP)。Spring是一个分层的JavaSE轻量级开源框架。Java开发的三层次结构:WEB层:SpringMVC (Controller)业务层:Bean管理 IOC (Service)持久层:mybatis (Dao)控制反转(IOC):对象的创建和管理交给spring,以前是自己new。作用是实现了程序的解...

2020-03-15 16:11:50 108

原创 java反射

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 我们先来说说类加载器。当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化。加载就是指将c...

2020-03-14 09:43:01 378

原创 线程第一篇

一、概念 进程:进程是指正在运行的程序。确切的说,当一个程序进入内存中运行时即变成一个进程。 线程:线程是进程中的一个执行单元,负责当前进程中程序的执行。一个进程至少有一个线程。 多线程:一个程序中多个线程同时进行。 所以,一个电脑的快慢决定于CPU和内存,因为软件都是在内存中运行的。二,程序运行原理l 分...

2020-03-11 00:11:28 111

原创 IO流的理解第二篇

上篇介绍到文件File类的一些常用方法,这篇写写java中常用的2种流(字节流、字符流)以及他们是怎么去操作文件的。实际运用当中这两种流是常常结合缓冲流、转换流 一起使用,先给大家看看这几种流间的关系。一、字节流1,字节输入流 InputStream超类 FileInputStream Buf...

2020-03-08 11:05:59 139

原创 IO流的理解第三篇 序列化与反序列化

一、概念:所谓序列化就是将对象转为字节流的过程(把对象写到指定文件中) 反序列化则是将字节流转换为对象的过程。(从文件中读取对象)作用:1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;2) 在网络上传送对象的字节序列。二、涉及场景 最常见的是Web服务器中的Session对象,当有 10万用户并发访问,就有可能出...

2020-03-07 23:31:57 170

原创 IO流的理解第一篇

IO流是对文件的读写操作,分为输入流(读文件)和输出流(写文件)。由程序往硬盘上写文件为输出流(内存——>硬盘),反之为输入流(硬盘——>内存)。说到流肯定离不开文件,那先简单说说File这个类。 常用三个构造方法:File file = new File(String pathName) ...

2020-03-07 18:31:39 109

空空如也

空空如也

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

TA关注的人

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