自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

码农六子

踏实、务实、勤奋、坚持

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

原创 01、redis核心数据结构与原理

1、redis核心原理1.1、redis单线程为什么性能这么快?redis所有的数据都在内存中,所有的运算都是内存级别的运算,而且采用单线程避免了多线程的cpu切换引起的性能消耗。 redis是单线程的,因此部分耗时命令需要谨慎使用,比如keys,这些命令的使用有可能导致redis卡顿。 1.2、redis单线程如何处理那么多的并发客户端链接?redis的IO多路复用:redis利用epoll来实现多路复用,将连接信息和事件放到队列中,依次放到文件事件分派器中,事件分派器分发给事件处理器。

2022-03-20 22:35:39 1362

原创 2170:使数组变成交替数组的最少操作数

2170:使数组变成交替数组的最少操作数2170. 使数组变成交替数组的最少操作数题目描述给你一个下标从 0 开始的数组 nums ,该数组由 n 个正整数组成。如果满足下述条件,则数组 nums 是一个 交替数组 :nums[i - 2] == nums[i] ,其中 2 <= i <= n - 1 。nums[i - 1] != nums[i] ,其中 1 <= i <= n - 1 。在一步 操作 中,你可以选择下标 i 并将 nums[i] 更改 为 任一 正

2022-03-15 22:53:43 1455

原创 Spring 自定义注解后,如何获取添加了该注解的所有类?终极解答

1、问题需求 通常在业务开发时,我们可能会用到自定义注解(自定义注解的使用和解析,本章暂不介绍)。在使用自定义注解后,我们需要获取使用了该注解的所有类,然后做一个验证。那么、问题来了,我们如何获取被某注解标注的所有类呢?请欣赏下文:2、具体实现2.1、定义两个注解@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)@Documentedpublic @interface RespMegTypeSup {...

2020-11-08 21:47:01 7279

原创 redis缓存设计与性能优化

1、多级缓存架构2、缓存设计2.1、缓存穿透 缓存穿透是指查询一个根本不存在的数据, 缓存层和存储层都不会命中, 通常出于容错的考虑, 如果从存储层查不到数据则不写入缓存层。 缓存穿透将导致不存在的数据每次请求都要到存储层去查询, 失去了缓存保护后端存储的意义。 造成缓存穿透的基本原因有两个:自身业务代码或者数据出现问题。 一些恶意攻击、 爬虫等造成大量空命中。缓存穿透问题解决方案1)、缓存空对象String get(String key) ...

2020-09-08 14:53:17 491

原创 Redis缓存高可用集群基本原理和环境搭建

1、Redis集群方案比较1.1、哨兵模式 在redis3.0以前的版本要实现集群一般是借助哨兵sentinel工具来监控master节点的状态,如果master节点异常,则会做主从切换,将某一台slave作为master,哨兵的配置略微复杂,并且性能和高可用性等各方面表现一般,特别是在主从切换的瞬间存在访问瞬断的情况,而且哨兵模式只有一个主节点对外提供服务,没法支持很高的并发,且单个主节点内存也不宜设置得过大,否则会导致持久化文件过大,影响数据恢复或主从同步的效率。1.2、高可用...

2020-09-08 14:36:00 491

原创 redis核心数据结构与原理

1、redis核心原理1.1、redis单线程为什么性能这么快? redis所有的数据都在内存中,所有的运算都是内存级别的运算,而且采用单线程避免了多线程的cpu切换引起的性能消耗。 redis是单线程的,因此部分耗时命令需要谨慎使用,比如keys,这些命令的使用有可能导致redis卡顿。1.2、redis单线程如何处理那么多的并发客户端链接? redis的IO多路复用:redis利用epoll来实现多路复用,将连接信息和事件放到队列中,依次放到文件事件分派器中,事...

2020-09-08 14:17:28 465 2

原创 Java多线程-任务拆分框架Future和ForkJoin原理分析

1、任务性质类型1.1、CPU密集型(CPU-bound) CPU密集型也叫计算密集型,指的是系统的硬盘、内存性能相对CPU要好很多,此时,系统运作大部分的状况是CPU Loading 100%,CPU要读/写I/O(硬盘/内存),I/O在很短的时间就可以完成,而CPU还有许多运算要处理,CPU Loading很高。 在多重程序系统中,大部份时间用来做计算、逻辑判断等CPU动作的程序称之CPUbound。例如一个计算圆周率至小数点一千位以下的程序,在执行的过程当中绝大部份时间用...

