自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

耀灵的博客

学习笔记

  • 博客(61)
  • 收藏
  • 关注

原创 SpringBoot学习总结

Springboot

2022-09-23 11:26:43 321 1

原创 SpringMVC学习总结

顾名思义,@ControllerAdvice就是@Controller 的增强版。@ControllerAdvice主要用来处理全局数据,一般搭配@ExceptionHandler、@ModelAttribute以及@InitBinder使用。控制器方法会被封装为 HandlerMethod 对象,并结合匹配到的拦截器一起返回给 DispatcherServlet。例如根据 /hello 路径找到 @RequestMapping(“/hello”) 对应的控制器方法。

2022-09-22 18:40:17 374

原创 Spring学习总结

在当前版本的 Spring 和 Spring Boot 程序中,支持五种 Scope。AOP 底层实现方式之一是代理,由代理结合通知和目标,提供增强功能。ProxyFactory 用来创建代理。

2022-09-21 23:16:11 415

原创 IO多路复用Selector

单线程可以配合 Selector 完成对多个 Channel 可读写事件的监控,这称之为多路复用。多路复用仅针对网络 IO、普通文件 IO 没法利用多路复用如果不用 Selector 的非阻塞模式,线程大部分时间都在做无用功,而 Selector 能够保证有可连接事件时才去连接有可读事件才去读取有可写事件才去写入限于网络传输能力,Channel 未必时时可写,一旦 Channel 可写,会触发 Selector 的可写事件。......

2022-08-29 19:57:08 226

原创 ADS,AXD基本使用说明

首先File -> New 创建一个C文件。 编写C文件,完成后右上角点击保存。再File -> New,新建一个项目点击右键,选择Add Files将之前写的C文件添加进去。 点击画圈图标Make编译。 编译通过,没有错误,右上角关闭。 再次点击画圈图标进行Debug。 点击之后会进入AXD。 点击画圈图标。再次点击该图标运行。 输出结果,运行成功。如果点击Debug,进入不了ADX,则可以在软件根目录/Bin目录下,找到axd.exe文件,以管理员身份运行。选择Options -> Confi

2022-06-10 12:28:37 2778 1

原创 Docker

1. Docker是一个快速交付应用,运行应用的技术(1)可以将程序及其依赖、运行环境一起打包为一个镜像,可以迁移到任意Linux操作系统(2)运行时利用沙箱机制形成隔离容器,各个应用互不干扰(3)启动、移除都可以通过一行命令完成,方便快捷2. Docker和虚拟机的差异(1)docker是一个系统进程;虚拟机是在操作系统中的操作系统(2)docker体积小、启动速度快、性能好;虚拟机体积大,启动速度慢,性能一般3. Docker架构(1)镜像将应用程序及...

2022-04-16 13:51:22 1144 1

原创 Nacos注册中心

1.Nacos下载下载地址:Releases · alibaba/nacos · GitHub2.Nacos服务注册或发现(1)引入nacos-discovery依赖(2)配置nacos地址spring.cloud.nacos.server-addr3.Nacos服务分级模型(1)Nacos服务分级存储模型一级是服务 二级是集群 三级是实例(2)设置实例的集群属性修改application.yml文件,添加spring.cloud.nacos.discovery.clu

2022-04-16 11:02:35 693

原创 Redis分片集群

主从和哨兵可以解决高可用、高并发读的问题。但是依然有两个问题没有解决:海量数据存储问题 高并发写的问题使用分片集群可以解决上述问题,分片集群特征:集群中有多个master,每个master保存不同数据 每个master都可以有多个slave节点 master之间通过ping监测彼此健康状态 客户端请求可以访问集群任意节点,最终都会被转发到正确节点散列插槽Redis会把每一个master节点映射到0~16383共16384个插槽(hash slot)上,查看集群信息时就能看到。数.

2022-04-06 15:48:05 1388

原创 Redis哨兵机制

