自定义博客皮肤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)
  • 收藏
  • 关注

原创 SpringBoot 项目 Jar 包加密ClassFinal 介绍 ClassFinal是一款java class文件安全加密工具,支持直接加密jar包或war包,无需修改任何项目代码,兼容spri

jar包防止反编译。

2024-02-23 14:06:16 809 3

原创 Jenkins的持续集成与持续部署

访问"localhost:8080/jenkins",如果无法访问,请检查端口号是否占用,请检查Jenkins的版本与JDK的版本是否一致。Post Steps:build成功之后,运行shell脚本,在本地部署jar系统。构建触发器:当有代码提交到Gitlab上时,自动Build。源码管理:URL后面记得加XXXX.git。配置Jenkins的全局信息与安装插件。使用jar包部署项目的整体流程。

2023-05-18 14:41:02 751

原创 Java策略模式整理

意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。主要解决:在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护。何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为。如何解决:将这些算法封装成一个一个的类,任意地替换。关键代码:实现同一个接口。应用实例: 1、诸葛亮的锦囊妙计,每一个锦囊就是一个策略。2、旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略。3、JAVA AWT 中的 LayoutManager。

2023-05-11 18:27:13 729

原创 高并发场景下,缓存穿透、缓存击穿解决方案

缓存击穿指的是在一些高并发访问下,一个热点数据没有命中缓存,在将数据进行缓存的过程中,所有请求都要直接查询数据库,从而导致数据库压力过大,并且系统性能下降的现象。

2023-03-15 13:33:26 282

转载 订单超时怎么处理?我们用这种方案

订单超时怎么处理?我们用这种方案

2023-03-07 09:44:36 205

原创 Kafka的高性能设计思想

高并发设计

2023-03-03 17:33:49 135

原创 幂等性接口实现

接口幂等性实现方案

2022-12-12 10:22:19 183

原创 JVM内存模型与JMM

JVM是JAVA虚拟机,JMM是JAVA内存模型。JVM内存模型JVM内存模型主要指运行时的数据区,包括5个部分线程私有:栈也就方法栈,是线程私有的,线程在执行每个方法时都会同时创建一个栈帧,用来存储局部变量表、操作栈、动态链接、方法出口等信息。调用方法时执行入栈,方法返回时执行出栈。本地方法栈与栈类似,也是用来保存线程执行方法时的信息,不同的是,执行java方法使用栈,而执行native方法使用本地方法栈。程序计数器保存着当前线程所执行的字节码位置,每个线程工作时都有一个独立的计数器。程序计

2022-04-24 17:33:59 557

原创 Java8非空判断

假设有用户和部门两个类//部门类public class Dept{ private String deptName;}//用户类public class User{ private String userName; private Dept dept;}在这种情况下,如果要获取用户所在部门的名称,一般写法如下:user.getDept().getDeptName();这种写法,如果user为空时,会报NullPointException异常的。为避免空指针异常,我们一般会

2022-04-22 16:22:03 3981 1

转载 JDK9为何要将String的底层实现由char[]改成了byte[]

如果你不是 Java8 的钉子户,你应该早就发现了:String 类的源码已经由 char[] 优化为了 byte[] 来存储字符串内容,为什么要这样做呢?开门见山地说,从 char[] 到 byte[],最主要的目的是为了节省字符串占用的内存 。内存占用减少带来的另外一个好处,就是 GC 次数也会减少。一、为什么要优化 String 节省内存空间我们使用 jmap -histo:live pid | head -n 10 命令就可以查看到堆内对象示例的统计信息、查看 ClassLoader 的信息以

2022-04-18 18:31:33 184

原创 缓存和数据库一致性

问题分析当有数据需要更新的时候,先更新缓存还是先更新数据库?如何确保更新缓存和更新数据库这两个操作的原子性?更新缓存的时候该怎么更新?修改还是删除?缓存模型-Cache-AsideCache-Aside,中文也叫旁路缓存模式,该模式能够尽可能的解决缓存与数据库数据不一致的问题。Cache-Aside 分为读缓存和写缓存两种情况:读缓存读取数据。检查缓存中是否有需要的数据,如果命中缓存(Cache Hit),则直接返回数据。如果没有命中缓存,即 Cache Miss,那么就先去

2022-03-30 09:22:08 126

原创 Mysql索引类型