2020-09-08 11:42:17 1310

原创 Java多线程之Executor线程池原理

1、线程池 “线程池”,顾名思义就是一个线程缓存,线程是稀缺资源,如果被无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,因此Java中提供线程池对线程进行统一分配、调优和监控。1.1、线程池介绍 在web开发中,服务器需要接受并处理请求,所以会为一个请求来分配一个线程来进行处理。如果每次请求都新创建一个线程的话实现起来非常简便,但是存在一个问题:如果并发的请求数量非常多,但每个线程执行的时间很短,这样就会频繁的创建和销毁线程,如此一来会大大降低系统的效率。可能出现服务器在...

2020-09-08 11:32:52 107

原创 Java并发包JUC中Atomic和Unsafe详解

1、原子操作原子(atom)本意是“不能被进一步分割的最小粒子”,而原子操作(atomicoperation)意为”不可被中断的一个或一系列操作”。在多处理器上实现原子操作就变得有点复杂。本文让我们一起来聊一聊在Inter处理器和Java里是如何实现原子操作的。缓存行:Cache line 比较并交换:Compare and Swap CPU流水线:CPU pipeline 内存顺序冲突:Memory order violation2、处理器如何实现原子操作 32位IA-3...

2020-09-08 11:23:11 332

原创 Java多线程中synchronized、Lock、AQS详解

1、设计同步器的意义 多线程编程中,有可能会出现多个线程同时访问同一个共享、可变资源的情况,这个资源我们称之其为临界资源;这种资源可能是:对象、变量、文件等。共享:资源可以由多个线程同时访问可变:资源可以在其生命周期内被修改2、引出的问题 由于线程执行的过程是不可控的,所以需要采用同步机制来协同对对象可变状态的访问。3、怎么解决线程并发问题 所有的并发模式在解决线程安全问题时,采用的方案都是序列化访问临界资源。即在同一时刻,只能有一个线程...

2020-09-08 11:12:49 509

原创 Java线程模型JMM和volatile关键字原理分析

1、什么是JMM线程模型 Java内存模型(Java Memory Model简称JMM)是一种抽象的概念,并不真实存在,它描述的是一组规则或规范,通过这组规范定义了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式。JVM运行程序的实体是线程,而每个线程创建时JVM都会为其创建一个工作内存(有些地方称为栈空间),用于存储线程私有的数据,而Java内存模型中规定所有变量都存储在主内存,主内存是共享内存区域,所有线程都可以访问,但线程对变量的操作(读取赋值等)必须在工作内存中...

2020-09-08 10:56:40 176

原创 Java多线程、深入CPU级别原理分析

1、现代计算机理论模型与工作方式 现代计算机理论模型是基于冯-诺依曼计算机模型为基础的。 计算机在运行时,先从内存中取出第一条指令,通过控制器的译码,按照指令的要求,从存储器中取出数据进行指定的运算和逻辑操作等,然后再按照地址将结果送到内存中存储。接下来再取出第二条指令,在控制器的指挥下完成响应操作。以此重复,直至所有的指令都执行完毕。 程序和指令一样存储,按照程序编排顺序,一步步的取出指令,自动地完成指令规定的操作是计算机最基本的工作模型。这一原理最初是由美籍匈牙利数学家冯....

2020-09-08 10:41:21 1273

原创 设计模式(13):观察者模式

1、定义 当对象间存在一对多的映射关系时,为了检测某个对象的改变,能够及时通知所依赖这个对象的所有对象都做响应的修改,这种模式被称为观察者模式。2、优点观察者和被观察者是抽象耦合的,不存在强依赖关系。 建立起一种一触即发的机制,当被观察对象发生改变时,能够及时被发现,并做相应修改。3、缺点如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。 如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。 观..

2020-06-17 11:48:04 160

原创 设计模式(12):迭代器模式

1、定义 迭代器模式是提供一种顺序访问集合对象元素的方式,使用者不需要知道集合对象的底层描述。提供了一种新的集合对象访问方式。 迭代器模式属于行为模式。2、有点支持以不同的方式遍历一个聚合对象。 迭代器简化了聚合类。 在同一个聚合上可以有多个遍历。 在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。3、缺点 由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。...

