自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 docker安装应用

docker-compose安装、docker安装mysql、docker安装nacos、docker安装seata,并注册到nacos、docker安装rabbitmq、docker安装zipkin服务端、docker安装Redis、docker安装Redis集群、docker安装nginx

2022-10-24 17:10:24 957 1

原创 虚拟机类加载机制

双亲委派模型要求除了顶层的启动类加载器外,其余的类加载器都应有自己的父类加载器。双亲委派模型的工作过程是:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到最顶层的启动类加载器中,只有当父加载器反馈自己无法完成这个加载请求(它的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去完成加载。这样做好处就是Java中的类随着它的类加载器一起具备了一种带有优先级的层次关系。

2022-10-20 09:45:51 261

原创 JVM内存模型

Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而一直存在,有些区域则是依赖用户线程的启动和结束而建立和销毁。

2022-10-19 14:42:59 379

原创 Java线程池

构造方法名称类型含义int核心线程数数int最大线程池数long线程最大空闲时间unitTimeUnit时间单位workQueue线程等待队列线程创建工厂handler拒接策略拒绝策略拒绝行为抛出RejectedExecutionException什么也不做,直接忽略丢弃执行队列中最老的任务,尝试为当前提交的任务腾出位置直接由提交任务者执行这个任务线程池工作流程:创建多少个线程合适。

2022-10-19 14:36:42 280

原创 多线程基础

当sleep() 状态超时,join() 等待线程终止或超时,或者 I/O 处理完毕,线程重新转入就绪状态。如果就绪状态的线程获取 CPU 资源,就可以执行 run(),此时线程便处于运行状态。处于运行状态的线程最为复杂,它可以变为阻塞状态、就绪状态和死亡状态。当线程对象调用了start()方法之后,该线程就进入就绪状态。下图显示了一个线程完整的生命周期。等待阻塞:运行状态中的线程执行 wait() 方法,使线程进入到等待阻塞状态。一个运行状态的线程完成任务或者其他终止条件发生时,该线程就切换到终止状态。

2022-10-19 14:34:45 75

原创 缓存穿透、缓存击穿、缓存雪崩

某一个热点 key,在缓存过期的一瞬间,同时有大量的请求打进来集中对这一个点进行访问,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞,造成瞬时数据库请求量大、压力骤增,甚至可能打垮数据库。该方式和缓存击穿一样,按 key 维度加锁,对于同一个 key,只允许一个线程去计算,其他线程原地阻塞等待第一个线程的计算结果,然后直接走缓存即可。布隆过滤器(推荐)。如果不进行预热, 那么 Redis 初始状态数据为空,系统上线初期,对于高并发的流量,都会访问到数据库中, 对数据库造成流量的压力。

2022-10-19 10:53:44 129

原创 使用redis实现简单的QPS限流

使用redis实现简单的QPS限流。

2022-10-19 10:51:30 690

原创 spring boot集成redis缓存

因为@Cacheable 是使用AOP 代理实现的 ,通过创建内部类来代理缓存方法,这样就会导致一个问题,类内部的方法调用类内部的缓存方法不会走代理(因为方法之间的调用直接使用的是原始对象this,而非代理对象,因而内部调用不会产生代理),不会走代理,就不能正常创建缓存,所以每次都需要去调用数据库。② 把方法A和方法B放到两个不同的类里面,例如:如果两个方法都在同一个service接口里,把方法B放到另一个service里面,这样在A方法里调B方法,就可以使用B方法的缓存。1、为什么缓存没有被正常创建?

2022-10-19 10:50:38 377

原创 Redis热key和大key问题

Redis 服务端收集:Redis 提供了 monitor 命令(也有现成的分析工具,比如redis-faina),可以统计出一段时间内的某 Redis 节点上的所有命令,分析热点 key,在高并发条件下,会存在内存暴涨和 Redis 性能的隐患,所以此种方法适合在短时间内使用;在redis数据库中有些访问量特别大的数据,比如热门商品信息、热门话题等,大量的请求去访问redis上的某个特定key,会造成流量过于集中,达到物理网卡或者内存上限,从而导致服务器宕机。数据分片,比如后面加序号,进行多实例的拆分。

2022-10-19 10:49:16 1526

原创 Redis数据结构_1.字典

redis字典使用哈希表作为底层实现,一个哈希表里面可以有多个哈希表节点,而每个哈希表节点就保存了字典中的一个键值对。

2022-10-19 10:46:56 287

原创 Redis数据结构_对象

Redis用到的所有主要数据结构,简单动态字符串(SDS)、双端链表、字典、压缩列表、整数集合、跳跃表。Redis并没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统,这个系统包含字符串对象、列表对象、哈希对象、集合对象和有序集合对象这五种类型的对象,而每种对象又通过不同地编码映射到不同的底层数据结构。

2022-10-19 10:45:39 375

原创 Redis 与 MySQL 数据一致性问题

如果要保证强一致性,势必要引入分布式锁或实现其他分布式协议,不仅在实现上是有难度的,而且一定会对性能有影响。如果对数据的一致性要求这么高,那引入缓存就没有必要了。缓存系统适用的场景就是非强一致性的场景,所以它属于 CAP 中的 AP。如果T2线程在(1)处添加缓存,T1线程会在延时过后重新删除缓存,脏数据只会存在极短时间。Redis应用用在缓存场景时,能为数据库抵挡了高并发的流量请求,提高业务系统的性能。最佳实践是删除缓存,删除缓存操作简单,副作用只是增加了一次 chache miss。

2022-10-19 10:40:21 228

原创 ReentrantLock

ReentrantLock底层基于AbstractQueuedSynchronizer(AQS)实现,AQS抽象类定义了一套多线程访问共享资源的同步模板,是一个依赖状态(state)的同步器。解决了实现同步器时涉及的大量细节问题,能够极大地减少实现工作,简单的说,AQS为加锁和解锁过程提供了统一的模板函数,只有少量细节由子类自己决定。对应的设计模式就是模版模式一般通过定义内部类Sync继承AQS,将同步器所有调用都映射到Sync对应的方法;

2022-10-16 17:22:21 791

原创 RestTemplate NullPointerException异常

java.lang.NullPointerException at org.springframework.web.client.RestTemplate$AcceptHeaderRequestCallback.canReadResponse(RestTemplate.java:862)

2022-08-03 14:38:20 1969

原创 Redis数据结构_2.简单动态字符串SDS

Redis数据结构_简单动态字符串SDSRedis提供了一个逻辑上的对象系统构建了一个键值对数据库以供客户端用户使用。这个对象系统包括字符串对象,哈希对象,列表对象,集合对象,有序集合对象等。但是Redis面向内存并没有直接使用这些对象。而是使用了简单动态字符串,链表,字典(散列表),跳跃表,整数集合,压缩列表这些数据结构来操作内存。简单动态字符串SDSredis的底层使用C语言实现的,但在字符串方面确没有使用以空字符结尾的字符数组的C字符串,而是特别构建了一种叫简单动态字符串(simple dyna

2021-12-01 14:08:38 574

原创 redis持久化

redis持久化redis提供了两种不同的持久化方式:RDB(redis database)和AOF(append only file)RDBRDB是redis默认采用支持持久化的方式,通过快照(snapshotting)实现持久化触发条件当满足一定条件时,RDB将对内存中的所有数据生成快照,并存放到硬盘中,默认存放在当前执行redis服务的根目录的dump.rdb中。1.配置文件RDB相关的配置通常在redis.conf中标识有SNAPSHOTTING注释的模块下,我们可以在该配置文件中设置

2021-11-30 14:11:25 726

原创 Redis过期策略和内存淘汰策略

Redis keys过期有两种方式:被动和主动方式。当客户端尝试访问过期keys时,会检查keys是否过期,过期则删除。但是有些过期的keys,客户端永远不会去访问他们。所以,应该定时随机检查keys的过期时间具体就是Redis每秒10次做的事情:随机检查20个keys的过期时间。 删除所有已经过期的keys。 如果有多于25%的keys过期,重复步奏1.不断重复过期检测,直到过期的keys的百分比低于25%,这意味着,在任何给定的时刻,最多会清除1/4的过期keys........

2021-11-20 10:46:45 157

原创 使用Redis实现简单的分布式锁

redis的set命令可以将键key设置为指定的值,如果 key 已经保存了一个值,那么这个操作会直接覆盖原来的值,并且忽略原始类型。当set命令执行成功之后,之前设置的过期时间都将失效。从2.6.12版本开始,redis为SET命令增加了一系列选项:EX seconds – 设置键key的过期时间,单位时秒PX milliseconds – 设置键key的过期时间,单位时毫秒NX – 只有键key不存在的时候才会设置key的值XX – 只有键key存在的时候才会设置key的值...

2021-11-17 14:30:27 941

原创 Maven

Maven定义了几种依赖关系,分别是compile、test、runtime和provided:其中,默认的compile是最常用的,Maven会把这种类型的依赖直接放入classpath。test依赖表示仅在测试时使用,正常运行时并不需要。最常用的test依赖就是JUnit:runtime依赖表示编译时不需要,但运行时需要。最典型的runtime依赖是JDBC驱动,例如MySQL驱动:<dependency> <groupId>mysql</gr..

2020-11-18 09:32:05 393

转载 经典排序算法

上图是一些经典的排序算法和分类,可以分为两大类:比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。 非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。1. 冒泡排序冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序...

2020-10-25 18:40:46 105

原创 Java 集合

Java 集合

2020-10-13 16:59:50 118

原创 spring 事务管理

一个数据库事务是一个被视为单一的工作单元的操作序列。这些操作应该要么完整地执行,要么完全不执行,以确保数据完整性和一致性。事务的概念可以描述为具有以下四个关键属性说成是ACID: 原子性:事务应该当作一个单独单元的操作,这意味着整个序列操作要么是成功,要么是失败的。 一致性:这表示数据库的引用完整性的一致性,表中唯一的主键等。 隔离性:可能同时处理很多有相同的数据集的事务,每个事务应该与其他事务隔离,以防止数据损坏。 持久性:一个事务一旦完成全部操作后,这个事务的结果必须是.

2020-06-03 15:25:53 1507 2

原创 Spring Bean的初始化及加载

Spring Bean的生命周期可以表达为:Bean的定义——Bean的初始化——Bean的使用——Bean的销毁, 容器启动的时候就会预实例化单例Bean,作用域为prototype的bean则不会。例如下面这个行初始化容器的代码ApplicationContext context = new ClassPathXmlApplicationCont...

2020-05-12 16:34:51 212

原创 设计模式之单例模式

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。单例确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例/** * 饿汉模式 */public class Singleton { /** * 私有的静态自身类对象 */ private ...

2020-04-18 13:51:05 140

原创 设计模式之工厂模式

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。工厂顾名思义就是创建产品,根据产品是具体产品还是具体工厂可分为简单工厂模式和抽象工厂模式简单工厂模式该模式对对象创建管理方式最为简单,因...

2020-04-14 17:00:35 103

转载 Spring IoC 容器

IoC 容器Spring 容器是 Spring 框架的核心。容器将创建对象,把它们连接在一起,配置它们,并管理他们的整个生命周期从创建到销毁。Spring 容器使用依赖注入(DI)来管理组成一个应用程序的组件。这些对象被称为 Spring BeansIOC 容器具有依赖注入功能的容器,它可以创建对象,IOC 容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。通常new一个实...

2020-04-13 15:08:41 183

原创 6. DispatcherServlet:Spring MVC的核心 -- getHandlerAdapter()解析

上文中提到在DispatcherServlet.doDispatch()方法中

2020-04-05 15:40:50 340

原创 5. DispatcherServlet:Spring MVC的核心 -- getHandler()解析

上文中提到在DispatcherServlet.doDispatch()方法中,通过getHandler()方法获取HandlerExecutionChain对象(处理器执行链)那么接下来就讲一讲这个方法: protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exceptio...

2020-04-05 14:24:22 774 1

原创 4.DispatcherServlet:Spring MVC的核心

上文简单提到了SpringMVC容器,现在就来看一下SpringMVC的核心分发器DispatcherServlet的初始化过程以及处理请求的过程,了解这个入口Servlet的作用。# DispatcherServlet的初始化过程先来看一DispatchServlet的继承关系:HttpServletBean主要做一些初始化的工作,将web.xml中配置的参数设置到Servlet...

2020-04-01 14:21:08 446 1

原创 3 Spring和SpringMVC父子容器关系

书接上文,上文提到了一个重要的概念:Spring 是父容器, Spring MVC是子容器现在就来仔细研究一下这句话。Spring和SpringMVC作为Bean管理容器和MVC层的默认框架,已被众多WEB应用采用,而实际使用时,由于有了强大的注解功能,很多基于XML的配置方式已经被替代,但是在实际项目中,同时配置Spring和SpringMVC时会出现一些奇怪的异常,比如Bean...

2020-03-28 15:59:14 369

原创 2 为什么Spring和SpringMVC包扫描要分开?

接上文,我们发现添加spring 模块后会自动添加两个xml文件,其中applicationContext.xml是spring的配置文件,dispatcher-servlet.xml是springMVC的配置文件,我们在连个文件里面分别配置了controller的包扫描配置和其他的bean的扫描配置,那么为什么要把包分开扫描呢?原来Spring 是父容器, Spring MVC是子容器, 子...

2020-03-28 11:13:50 1158 1

原创 1 新建maven+spring+springMVC 的web项目

配置tomcat 访问浏览器http://localhost:8080/spring-learn/web项目就搭建好了

2020-03-28 09:58:05 192

原创 frontend-maven-plugin插件无法下载nodejs和npm的问题

npm clean package 报错:[ERROR] Failed to execute goal com.github.eirslett:frontend-maven-plugin:1.6:install-node-and-npm (install node and npm) on project XXX: Could not download Node.js: Could not ...

2019-10-14 17:07:21 5006

原创 spring boot+ spring security

创建spring boot 工程,加入spring security依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </depe...

2019-09-21 19:44:32 205

原创 Spring Boot 使用注解和AOP实现记录日志功能

新建一个注解:package com.springboot.annotation;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotatio...

2019-08-12 14:54:08 437

原创 Spring Boot 与Aop切面编程

Spring 框架的一个关键组件是面向切面的编程(AOP)框架。面向方面的编程需要把程序逻辑分解成不同的部分称为所谓的关注点。跨一个应用程序的多个点的功能被称为横切关注点,这些横切关注点在概念上独立于应用程序的业务逻辑。有各种各样的常见的很好的方面的例子,如日志记录、审计、声明式事务、安全性和缓存等。在 OOP 中,关键单元模块度是类,而在 AOP 中单元模块度是方面。依赖注入帮助你对应用程序...

2019-08-09 16:53:55 303

原创 Application Server was not connected before run configuration stop, reason: Unable to ping server at

跑一个很久之前的spring项目,导入项目、在IDEA中配置好Tomcat,跑起来出现错误,仔细一看,使用的是spring3.2,本地JDK为1.8,搜索一下1.8只支持spring4.X以上版本。下载JDK1.7,更换JDK环境,一跑报错:Application Server was not connected before run configuration stop, reason: U...

2019-07-30 17:30:57 1816

转载 浅析VO、DTO、DO、PO的概念、区别和用处

本篇文章主要讨论一下我们经常会用到的一些对象:VO、DTO、DO和PO。由于不同的项目和开发人员有不同的命名习惯,这里我首先对上述的概念进行一个简单描述,名字只是个标识,我们重点关注其概念:VO(View Object):视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来。DTO(Data Transfer Object):数据传输对象,这个概念来源于J2EE的设计...

2019-07-12 10:20:15 113

原创 开源项目zheng学习

在码云上找到一个开源项目,https://gitee.com/shuzheng/zheng,不明觉厉,学习一下Jdk7+ Mysql5.5+ Redis Zookeeper ActiveMQ Dubbo-admin Dubbo-monitor我的电脑上安装的是jdk11,mysql8.0.16,所以在运行的时候遇到很多问题,在此记录下来:1.该项目的数据库和redis密码使用...

2019-07-03 21:31:28 386

原创 List<Map>中按照Map中的某个key排序

public class Sort{ public static int getAge() { return (int) (Math.random() * 80); } public static String brithday() { Random r = new Random(); int random = r.ne...

2019-06-27 10:21:58 3250

空空如也

空空如也

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

TA关注的人

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