索引分类1.按功能划分普通索引就是最最基础的索引,这种索引没有任何的约束作用,它存在的主要意义就是提高查询效率。唯一性索引在普通索引的基础上增加了数据唯一性的约束,一张表中可以同时存在多个唯一性索引。主键索引在唯一性索引的基础上又增加了不为空的约束(换言之,添加了唯一性索引的字段,是可以包含 NULL 值的),即 NOT NULL+UNIQUE,一张表里最多只有一个主键索引,当然一个主键索引中可以包含多个字段(组合主建)。全文索引其实我们很少在 MySQL 中用,如果项目

2022-03-21 14:03:19 2413

原创 synchronized 和 ReentrantLock 的实现原理

两者区别synchronized 属于独占式悲观锁,是通过 JVM 隐式实现的,synchronized 只允许同一时刻只有一个线程操作资源。在 Java 中每个对象都隐式包含一个 monitor(监视器)对象,加锁的过程其实就是竞争 monitor 的过程,当线程进入字节码 monitor enter 指令之后,线程将持有 monitor 对象,执行 monitor exit 时释放 monitor 对象,当其他线程没有拿到 monitor 对象时,则需要阻塞等待获取该对象。ReentrantLoc

2022-03-15 02:45:00 610

原创 CompletableFuture使用详解

