- 博客(74)
- 资源 (4)
- 收藏
- 关注
原创 centos安装rocketmq
rocketmq.config.namesrvAddr NameServer地址。设置-Xms256m -Xmx256m -Xmn200m(根据服务器内存大小设置)查看nohup.out文件,若如下图,则NameServer启动成功。设置-Xms256m -Xmx256m(根据服务器内存大小设置),下载完成之后通过ftp工具上传到云服务器。,下载完成之后通过ftp工具上传到云服务器。前提,已安装Java运行环境。访问ip:server.port。esc :wq 保存退出。如未安装Java环境。
2023-03-04 01:45:46
1993
1
原创 Java Socket聊天室
Socket聊天室1 创建登录判断类UserLogin2 创建登录服务器LoginServer3 创建聊天服务器ChatServer4 创建客户端Client5 创建服务器用于处理聊天的线程类ChatThread6 创建客户端Client用于发送消息的线程类WriteThread7 创建客户端Client用于接收消息的线程类ReadThread8 测试8.1 登录8.2 群聊8.2 单聊1 创建登录判断类UserLoginimport java.util.HashSet;import java.uti
2022-05-24 17:38:48
1629
原创 canal+rabbitmq解决mysql与redis缓存数据一致性问题
文章目录1 mysql1.1 开启 MySQL的binlog1.2 重启mysql1.3 查看binlog是否已被开启1.4 修改密码策略1.5 新建canal用户并授权2 rabbitmq2.1 拉取rabbitmq镜像2.2 运行rabbitmq镜像2.3 进入Rabbitmq Management3 canal3.1 下载canal3.2 创建解压目录并解压3.3 修改配置文件3.3.1 conf/canal.properties3.3.2 conf/example/instance.properti
2022-05-02 03:28:26
5462
3
原创 Spring Boot使用Redisson分布式锁解决缓存击穿问题
文章目录1 什么是缓存击穿2 为什么要使用分布式锁3 什么是Redisson4 Spring Boot集成Redisson4.1 添加maven依赖4.2 配置yml4.3 配置RedissonConfig5 使用Redisson的分布式锁解决缓存击穿1 什么是缓存击穿一份热点数据,它的访问量非常大。在其缓存失效的瞬间,大量请求直达存储层,导致服务崩溃。2 为什么要使用分布式锁在项目中,当共享资源出现竞争情况的时候,为了防止出现并发问题,我们一般会采用锁机制来控制。在单机环境下,可以使用synchr
2022-04-15 22:49:28
3347
2
原创 Spring Boot集成Redisson布隆过滤器解决redis缓存穿透问题
文章目录1 什么是布隆过滤器2 布隆过滤器的作用3 布隆过滤器的基本原理4 在Spring Boot中集成Redisson实现布隆过滤器4.1 添加maven依赖4.2 配置yml4.3 配置RedissonConfig4.4 工具类BloomFilterUtil4.5 编写service实现层1 什么是布隆过滤器介绍布隆过滤器之前,先介绍一下哈希函数,我们在Java中的HashMap,HashSet也接触过hashcode()这个函数。哈希函数指将哈希表中元素的关键键值通过一定的函数关系映射为元素
2022-04-14 13:48:00
4035
9
原创 Spring Boot整合Redis实现缓存
文章目录1 添加maven依赖2 yml配置文件3 配置RedisConfig4 相关注解介绍4.1 @Cacheable4.2 @CachePut4.3 @CacheEvict5 编写service实现层1 添加maven依赖 <!--redis--><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data
2022-04-13 17:02:36
1749
原创 缓存穿透、缓存击穿、缓存雪崩
文章目录1 缓存穿透问题描述解决方案2 缓存击穿问题描述解决方案3缓存雪崩问题描述解决方案1 缓存穿透问题描述客户端查询缓存和数据库中均不存在的数据,使得请求直达存储层,导致其负载过大,甚至宕机。出现这种情况的原因,可能是业务层误将缓存和库中的数据删除了,也可能是有人恶意攻击,专门访问库中不存在的数据。解决方案缓存空对象:存储层未命中后,仍然将空值存入缓存层,客户端再次访问数据时,缓存层会直接返回空值。布隆过滤器:将数据存入布隆过滤器,访问缓存之前以过滤器拦截,若请求的数据不存在则直接返回空值
2022-04-12 22:19:11
701
原创 Docker从零基础入门到使用
文章目录1 什么是Docker2 使用Docker的优点3 Docker的应用场景4 Docker 架构5 Docker中的基本概念镜像(Image)容器(Container)仓库(Repository)6 在Centos中安装Docker方式一 :存储库安装(推荐)方式二:使用便捷脚本安装7 Docker使用示例(Docker安装mysql5.7)1 什么是Docker百度百科:Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 L
2022-04-12 15:58:33
1385
原创 正则表达式
比如ab(cd)(gh)\1\2,这里的\1就表示"cd",\2就表示"gh",ab(cd)(gh)\1\2等同于abcdghcdgh。如果我们要把搜索到的指定字符串按规则替换,比如各加一个"[]",这个时候,使用replaceAll()的时候,我们传入的第二个参数可以使用$1,$2等来反向引用匹配到的子串。未引入次数之前,我们匹配几个字符就得在正则表达式中重复写几次,例如匹配5个数字,之前是"\d\d\d\d\d",引入次数之后可以写为"\d{5}"单个空白字符,如单个空格或回车(\n)或制表(\t),
2022-04-09 16:38:56
1120
原创 Cron表达式
1 什么是Cron表达式Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式:Seconds Minutes Hours DayofMonth Month DayofWeek Year Seconds Minutes Hours DayofMonth Month DayofWeek2 域取值3 特殊字符4 取值示例...
2022-04-08 16:09:27
311
原创 Java实现定时任务
文章目录1 使用java.util.Timer2 使用ScheduledExecutorService3 使用Spring Task1 使用java.util.Timer这种方式的定时任务主要用到两个类,Timer 和 TimerTask,使用起来比较简单。其中 Timer 负责设定 TimerTask 的起始与间隔执行时间。 TimerTask是一个抽象类,new的时候实现自己的 run 方法,然后将其丢给 Timer 去执行即可。代码示例:import java.time.LocalDateTi
2022-04-08 15:40:47
29125
原创 深入理解JVM(六)JVM调优
文章目录1 调优原则2 何时进行JVM调优3 JVM调优的步骤4 JVM命令5 可视化故障处理工具6 JVM参数解析及调优1 调优原则大多数的Java应用不需要进行JVM调优,一般项目加个xms和xmx参数就够了,JVM调优不是常规手段,性能问题一般第一选择是优化代码,最后的选择才是进行JVM调优,JVM优化是最后不得已的手段。2 何时进行JVM调优Heap内存(老年代)持续上涨达到设置的最大内存值Full GC 次数频繁GC 停顿时间过长(超过1秒)应用出现OutOfMemory 等内存异
2022-04-06 00:59:40
823
原创 深入理解JVM(五)垃圾收集器
文章目录1 概念补充1.1 单线程与多线程1.2 串行、并发和并行1.3 吞吐量1.4 client模式与server模式2 经典垃圾收集器2.1 Serial与Serial Old收集器2.2 ParNew收集器2.3 Parallel Scavenge 和 Parallel Old收集器2.4 CMS收集器2.5 Garbage First(G1)收集器2.5.1 G1新生代垃圾回收2.5.2 G1老年代垃圾回收2.5.3 G1回收失败时的Full GC3 各个垃圾收集器比较如果说收集算法是内存回收
2022-04-03 21:17:06
655
原创 深入理解JVM(四)JVM的垃圾回收机制
文章目录1 什么是垃圾回收机制2 Java中的引用类型3 如何判断对象是否可以被回收4 方法区的垃圾收集5 垃圾收集算法5.1 标记-清除(Mark-Sweep)算法5.2 标记整理(Mark-Compact)算法5.3 复制算法5.4 分代收集算法6 内存分配与回收策略6.1 内存分配策略6.1.1 内存分配6.1.2 堆的年轻代为什么要有两个Survivor区6.2 内存回收策略6.2.1 Minor GC 、Major GC、Mixed GC和 Full GC的区别6.2.2 Minor GC触发条件
2022-04-01 21:07:30
1328
2
原创 深入理解JVM(三)Java 类加载机制
文章目录1 什么是类加载机制2 类的生命周期2.1 加载2.2 验证2.3 准备2.4 解析2.5 初始化2.5.1 < clinit >()方法详解2.5.2 类在什么情况下会进行初始化2.6 使用2.7 卸载3 类加载器3.1 什么是类加载器3.2 类的唯一性3.3 类加载的方式3.4 JVM有哪些类加载器3.5 类加载器间的关系3.6 双亲委派模型3.6.1 双亲委派模型的工作过程3.6.2 为什么要设计双亲委派模型3.6.3 可以打破JVM双亲委派模型吗3.6.4 如何自定义自己的类加载
2022-04-01 14:37:08
1297
原创 深入理解JVM(二)运行时数据区域
文章目录1 什么是运行时数据区域2 运行时数据区域2.1 程序计数器(Program Counter Register)2.2 虚拟机栈(Java Virtual Machine Stack)2.3 本地方法栈(Native Method Stacks)2.4 Java堆(Java Heap)2.5 方法区(Method Area)1 什么是运行时数据区域JVM在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,JVM所管理的内存包括以下几个运行时数据区域:2 运行时数据区域2
2022-03-31 20:59:51
1228
原创 深入理解JVM(一)字节码详解
文章目录1 什么是字节码文件2 class文件结构2.1 魔数(magic)2.2 次版本号(minor_version)和主版本号(major_version)2.3 常量池2.3.1 常量池容量计数器(constant_pool_count)2.3.2 常量表集合constant_pool[constant_pool_count-1]2.4 访问标志(access_flags)2.5 类索引(this_class)和父类索引(super_class)2.6 接口索引集合2.6.1 接口计数器(inter
2022-03-26 18:19:35
1447
原创 Mybatis Plus实现逻辑删除
文章目录1、什么是逻辑删除2、使用说明:3、如何使用Mybatis Plus实现逻辑删除4、测试1、什么是逻辑删除逻辑删除是名义上的删除,就是对要要删除的数据打上一个删除标记,在逻辑上数据是被删除的,但数据本身依然存在,可通过修改删除标记来恢复数据。2、使用说明:只对自动注入的 sql 起效,自己在mapper.xml中写的sql不生效:插入: 不作限制查找: 追加 where 条件过滤掉已删除数据更新: 追加 where 条件防止更新到已删除数据删除: 转变为更新3、如何使用Myba
2022-03-22 20:31:43
12690
原创 如何安全的存储用户密码
文章目录1、明文存储(极不推荐)2、使用MD5或其它算法哈希后存储(较不推荐)3、加盐后哈希存储(较推荐)4、使用BCrypt算法加密后存储(非常推荐)5、Spring Boot中使用jbcrypt对明文进行加密1、明文存储(极不推荐)这种设计思路非常简单,但是缺陷也非常明显,数据库一旦泄露,那么所有用户名和密码都会泄露,后果非常严重。2、使用MD5或其它算法哈希后存储(较不推荐)MD5算法的原理可简要的叙述为:MD5码以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经
2022-03-20 23:08:19
7192
原创 Spring Boot集成七牛云对象存储oss
文章目录1、什么是对象存储服务2、七牛云对象存储 Kodo 概述3、配置七牛云并进行测试4、Spring Boot集成七牛云1、什么是对象存储服务对象存储服务(Object Storage Service)是用来描述解决和处理离散单元的方法的通用术语,这些离散单元被称作为对象。就像文件一样,对象包含数据,但是和文件不同的是,对象在一个层结构中不会再有层级结构。每个对象都在一个被称作存储池的扁平地址空间的同一级别里,一个对象不会属于另一个对象的下一级。2、七牛云对象存储 Kodo 概述七牛云对象存
2022-03-20 16:13:48
2850
5
原创 Redis哨兵集群搭建
文章目录1 为什么要使用哨兵模式2 哨兵模式的工作原理3 一主二从三哨兵搭建步骤4 测试该哨兵集群是否可用5 Spring Boot连接Redis哨兵集群1 为什么要使用哨兵模式主从模式下,主机会自动将数据同步到从机,为了分载Master的读操作压力,Slave服务器可以为客户端提供只读操作的服务,写服务依然必须由Master来完成,实现读写分离。当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费事费力,还会造成一段时间内服务不可用。2 哨兵模式的工作原理在主从模式下
2022-03-19 01:07:22
6273
原创 centos安装redis
1、下载redis安装包wget https://download.redis.io/releases/redis-6.2.6.tar.gz2、解压 tar -zxvf redis-6.2.6.tar.gz 3、查看是否有gcc,没有则安装查看gcc是否安装gcc -v安装gccyum install gcc4、进入redis根目录,编译cd redis-6.2.6/编译make5、安装redis服务make install 6、启动redis进入
2022-03-18 15:06:08
1005
原创 centos搭建 Nginx 静态网站
1、安装nginxyum install nginx -y2、启动nginxsystemctl start nginx3、查看nginx启动状态 systemctl status nginx如图表示启动成功4、在浏览器地址栏中输入ip5、去除对 IPv6 地址的监听,将 /data/www 作为所有静态资源请求的根路径。创建/data/www目录mkdir -p /data/www修改nginx.conf配置文件vi /etc/nginx/nginx.conf
2022-03-18 13:04:59
4547
原创 centos安装mysql5.7
文中图片均为成功样例,遇到如下图情况通通输入y再回车1、下载mysql源安装包 wget https://repo.mysql.com//mysql80-community-release-el7-3.noarch.rpm2、安装mysql源sudo rpm -Uvh mysql80-community-release-el7-3.noarch.rpm3、检查mysql源是否安装成功yum repolist all | grep mysql4、禁用8.0,启用5.7sudo yum
2022-03-18 12:01:24
890
原创 centos安装tomcat
工具准备:Xshell—它可以在Windows界面下用来访问远端不同系统下的服务器Xshell下载传送门Xftp—安全地在 UNIX/Linux 和 Windows PC 之间传输文件Xftp下载传送门1、因为tomcat的安装使用需要依赖JDK运行环境,所以首先需要检查一下当前系统中是否安装了JDKjava -version因为之前未安装JDK,所以先安装JDKJDK下载地址通过Xftp将下载好的jdk-8u321-linux-x64.tar.gz传输到centos服务器上/op
2022-03-17 22:36:05
3810
原创 接口和抽象类的区别
1.抽象类的子类使用 extends 来继承;接口使用 implements 来实现接口。2.抽象类可以有构造函数;接口不能有。3.抽象类可以有 main 方法,并且我们能运行它;接口不能有 main 方法。4.类可以实现很多个接口;但是只能继承一个抽象类。5.接口中的方法默认使用 public 修饰;抽象类中的方法可以是任意访问修饰符。6.抽象类可以包含具体方法,接口的所有方法都是抽象的。7.抽象类可以声明和使用字段;接口不能,但接口可以创静态的final常量。...
2022-03-10 20:04:33
252
原创 Spring AOP实现记录操作日志
1 添加maven依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId></dependency>2 自定义操作日志注解@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)
2022-02-16 01:42:06
697
原创 Java自定义异常类
自定义异常类一般包含两个构造方法:一个是无参的默认构造方法,另一个构造方法以字符串的形式接收一个定制的异常消息,并将该消息传递给超类的构造方法。1、编写public class MyException extends Exception { public MyException() { super(); } public MyException(String message) { super(message); }}2、测试i.
2022-01-27 20:53:57
620
原创 final、finally、finalize 的区别
final如果⼀个类被声明为final,意味着它不能再派⽣出新的⼦类,即不能被继承,因此它和abstract 是反义词。将变量声明为final,可以保证它们在使用中不被改变,被声明 为final 的变量必须在声明时给定初值,⽽在以后的引用中只能读取不可 修改。被声明为final 的⽅法也同样只能使用,不能在⼦类中被重写。finally通常放在try…catch…的后面构造总是执⾏代码块,这就意味着程序⽆论正常执⾏还是发⽣异常,这里的代码只要JVM 不关闭都能执⾏,可以将释放外.
2022-01-27 17:12:27
347
原创 Java随机数生成
1、java.util.Randomimport java.util.Random;public class Test { public static void main(String[] args) { //使用种子为10的Random对象生成[0,10)内随机整数 Random random1 = new Random(10); System.out.println(random1.nextInt(10)); //使用种子缺
2022-01-26 17:33:27
511
原创 String str=““与new String()的区别
一、基础概念1.1 常量池用来存放一些常量,该常量是在编译期被确定,并被保存在已编译的.class文件中,其中包括了类,方法,接口等包含的数值常量,字符常量和字符串常量。1.2 字符串常量池在常量池中,有个专门用来存储字符串常量的,称之为字符串常量池。当我们需要使用字符串时,首先会在字符串常量池中查找是否存在该字符串,若存在则直接进行使用;若不存在,则会新建一个对应的字符串,并保存在该字符串常量池中。1.3 在编译期间创建的常量和运行期间创建的常量保存的地址对象的引用都是存
2022-01-26 16:23:36
1557
原创 链表实现栈
//链表实现栈public class Stack { LinkNode head = null; public void insert(int value) { LinkNode newNode = new LinkNode(value); if (head == null) { head = newNode; return; } LinkNode indexNode = h
2022-01-26 15:31:32
450
原创 链表实现队列
//链表实现队列public class Queue { LinkNode head = null; public void insert(int value) { LinkNode newNode = new LinkNode(value); if (head == null) { head = newNode; return; } LinkNode indexNode =
2022-01-26 15:29:51
328
原创 String、StringBuilder与StringBuffer的区别
1、是否可变String是不可变的,每次对String的操作都会生成新的String对象StringBuilder与StringBuffer是可变的,能够被多次的修改,并且不产生新的未使用对象2、是否线程安全String是线程安全的,原因是String内部存储字符串的char数组以及和char数组相关的信息都是final的,这就保证了String对象生成的那一刻他在内存里就是不可变的。StringBuffer几乎所有的方法都使用synchronized实现了同步,线程比较
2022-01-26 15:13:44
75
原创 String的常用方法
int length():返回字符串的长度char charAt(int index):返回指定索引处的字符boolean isEmpty():判断字符串是否为空String toLowerCase():将字符串中的所有字符转换为小写String toUpperCase():将字符串中的所有字符转换为大写String trim():返回字符串的副本,去掉前导空白和尾部空白,中间的空白不会被去掉boolean equals(Object obj):比较字符串的内容是否相同boolean equa
2022-01-26 15:02:51
196
原创 剑指 Offer 24. 反转链表
题目:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。示例:public class ListNode { int val; ListNode next; ListNode(int x) { val = x; }}输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL题解:...
2022-01-18 16:30:11
483
原创 IDEA中使用jdbc连接数据库
1.下载连接mysql所需要的jar包,下载之后解压传送门2.将jar包添加到该项目的库中3.编写代码import com.mysql.jdbc.Connection;import com.mysql.jdbc.Statement;import java.sql.DriverManager;import java.sql.ResultSet;public class JDBC { public static void main(String[] args) {
2022-01-18 11:18:03
7908
8
原创 Java成员变量与局部变量的区别
1. 定义的位置成员变量:在类中方法外面局部变量:在方法中或者方法的参数列表中2. 在内存中的位置成员变量:在堆内存中局部变量:在栈内存中3. 生命周期成员变量:随着对象的创建而存在,随着对象的消失而消失局部变量:随着方法的调用而存在,随着方法的调用完毕而消失4. 初始值局部变量:没有默认初始值,使用之前需要赋值成员变量:有默认初始值public class Demo { byte Byte; short Short; int Int; long Lo
2022-01-16 18:27:52
106
原创 Java异常体系
Throwable:有两个重要的子类:Exception(异常)和Error(错误),两者都包含了大量的异常处理类。1. Error(错误):是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时jvm(Java虚拟机)出现的问题。比如StackOverflowError2. Exception(异常):是程序本身可以处理的异常。比如ArraylndexQutQfBoundException异常又分为两类:运行时异常、非运行时异常①运行时异常:.
2022-01-15 15:35:52
123
LeetCode 101 - A LeetCode Grinding Guide (C++ Version).pdf
2021-05-13
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人