2020-06-17 11:44:52 137

原创 设计模式(11):解释器模式

1、定义 给定一个语言,定义一个文法的一种表示, 并定义一个解释器, 这个解释器使用该表示来解释语言中的句子。 如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子,这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。  就比如正则表达式,它就是解释器模型的一种应用,解释器为正则表达式定义了一个文法,如何表示一个特定的正则表达式,以及如何解释这个正则表达式。2、使用场景2.1、当有一个语言需要解释执行,并且你可将该...

2020-06-16 21:29:48 180

原创 设计模式(10):代理模式

1、定义 当我们不想对象被直接访问时,为某个对象提供一种代理来控制这个对象的访问,比如系统某些命令,我们不希望用户直接执行,而是提供一种代理,由代理对象来执行,以确保系统安全,这种模式被称为代理模式。代理模式属于结构型模式。2、优缺点2.1、优点职责清晰 高扩展性 智能化2.2、缺点由于中间增加了代理对象,逻辑处理、请求响应可能耗时增加。 实现代理模式可能需要额外的工作,增加系统复杂度。3、使用场景远程代理 虚拟代理 保护代理 缓存代理 。。。。4、注意事项..

2020-06-16 21:25:34 140

原创 JVM(04):常见的内存分析工具使用

1、JConsole JConsole(Java Monitoring and Management Console)是一个基于JMX的可视化监视、管理工具。它管理部分的功能是针对JMX MBean进行管理,由于MBean可以使用代码、中间件服务器的管理控制台或者所有符合JMX规范的软件进行访问。1.1、JConsole启动 JConsole是jdk bin目下下的指令,可以在bin目录下直接运行JConsole.exe打开。可以在本地进程中选择一个进程进行监控,也可以选择连接远程服...

2020-06-09 21:54:58 196

原创 JVM(03):JVM常见内存监控、性能调优等命令详解

1、jps:JVM Process Status Tool: 显示指定系统内所有的HotSpot虚拟机进程。1.1、命令格式: jps [ options ] [ hostid ] 比如:jps1.2、options 选项说明1.2.1、-q:只输出LVMID,省略主类的名称1.2.2、-m:输出虚拟机进程启动时传递给主类main()函数的参数1.2.3、-l:输出主类的全名,如果进程执行的是jar包,输出jar包路径1....

2020-06-09 21:49:30 408

原创 JVM(02):垃圾回收和内存分配策略

一、内存分配与回收策略 对象的内存分配,可以理解为在堆内存上分配内存空间,有时候也会经过JIT编译后被拆散成标量类型,分配在栈内存中。这里主要介绍堆内存的分配。 对象一般会被分配在新生代的Eden区,有些对象也会被直接分配在老年代,这主要看相关细节设置。1、对象优先被分配在Eden区 对象首先会被在Eden区进行内存分配,如果Eden区空间不足,则会进行一次Minor GC,然后将剩下的对象转移到Survivor区,如果Survivor区的空间不能够放下Eden区进过GC后...

2020-05-31 21:58:45 301

原创 设计模式09:责任链模式

一、定义 责任链是一种行为模式。将处理请求的多个环节连在一起,形成一条链。当请求的对象进入链条时,流过某个模块,某个模块就处理自身的逻辑,处理完成之后,将处理后的对象在交由下一个环节处理。以此来实现各个业务模块之间的解耦。二、优缺点1、优点降低耦合度,将请求的发送者与各个部分的处理逻辑进行解耦。 简化对象,兑现不需要知道链的结构,也不需要知道自己在链的那个环节,顺着链一直传...

2020-05-08 11:13:28 687

原创 基于SpringBoot AOP和注解,优雅的实现系统操作日志异步记录

一、背景 最近接手一个新的项目,做了两个多月的修修补补,简直无语到哭。总结起来有一下几点:日志打印:每个类中都定义了操作日志入库的方法,每个方法中都同步将操作日志记录入库。有时候一个简单的一行调用service接口的controller代码,加上操作日志入库的代码,竟然多了十几行代码(我就想知道,你们以前是按代码行数算钱的吗)。更重要的是没有一行注释,同步执行入库操作,他不增加耗时吗...