Callable和Runnable的区别@FunctionalInterfacepublic interface Runnable { //void方法没有返回值 public abstract void run();}@FunctionalInterfacepublic interface Callable<V> { //有返回值,并且能抛出异常 V call() throws Exception;}Future的主要功能public interface

2022-03-07 17:28:39 1689

原创 分布式缓存

缓存的更新缓存的数据一般都是有生命时间的,过了一段时间之后就会失效,再次访问时需要重新加载。缓存的失效是为了保证与数据源真实的数据保证一致性和缓存空间的有效利用性。下面将从使用场景、数据一致性、开发运维维护成本三个方面来介绍几种缓存的更新策略。1、LRU/LFU/FIFO这三种算法都是属于当缓存不够用时采用的更新算法。只是选出的淘汰元素的规则不一样:LRU淘汰最久没有被访问过的,LFU淘汰访问次数最少的,FIFO先进先出。一致性:要清理哪些数据是由具体的算法定的,开发人员只能选择其中的一种,一致性差

2022-02-22 23:24:19 198

原创 JAVA双亲委派机制

类加载器引导类加载器(Bootstrap ClassLoader):负责加载支撑JVM运行的位于JRE的lib目录下的核心类库,比如 rt.jar、charsets.jar等扩展类加载器(Extension ClassLoader):负责加载支撑JVM运行的位于JRE的lib目录下的ext扩展目录中的JAR 类包应用程序类加载器(Application ClassLoader):负责加载ClassPath路径下的类包,主要就是加载你自己写的那些类自定义加载器(Costom Class

2021-10-22 10:17:53 167

原创 Java单例模式整理

1.懒加载所谓懒加载,就是知道第一次被调用时才加载。public class Singleton { //volatile关键字的作用 //1.保证变量对于所有线程的可见性 //2.禁止指令重排优化 private volatile static Singleton instance; private Singleton() { } //双重检查锁 //防止synchronized同步过程中其他线程进行了实例化 public static Si

2021-08-02 13:38:12 144

原创 Linux下各软件的安装整理(持续更新)

JDK1.8//解压tar -zxvf jdk-8u291-linux-x64.tar.gz//配置环境变量vi /etc/profile//在最后加入export JAVA_HOME=/opt/soft/jdk1.8.0_291export PATH=$PATH:$JAVA_HOME/binRedis1.解压后 make2.修改配置文件 # 修改配置 15 daemonize yes #后台启动 protected‐mode no #关闭保护模式,开启的话,只有本机才可以

2021-07-12 15:45:10 170

原创 JAVA线程池

使用线程池的好处:降低资源消耗。java中所有的池化技术都有一个好处,就是通过复用池中的对象,降低系统资源消耗。设想一下如果我们有n多个子任务需要执行,如果我们为每个子任务都创建一个执行线程,而创建线程的过程是需要一定的系统消耗的,最后肯定会拖慢整个系统的处理速度。而通过线程池我们可以做到复用线程,任务有多个,但执行任务的线程可以通过线程池来复用,这样减少了创建线程的开销,系统资源利用率得到了提升。降低管理线程的难度。多线程环境下对线程的管理是最容易出现问题的,而线程池通过框架为我们降低了管

2021-06-24 11:16:52 212

原创 项目中三级缓存设计

说明缓存主要用来减少网络IO跟磁盘IO,以此来提高系统的吞吐量。接入层缓存特点:减少磁盘IO,减少网络IO技术:lua+nginx,openresty说明:需要会写lua脚本,主要就是将信息存在Nginx缓存中,如果用户请求的信息存在则直接返回。因此哪怕后台系统挂了也能返回用户数据。本地缓存特点:减少网络IO技术:谷歌的guava/cacheCacheBuilder.newBuilder() //设置本地缓存容器的初始容量 .

2021-06-22 17:11:50 619

原创 单表查询or联表查询

在实际开发中,我们不可避免的要关联几张数据表来合成最终的展示数据。

2021-06-15 11:27:25 2035 2

原创 Lombok快速上手

Lombok简介Lombok是一款Java代码功能增强库,它会自动集成到你的编辑器和构建工具中,从而使你的Java代码更加生动有趣。通过Lombok的注解,你可以不用再写getter、setter、equals等方法,Lombok将在编译时为你自动生成。Lombok集成如果你使用的是IDEA 2020.3以上的版本,则Lombok插件已经内置,无需安装。<dependency> <groupId>org.projectlombok</groupId>

2021-06-09 13:42:39 177

原创 Nacos注册中心

1.Nacos核心功能点服务注册:Nacos Client会通过发送REST请求的方式向Nacos Server注册自己的服务,提供自己的元数据,比如ip地址、端口等信息。Nacos Server接收到注册请求后,就会把元数据信息存储在一个双层的内存Map中。服务心跳:在服务注册后,Nacos Client会维护一个定时心跳来持续通知Nacos Server,说明服务一直处于可用状态,防止被剔除。默认5s发送一次心跳。服务健康检查Nacos Server会开启一个定时任务来检查注册服务实例的健

2021-05-13 16:01:27 366

原创 CentOS7下安装mysql5.7

1、下载命令:wget https://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm2、然后进行repo的安装:rpm -ivh mysql57-community-release-el7-9.noarch.rpm3、进入 /etc/yum.repos.d/目录下 cd /etc/yum.repos.d/4、进行安装yum install mysql-server5、启动mysqlsystemctl sta

2021-04-23 14:13:45 64

原创 MongoDB高可用复制集

MongoDB复制集是将数据同步在多个服务器的过程。以此来实现服务的高可用。主要提供了两个主要功能:数据写入主节点(Primary)时将数据复制到另一个副本节(Secondary)点上主节点发生故障时自动选举出一个新的替代节点一个典型的复制集由三个或三个以上具有投票权的节点组成,其中一个主节点(Primary):接 收写入操作,读操作和选举时投票,两个或多个从节点(Secondary):复制主节点上的新数据和 选举时投票。主要架构图如下:复制流程:当一个修改操作,无论是插入,更新或删除,

2021-02-20 14:15:34 148

原创 MySQL通过bin-log恢复数据

binlog是Server层实现的二进制日志,他会记录我们的crud操作。因此如果我们误删了数据库,我们可以通过binlog来进行恢复。一、首先,我们需要打开MySQL的binlog功能。(binlog默认是关闭的,需要手动打开)通过以下命令查看binlog是否开启:show variables like '%log_bin%';查询结果如下我们可以发现log_bin的状态为OFF。开启bin_log配置开启binlog2log‐bin=/usr/local/mysql/dat

2020-10-29 17:25:09 369

原创 JAVA中的并发工具类

JDK的并发包里提供了几个非常有用的并发工具类:控制并发线程数的Semaphore等待多线程完成的CountDownLatch同步屏障CyclicBarrierSemaphore1. 是什么Semaphore 字面意思是信号量的意思,它的作用是控制访问特定资源的线程数目,底层依赖AQS的状态State,是在生产当中比较常用的一个工具类。2.怎么用2.1构造方法 public Semaphore(int permits) public Semaphore(int permits, bo

2020-08-20 22:31:25 157

原创 ZooKeeper入门之数据模型

数据模型就是ZooKeeper用来存储和处理数据的一种逻辑结构。Zookeeper中的数据模型是一种树形结构,非常像电脑中的文件系统,有一个根文件夹,下面还有很多的子文件夹,比如在mac电脑中有用户文件夹,里面保存了各个用户的信息。如:/Users/zhangsan/Users/lisiZooKeeper的数据模型也具有一个固定的根节点(/),我们可以在根节点下创建子节点,并在子节点下继续创建下一级节点。我们先部署一个本地单机环境1.下载解压安装包tar -zxf zookeeper-3.4.

2020-05-12 17:06:44 166

原创 Kafka的版本号说明

Kafka版本命名比如我们在官网上下载 Kafka 时,会看到这样的版本:Scala 2.12 Scala 2.13 指的是编译Kafka源代码的Scala编译器版本号Kafka现在的版本号命名规则是3位,格式是“大版本号”+“小版本号”+“修订补丁数”。比如2.5.0,前面的2代表的是大版本号,中间的5代表的是小版本号,0表示没有打过补丁。Kafka在1.0.0版本前的命名规则是4...

2020-04-29 14:06:13 5245

原创 消息队列该如何选择

1.为什么要使用消息队列异步处理可以更快的返回结果;减少等待的时间,提升系统总体的性能。流量控制通过使用消息队列来隔离网关和后台服务,来控制流量与保护后台服务。服务解耦下游服务通过订阅主题(topic)来实现与上游服务的解耦。2.常用的消息队列RabbitMQ开发语言:Erlang优点:轻量级、开箱即用;支持非常灵活的路由配置(Exchange模块);缺点:大量的消息堆...

2020-01-20 14:40:34 221 1

原创 MYSQL优化

在MYSQL中,我们如何查看那些查询速度很慢的SQL语句呢?我们可以通过以下代码打开MYSQL的记录慢SQL的功能:set global slow_query_log='ON'; // 开启慢 SQL 日志set global slow_query_log_file='/var/lib/mysql/test-slow.log';// 记录日志地址set global long_query...

2019-09-26 16:29:05 357

原创 UDP与TCP区别

1.TCP 协议1.有连接的2.传输数据是通过三次握手来实现数据传输的可靠性3.采用的是字节流模式。2.UDP协议1.不需要建立连接2.传输数据只需要创建一个套接字发送数据报,不可靠3.采用数据报模式,每个UDP的数据报都有一个长度,该长度与数据一起发送到服务器3.如何选择如果对数据传输的可靠性有要求,通常我们选用TCP协议;如果对数据传输对可靠性要求没那么高,我们尽量使用...

2019-09-26 15:51:37 177

原创 如何在 MySQL 中对一条 SQL 语句的执行时间进行分析

查看profiling是否开启使用 profiling 命令可以了解 SQL 语句消耗资源的详细信息(每个执行步骤的开销)。命令如下:mysql> select @@profiling;0代表关闭,此时需要把profiling打开,即设置为1命令如下:mysql> set profiling = 1;执行任意一个sql语句命令如下:mysql> sho...

2019-06-28 14:58:24 391

原创 数据库分布式锁VSZookeeper分布式锁VSRedis分布式锁

redis单机版(使用Jedis实现Redis客户端)通过Maven引入Jedis开源组件,在pom.xml文件加入下面的代码: &lt;dependency&gt; &lt;groupId&gt;redis.clients&lt;/groupId&gt; &lt;artifactId&gt;jedis&lt;/artifactId&gt; &lt;ve...

2019-03-04 20:54:10 894

原创 Java代理模式整理

代理是基本的设计模式之一,它是你为了提供额外的或不同的操作,而插入的用来代替“实际”对象的对象。这些操作通常涉及与“实际”对象的通信,因此代理通常充当着“中间人”的角色。1.java代理的基本构成抽象角色:声明真实对象和代理对象的共同接口,这样在任何使用真实对象的时候都可以使用代理对象。代理角色:代理角色内部含有真实角色的引用,从而可以在任何适合操作真实对象。真实角色:即为代...

2018-08-10 17:00:06 176 1

原创 Centos7 docker+gitlab(邮箱配置) 记录

安装docker依次执行下面代码,含义分别是:安装docker启动docker服务查看docker状态(是否启动)1.yum install Docker2.service docker start3.ps -ef|grep docker如果能看到docker的启动信息,那么说明安装成功使用阿里云加速DockerDocker官方镜像网站部署在外网,因此我...

2018-08-01 16:59:43 1723

空空如也

空空如也

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

TA关注的人

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