哨兵的作用Redis提供了哨兵(sentinel)机制来实现主从集群的自动故障恢复。监控:sentinel会不断检查您的master和slave是否按预期工作。 自动故障恢复:如果master故障,sentinel会将一个slave提升为master。当故障实例恢复后也以新的master为主。 通知:sentinel充当Redis客户端的服务发现来源,当集群发生故障转移时,会将最新信息推送给Redis的客户端。服务状态监控主观下线: 如果某sentinel节点发现某实例未在规定时间响应,则

2022-04-03 19:33:44 936

原创 Redis主从集群

命令:slave <masterip> <masterport>主从第一次同步是全量同步,slave重启后同步,则执行增量同步。全量同步: master将完整内存数据生成RDB,发送RDB到slave,后续命令则记录在repl_baklog,逐个发送给slave。增量同步:slave提交自己的offset到master,master获取repl_baklog中从offset之后的命令给slave。注意:repl_baklog大小有上限,写满后会覆盖最早的数据。如果

2022-04-03 19:00:41 972

原创 Redis持久化

RDB持久化RDB全称Redis Database Backup file(Redis数据备份文件),也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后,从磁盘读取快照文件,恢复数据。快照文件称为RDB文件,默认是保存在当前运行目录。命令:save:由Redis主进程来执行RDB,会阻塞所有命令。 bgsave:开启子进程执行RDB,避免主进程收到影响。Redis停机会执行一次RDBRDB原理1. bgsave开始时会fork

2022-04-03 17:27:24 706

原创 多线程设计模式之生产者/消费者

要点:不需要产生结果和消费结果的线程一一对应 消费队列可以用来平衡生产和消费的线程资源 生产者仅负责产生结果数据,不关心数据该如何处理,而消费者专心处理结果数据 消息队列是有容量限制的,满时不会再加入数据,空时不会再消耗数据 JDK中各种阻塞队列,采用的就是这种模式//消息类public class Message { private int id; private Object massage; public Message(int id, Object mas

2022-03-27 10:38:01 76

原创 多线程设计模式之保护性暂停