2020-03-26 23:01:23 1795

原创 一文搞懂Spring Boot集成Swagger2,以及Swagger常用注解说明和错误处理

一、背景 我们在做前后端项目过程中,经常需要需要与前端同事对接,提供接口文档。最开始我们采用word文件的方式,在里边编写api 地址、参数、请求类型、请求和响应示例等。每次开发完一个接口,还需要编写接口规范文档,想想都觉得可怕。有些人可能觉得不可思议,但是确实存在。好多传统的软件项目,在不同团队、不同公司之间依然采用此种方式。 Swagger作为一款侵入式的接口文档生成插件,...

2020-03-25 22:53:20 1059

原创 SpringBoot 上传文件报:The temporary upload location [/tmp/tomcat.6875675860276346401.9001/work/Tomcat/loc

一、问题: SpringBoot 上传文件时报:Failed to parse multipart servlet request; nested exception is java.io.IOException: The temporary upload location [/tmp/tomcat.6875675860276346401.9001/work/Tomcat/loc...

2020-03-15 17:59:25 1828

原创 Spring 5.1.x 源码学习:01-源码编译和入门使用

一、源码编译1、基础环境JDK:1.8.0_202 具体环境变量配置方式自己搜索。 gradle:4.9 idea:2019.3.3 系统:window 10 以上环境安装及配置自己百度解决,此处不再补充。主要讲解Spring 5.1.x源码编译可使用。2、下载Spring Framework 5.1.x 源码 首先,我们从github 上下载Spring ...

2020-02-22 16:39:33 1035

原创 如何快速解决Spring 源码5.1.x 编译慢或read time的问题

我们在学习Spring源码的时候,首先要将Spring源码在本地编译并运行。这样才能更好的体会其中的深奥。众所周知,国外大部分网站在国内是被和谐的,因此我们在编译Spring源码的时候经常回因为超时而导致失败。 我在编译Spring源码经常因为Read time 而失败。纠结了一早上,各种博客论坛找方法,还是失败。后来抱着试试的心态,将Spring源码中默认的maven仓库地址换...

2020-02-21 23:14:59 3182

原创 设计模式初级:06-原型模式

一、定义 原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的...

2020-01-28 22:50:53 91

原创 设计模式初级:05-建造者模式

、定义 使用简单的对象一步步的构建复杂对象。该设计模式属于创建型设计模式。 利用一个Builder类来一步一步的创建最终对象。该Builder类是独立于其他对象的。2、详细介绍意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。 解决问题:主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由...

2020-01-28 22:47:38 85

原创 设计模式初级:04-单例模式

1、定义 创建型模式,提供一种创建对象的方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,并保证只有单个对象被创建,同时提供一个获取该对象的方法。1.1、条件单例只能有一个对象。 单例必须自己创建自己的唯一实例。 单例必须给所有其他对象提供这一实例使用。2、详细介绍意图:保证一个类仅有一个实例,并提供该类的全局使用方式。 解决的问题:公共的类提供全局使用方式,...

2020-01-28 22:35:19 107

原创 设计模式初级:03-抽象工厂模式

一、定义 抽象工厂模式是利用一个超级工厂来创建其他工厂。该设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在抽象工厂模式中,接口是负责创建一个生成别的对象的工厂,而不是生产指定的类。每个生成对象的工厂都按照工厂模式提供对象。二、详细介绍意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 解决问题:主要解决接口选择的问题。 使用场景:...

2020-01-28 22:31:08 101

原创 设计模式初级:02-工厂模式

一、定义 工厂模式是一种创建型模式。他提供一种常见对象的方式。通过一个公共的接口来提供给使用者,使其获取对象的引用,隐藏了对象的具体创建过程。二、详细介绍1、意图 创建一个创建对象的工厂,让使用者来决定去实例化哪一个工厂类,工厂模式使其创建过程延迟到子类中进行。2、解决问题 主要解决接口适配选择的问题。当不同的条件下使用不同的实现类时。比如画图:当画圆时使...

2020-01-19 21:06:53 94

原创 设计模式初级:01-设计模式简介

一、概括 设计模式是一种软件开发人员在面向对象开发过程中遇到一般常见问题的解决方案。是经过众多开发人员,在长期的开发过程中对问题的尝试与总结的一种经验。可以帮助开发者很快的找到一种扩展方便、维护简单的一种通用的软件设计模式。 使用设计模式,能够提高代码的复用性、可读性、易扩展,同时还能提高代码的可靠性。二、设计模式分类 根据设计模式的参考书Design Patt...

2020-01-18 16:31:12 106

原创 分布式系统主键生成策略-雪花算法

1、常见主键生成策略 一般对于系统的实体类主键,我们一般采用如下两种策略:int 变量自增:采用数据库自增功能,id采用整数类型进行自增。 字符串 UUID:采用UUID生成工具可生成随机字符串。2、问题int类型的主键:该方式生成的主键一般是连续的数字,主键有一定的顺序,可排序。但是在进行数据迁移时,很容易产生主键冲突。 UUID:这种方式可以有效避免在数据迁移时因为主键...

2019-12-11 19:54:17 1599

原创 SpringBoot 上传文件报错问题记录: The temporary upload location [D:\springboot\upload] is not valid

SpringBoot上传文件时报 java.io.IOException: The temporary upload location [D:\springboot\upload] is not valid错误,1、问题定位: 当application.properties文件中设置了 spring.servlet.multipart.location 参数时,SpringBo...

2019-12-03 18:51:21 661

原创 完美解决 - 如何将一个项目打包到本地maven库,然后供另一个项目中引用。

1、说明前几天本人想构建一个公共模块代码,比如校验,字符串处理等公共模块代码。需要在别的项目中引入。然后使用idea安装到本地maven库中后,在另一个项目中引入一直报错。踩过各种坑之后,特意整理一下过程。以后需要开发公共模块,或者自己实现公共工具类时,可按照该文档实现本地maven库安装和pom引入。2、首先新建一个公共模块的类库项目 如下图:3、将项目开...

2019-11-10 23:26:59 10733 2

原创 《JVM虚拟机》-Java内存区域和对象访问详解

一、Java运行时数据区域 Java虚拟机在执行Java程序的过程中会将它所管理的内存区域划分为一下几个区域:1、程序计数器 程序计数器是一块较小的内存空寂按,可以看作是当前线程的字节码的行号指示器。在虚拟机的概念模型中(不同虚拟机有不同的实现方式),字节码解释器就是通过改变程序计数器的值来选取下一条需要执行的字节码指令。 在多线程中,每个单独的线程都有自己独...

2019-08-20 20:17:52 105

原创 Redis 集群环境安装(详细步骤)

1、基础环境信息系统环境为:Windows 在Windows环境中安装VMware中安装3台centos 7 xshell,访问centos 7 系统 centos 环境需要安装gcc-c++,否则redis编译不过。yum install gcc-c++2、主机信息主机名 ip 端口 CentOS7_01 192.168.8.167 6001 6...

2019-08-05 16:25:00 489

原创 CentOS7环境下Redis 介绍、安装,带shell脚本

一、Redis 快速入门1、简介Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。Redis 与其他 key - value 缓存产品有以下三个特点:Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构...

2019-07-17 21:06:25 391

原创 Linux 系统基本结构

一、Linux 硬件资源管理1、查看系统PCI设备 : lspci:列出系统设备 lspci -v :列出设备详细信息2、查看CPU信息 more /proc/cpuinfoprocessor是逻辑处理器的唯一标示 vendor_id:标示处理器类型,GenuineIntel标示 intel physical id:标示每个物理封装的唯一标示。...

2019-05-22 22:04:34 461

原创 Linux安装JDK1.8完整步骤

1、检查一下系统中的jdk版本[root@localhost software]# java -version显示:openjdk version "1.8.0_102" OpenJDK Runtime Environment (build 1.8.0_102-b14) OpenJDK 64-Bit Server VM (build 25.102-b14, mixed mode...

2019-03-24 22:04:01 65174 4

原创 Java 验证IP合法性,获取Request请求源的Ip地址

1、前言         有时候我们需要在服务多记录请求用的的IP地址等相关信息,从而来做一些事情,比如:过滤、拦截等。         下边直接贴源码:2、通过request获取ip地址public static String getIpAddr(HttpServletRequest request) { String ip = request.getHeade...

2018-07-18 10:39:48 3970

空空如也

空空如也

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

TA关注的人

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