保护性暂停即Guarded Suspension,用在一个线程等待另一个线程的执行结果。要点:有一个结果需要从一个线程传递到另一个线程,让他们关联同一个GuardedObject JDK中,join的实现,Future的实现,采用的就是此模式 因为要等待另一方的结果,因此归类到同步模式1.带超时版GuardedObjectpublic class GuardedObject { private Object response; private final Object .

2022-03-27 10:23:51 95

原创 Java并发编程wait&notify

一、原理Monitor中的Owner线程发现条件不满足,调用wait方法,即可进入WaitSet变为WAITING状态。 BLOCKED和WAITING的线程都处于阻塞状态,不占用CPU时间片。 BLOCKED线程会在Owner线程释放锁时唤醒。 WAITING线程会在Owner线程调用notify或notifyAll时唤醒,但唤醒后并不意味着立刻获得锁,仍需进入EntryList重新竞争。二、APIobj.wait():让进入object监视器的线程到waitset等待。 obj.not

2022-03-26 23:08:32 287

原创 MySQL事务原理

实际上,我们研究事务的原理,就是研究MySQL的InnoDB引擎是如何保证事务的四大特性的。 而对于这四大特性,实际上分为两个部分。 其中的原子性、一致性、持久化,实际上是由InnoDB中的两份日志来保证的,一份是redo log日志,一份是undo log日志。 而持久性是通过数据库的锁, 加上MVCC来保证的。一、redo log重做日志,记录的是事务提交时数据页的物理修改,是用来实现事务的持久性。该日志文件由两部分组成:重做日志缓冲(redo log buffer)以及重

2022-03-26 21:09:21 3627 1

原创 MySQL的锁

MySQL中的锁,按照锁的粒度分,分为以下三类: 全局锁:锁定数据库中的所有表。 表级锁:每次操作锁住整张表。 行级锁:每次操作锁住对应的行数据。 一、全局锁全局锁就是对整个数据库实例加锁,加锁后整个实例就处于只读状态,后续的DML的写语句,DDL语句,已经更新操作的事务提交语句都将被阻塞。 其典型的使用场景是做全库的逻辑备份,对所有的表进行锁定,从而获取一致性视图,保证数据的完整性。 1. 语法(1)加全局锁flush tables with read lock .

2022-03-25 13:24:39 1321

原创 MySQL存储过程

存储过程是事先经过编译并存储在数据库中的一段 SQL 语句的集合,调用存储过程可以简化应用开发 人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的。 存储过程思想上很简单,就是数据库 SQL 语言层面的代码封装与重用。特点:封装,复用 -----------------------> 可以把某一业务SQL封装在存储过程中,需要用到的时候直接调用即可。 可以接收参数,也可以返回数据 --------> 再存储过程中,可以传递参数,也可以接收

2022-03-23 20:49:41 818

原创 Redis消息队列

Redis提供了三种不同的方式来实现消息队列:list结构:基于List结构模拟消息队列 PubSub:基本的点对点消息模型 Stream:比较完善的消息队列模型1. 基于List结构模拟消息队列LPUSH 结合 RPOP、或者 RPUSH 结合 LPOP来实现。不过要注意的是,当队列中没有消息时RPOP或LPOP操作会返回null,并不像JVM的阻塞队列那样会阻塞并等待消息。因此这里应该使用BRPOP或者BLPOP来实现阻塞效果。优点:利用Redis存储,不受限于JVM内存.

2022-03-22 14:43:27 8523

原创 Redis缓存问题

缓存更新策略1. 低一致性需求:使用Redis自带的内存淘汰机制。2. 高一致性需求:主动更新,并以超时剔除作为兜底方案。(1)读操作:①缓存命中则直接返回。② 缓存未命中则查询数据库,并写入缓存,设定超时时间。(2) 写操作:① 先写数据库,然后再删除缓存。...

2022-03-20 23:21:07 563

原创 SQL优化

插入数据1. insert优化批量插入 手动提交事务 主键顺序插入2. 大批量插入数据如果一次性需要插入大批量数据,使用insert语句插入性能较低,此时可以使用MySQL数据库提供的load指令进行插入。主键优化满足业务需求的情况下,尽量降低主键的长度。 插入数据时,尽量选择顺序插入,选择使用AUTO_INCREMENT自增主键。 尽量不使用UUID做主键或者是其他自然主键,如身份证。 业务操作时,避免对主键的修改。orderby优化根据排序字段建立合...

2022-03-18 22:18:03 646

原创 MySQL索引的使用规则和设计原则

索引的使用规则1. 最左前缀法则如果索引了多列(联合索引),要遵守最左前缀法则。最左前缀法则指的是查询从索引的最左侧开始,并且不能跳过索引中的列。如果跳过某一列,索引将部分失效(后面的字段索引失效)。 最左列的索引存在即可,与所放的位置无关。2. 范围查询联合索引中,出现范围查询(>,<),范围查询右侧的列索引失效。3. 索引列运算不要在索引列上进行运算操作,索引将失效。4. 字符串不加引号 字符串类型字段使用时,不加引号,索引将失效。5. 模糊查询 如果仅.

2022-03-17 13:33:44 1797 2

原创 SpringMVC执行流程

1.初始化阶段在web容器第一次用来DispatcherServlet的时候,会创建其对象并执行init方法。 init方法内会创建Spring Web容器,并调用容器refresh方法。 refresh过程中会创建并初始化Spring MVC中的重要组件,例如MultipartResolver,HandlerMapping,HandlerAdapter,HandlerExceptionResolver,ViewResolver等。 容器初始化后,会将上一步初始化好的重要组件,赋值给Disp..

2022-03-06 20:23:11 179

原创 Spring事务失效的几种场景及原因

1.抛出检查异常导致事务不能正确回滚原因:Spring默认只会回滚非检查异常。 解决:配置rollbackFor属性。@Transactional(rollbackFor = Exception.class)2.业务方法内自己try-catch异常导致事务不能正确回滚原因:事务通知只有捉到了目标抛出的异常,才能进行后续的回滚处理,如果目标自己处理掉异常,事务通知无法知悉。 解决1:异常原样抛出 @Transactional(rollbackFor = Except...

2022-03-06 16:42:16 792

原创 对finalize的理解

它是Object中的一个方法,子类重写它,垃圾回收时此方法会被调用,可以在其中进行一些资源释放和清理工作,但将资源释放和清理放在finalize方法中非常不友好,非常影响性能,严重时甚至会引起OOM,从java9开始就被标注为@Deprecated,不建议被使用。为什么finalize方法非常不好,非常影响性能?1. 非常不好FinalizerThread是守护线程,代码很有可能没来得及执行完,线程就结束了,造成资源没有正确释放。 异常会被吞掉,不能判断有没有在释放资源时发生错误。2.

2022-03-05 18:58:12 534

原创 JVM类加载机制

类加载过程1. 加载 通过一个类的全限定名来获取定义此类的二进制字节流。 将这个字节流所代表的的静态存储结构转化为方法区的运行时数据结构。 在内存中生成一个代表这个类的java.lang.Class的对象,作为方法区这个类的各种数据的访问入口。 加载是懒惰执行2. 链接验证:验证类是否符合Class规范,合法性,安全性检查。 准备:为static变量分配空间,设置初始值。 解析:将常量池符号引用解析为直接引用。3.初始化 初始化阶段就是执行类构造器<clinit&gt.

2022-03-05 18:32:17 429

原创 对ConcurrentHashMap的理解

ConcurrentHashMap比HashMap并发好,比HashTable效率高,因为HashTable在对数据操作的时候都会上锁。ConcurrentHashMap 在 JDK1.7 和 JDK1.8 的实现方式是不同的。JDK1.7JDK1.7 中的 ConcurrentHashMap 是segment+数组+链表的结构,即 ConcurrentHashMap 把哈希桶数组切分成小数组(Segment ),每个小数组有 n 个 HashEntry 组成。原理上来说,Concurren

2022-03-05 16:36:44 536

原创 Java中的悲观锁与乐观锁

悲观锁的代表是synchronized和Lock锁1. 其核心思想是【线程只有占有了锁,才能去操作共享变量,每次只有一个线程占锁成功,获取锁失败的线程,都得停下来等待】。2. 线程从运行到阻塞,再从阻塞到唤醒,涉及线程上下文切换,如果频繁发生,会影响性能。3. 实际上,线程在获取synchronized和Lock锁时,如果锁已被占用,都会做自适应自旋(一个忙循环),减少阻塞机会。乐观锁的代表是原子类,使用CAS来保证原子性1. 其核心思想是【无需加锁,每次只有一个线程能成功修改共.

2022-03-05 15:34:14 241

原创 Lock与synchronized

语法层面1. synchronized是关键字,源码在jvm中,用C++开发。2. Lock是接口,源码由jdk提供, 用java语言实现。3. 使用synchronized时,退出同步代码块锁会自动释放,而使用Lock时,需要手动调用unlock方法释放。功能层面1. 二者均属于悲观锁,都具备基本的互斥同步,锁重入功能。2. Lock提供了许多synchronized不具备的功能,例如:获取等待信息,公平锁,可打断,可超时,多条件变量等。3. Lock有适合不同场景的实.

2022-03-05 15:19:46 192

原创 sleep与wait的区别

共同点wait(),wait(long n)和sleep(long n)的效果都是让当前线程暂时放弃CPU的使用权,进入阻塞状态。方法归属不同1. sleep(long n)是Thread的静态方法。2. wait(),wait(long n)都是Object的成员方法,每个对象都由。醒来时机不同1. 执行sleep(long n)和wait(long n)的线程都会在等待相应毫秒后醒来。2. wait(long n)和wait()还可以被notify()或noti..

2022-03-05 15:04:51 229

原创 JVM的异常处理机制

在Java程序中显式抛出异常的操作(throw语句)都由athrow指令来实现。而在Java虚拟机中,处理异常(catch语句)不是由字节码指令来实现的(很久之前曾今使用jsr和ret指令来实现,现在已经不用了),而是采用异常表来完成。Java虚拟机会产生一个Exception table的结构,[from,to)是前闭后开的检测范围。一旦这个范围内的字节码执行出现异常,则通过type匹配异常类型,如果一致,进入target所指示行号,然后会先将异常对象存入局部变量表中。为了保证fina

2022-03-05 14:43:11 287

原创 七牛云上传,删除和下载文件(Java)

/** * 七牛云工具类 * */public class QiNiuUtils { private static final String ACCESS_KEY = "**********"; private static final String SECRET_KEY = "**********"; private static final String BUCKET = "*****";//空间名称 private static final String DOM.

2021-10-30 20:00:42 1028

原创 将查询的同一字段的数据拼接成字符串

使用GROUP_CONCAT()函数,会将同一字段的数据用“,”分隔拼接成字符串。 select GROUP_CONCAT(name) from user

2021-10-02 22:33:01 381

原创 点击form表单中的button按钮页面会自动刷新

当button按钮在form表单中,没有添加type属性时,默认为提交按钮,会自动刷新页面。两种解决办法:1.将button按钮放在form表单外面。2.添加button按钮的type属性为button。

2021-09-25 14:14:44 510

原创 表单datetime-local从前端传入到后端格式错误问题

我的前端表单为:<input type="datetime-local" name="datetime" >想存入到 @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm") @JsonFormat(pattern="yyyy-MM-dd HH:mm",timezone="GMT+8") private Date date;使用了注解后还是会报错,发现表单datetime-local传入到后端的格式为yyyy-MM

2021-09-09 15:34:02 814

原创 Springboot 重定向如何携带数据

1. 传统使用session2. 使用RedirectAttributes. (利用session原理)优点: 提供了addFlashAttribute 等方法.确保数据只能被使用一次后删除 ① 直接在Controller的参数中添加RedirectAttributes. ② addFlashAttribute会在重定向到下一个页面取出这个数据以后,将session里面的数据删除\ ③ addFlashAttribute 方法会将...

2021-09-04 15:46:10 1568

原创 Springboot跳转页面&Thymeleaf

静态页面的return默认是跳转到/static/目录下,当在pom.xml中引入了thymeleaf组件,动态跳转会覆盖默认的静态跳转,默认就会跳转到/templates/目录下,注意看两者return代码也有区别,动态有或没有html后缀都可以。如果在使用动态页面时还想跳转到/static/目录下,可以使用重定向return "redirect: "。...

2021-09-04 11:49:44 339

原创 Dubbo 学习笔记

一、dubbo 概述Apache Dubbo是一款高性能、轻量级的开源 Java RPC 框架,它提 供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和 发现。Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案、服 务治理方案。 二、基本架构服务提供者(Provider):暴露服务的服务提供方,服务提供者在启动时,向注册中心注册自己提供的服...

2021-08-30 21:25:32 116

原创 Dubbo 启动异常:java.lang.NoClassDefFoundError: org/apache/curator/framework/recipes/cache/TreeCacheListe

添加依赖 <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-recipes</artifactId> <version>5.1.0</version> </dependency>

2021-08-30 19:32:57 636

原创 SpringBoot学习笔记

一、SpringBoot 概念SpringBoot提供了一种快速使用Spring的方式,基于约定优于配置的思想,可以让开发人员不必在配置与逻 辑业务之间进行思维的切换,全身心的投入到逻辑业务的代码编写中,从而大大提高开发的效率,一定程度 上缩短了项目周期。二、SpringBoot 功能1) 自动配置 Spring Boot的自动配置是一个运行时(更准确地说,是应用程序启动时)的过程,考虑了众多因素,才决定 Spring配置应该...

2021-08-26 17:18:52 127

原创 Spring整合MyBatis

1.将SqlSessionFactory配置到Spring容器中<!--加载jdbc.properties--><context:property-placeholder location="classpath:jdbc.properties"/><!--配置数据源--><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property

2021-08-24 17:08:31 105

空空如也

空空如也

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

TA关注的人

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