- 博客(110)
- 收藏
- 关注
原创 ES中Root mapping definition has unsupported parameters解决方案
ES中Root mapping definition has unsupported parameters解决方案
2024-07-14 21:00:29
491
原创 Redis进阶知识个人汇总
一篇关于Redis持久化、主从架构、哨兵机制、分片集群、多级缓存、Redis最佳的键值设计、批处理优化、Redis底层的数据类型、Redis如何实现5种基本数据类型、Linux的5种网络模型以及IO多路复用在Redis网络模型中的应用、Redis的内存策略(包括过期key的处理和内存淘汰策略)。
2024-06-08 16:12:55
1280
原创 ArrayList源码讲解
底层采用的是数组队列,相当于动态数组。ArrayList内部使用一个可重新分配的Object数组来存储元素,这个数组会随着元素的添加自动增长以容纳更多的元素,这就是所谓的“动态数组”。先给出源码,及其一些注解,后面会对插入和扩容进行讲解。
2024-06-02 17:47:30
807
原创 面试题 - Java基础个人总结
一般个人感觉可以结合面向对象和面向过程的区别来回答?面向过程:是一种分析和解决问题的步骤,采用函数,一步一步的实现,性能较高。强调的是步骤与操作面向对象:把一个问题分解为多个对象,建立对象目的不是为了解决某一个步骤(不类似面向过程编程中的函数),而是为了描述一个事物在整个问题过程中产生的行为。然后最后通过调控多个对象,完成某一个问题。强调的是对象和数据抽象,以及通过这些抽象来表达和控制对象的行为和相互作用。面向对象有封装、继承、多态的特 性,所以易维护、易复用、易扩展。可以设计出低耦合的系统。
2024-06-02 14:27:13
851
原创 你真的了解HTTPS协议吗
在 HTTP 协议中有可能存在信息窃听或身份伪装等安全问题。使用 HTTPS 通信机制可以有效地防止这些问题。本文即将带大家来了解这些。
2024-05-27 00:11:48
648
原创 进程与线程
进程与线程:地址空间:进程是程序的一个实例,有子集独立的地址空间;线程是进程的子集,虽然有自己的程序计数器、栈、一组寄存器,但不拥有自己独立的地址空间分配:进程创建、调度、销毁由系统内核控制,创建销毁开销大线程创建与切换较进程更为轻量,不需重新分配资源通信进程之间相互隔离,除非通过一些机制进行通信线程之间通信较容易,可直接读写同一块内存区域并行与并发并行:多核 cpu下,每个 核(core) 同时调度运行线程(同时执行)并发:线程轮流使用CPU的做法称为并发。(非同时执行)
2024-05-24 10:00:30
351
原创 对文件下载进行限流处理
今天早上刷着B站,看到一个视频说有一个需求,如何实现下载限流,我就直接看了up是怎么做的:通过休眠线程 `Thread.sleep(1000);计算已经过去的时间,并根据限制速度计算出预期的时间。如果实际时间小于预期时间,则线程休眠一段时间,以控制下载速度。首先,我们需要确定要下载的文件的URL和保存路径。在循环中,将读取到的数据写入输出流,同时更新已读取的总字节数。主要实现思路:控制每次读取文件时循环的时间,以限制下载速度。最后,在循环结束后,断开与服务器的连接,释放资源。,用于存储每次读取的数据。
2024-05-22 10:17:16
263
原创 Java实现AES加密算法工具类
对称密钥算法:AES 使用相同的密钥进行加密和解密,因此被归类为对称密钥算法。这意味着发送方和接收方必须在通信前共享密钥。块加密算法:AES 将明文分成固定大小的块(128 比特),然后对每个块进行加密。在加密过程中,每个块使用相同的密钥独立加密,增强了安全性。密钥长度:AES 支持多种密钥长度,包括 128 位、192 位和 256 位。密钥越长,破解难度越大,但同时也增加了计算成本。替代算法:AES 有三种变体,分别使用不同的密钥长度,分别为 AES-128、AES-192 和 AES-256。
2024-05-02 18:15:33
762
原创 Redis 持久化个人总结
介绍:全称Redis Database file(Redis数据备份文件),又称Redis数据快照。简单说就是把内存种的所有数据都记录到磁盘中,当Redis实例出故障重启后,从磁盘读取快照文件,恢复数据。快照文件称 RDB文件,默认保存在当前运行目录。save #由Redis主进程来执行RDB,会阻塞其他命令bgsave #开启子进程执行RDB,避免主线程受到影响如果主动停机,会执行一次RDB。RDB方式bgsave的基本流程:fork主进程得到一个子进程,共享内存空间。
2024-04-07 18:50:57
684
原创 一文秒解四大经典限流算法
固定窗口限流算法()是一种最简单的限流算法,其原理是在固定时间窗口单位时间)内限制请求的数量。该算法将时间分成固定的窗口,并在每个窗口内限制请求的数量。具体来说,算法将请求按照时间顺序放入时间窗口中,并计算该时间窗口内的请求数量,如果请求数量超出了限制,则拒绝该请求。在一个固定时间段内,可以接收固定数量的请求。拒绝多余的请求。漏桶限流算法()是一种流量控制算法,用于控制流入网络的数据速率,以防止网络拥塞。
2024-04-03 14:02:29
672
原创 一文了解Java核心知识——线程池
管理一系列线程的资源池。当有任务要处理时,直接从线程池中获取线程来处理,处理完之后线程并不会立即被销毁,而是等待下一个任务。池化技术的思想主要是为了减少每次获取资源的消耗,提高对资源的利用率。线程池提供了一种限制和管理资源(包括执行一个任务)的方式。 每个线程池还维护一些基本统计信息,例如已完成任务的数量。通过Executor框架的工具类Executor来创建 FixedThreadPool:SingleThreadExecutor:CachedThreadPool:ScheduledThreadPool
2024-04-03 12:53:53
787
原创 InnoDB引擎
事务是一组操作的集合,它是一个不可分隔的工作单位,事务会把所有的操作作为一个整体向系统提交或撤销操作请求,即这些操作要不同时成功,要不同时失败。ACID原子性(Atomicity):事务是不可分割的最小操作单元。一致性(Consistency):事务完成时,必须使所有数据都保持一致状态隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变是永久的。
2024-03-30 16:21:37
1048
原创 一文搞定ThreadLocal
直接在官网找到对该类的介绍:该类提供线程局部变量。这些变量与其正常对应变量的不同之处在于,访问一个变量(通过其get或set方法)的每个线程都有其自己的、独立初始化的变量副本。实例通常是类中希望将状态与线程关联起来的私有静态字段(例如,用户 ID 或事务 ID)。个人对上述文字的理解:ThreadLocal就是每个线程中的局部变量,每个线程中都要。可以通过set或get方法访问。
2024-03-29 10:58:12
1142
原创 MySQL进阶——锁
同Java中的锁。目的是为了保证数据一致性、完整性,提高并发安全、控制访问顺序。全局锁是对整个 数据库 实例加锁,加锁后整个实例就处于只读状态,后续的DML的写语句(表结构)、DDL语句(表数据),以及更新操作的事务提交语句都被阻塞。做全局的逻辑备份,对所有的表进行锁定,从而获取一致性视图,保证数据的完整性。表级锁,每次操作锁住整张表。锁定粒度大,发生锁冲突得概率最高,并发度最低。应用在MyISAM、InnoDB、BDB等存储引擎中。表锁元数据锁(meta data lock,MDL)意向锁。
2024-03-27 20:14:39
678
原创 MySQL进阶---SQL优化
插入数据insert:批量插入、手动控制事务、主键顺序插入、大批量插入:load data local infile主键优化主键长度尽量短,顺序插入 AUTO_INCREMENT UUIDorder by优化using index:直接通过索引返回数据,性能高using filesort:需要将返回的结果在排序缓冲区排序gourp by 索引,多字段分组满足最左前缀法则limit优化 覆盖索引 + 子查询count优化 count(*) =count(1) > count(主
2024-03-26 10:35:52
1104
原创 MySQL进阶——索引
介绍索引(Index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。优缺点分析优点提高数据检索的效率,降低数据库IO成本通过索引列对数据进行排序,降低数据排序的成本,降低CPU的消耗缺点索引列需要占用空间。索引大大提高了查询效率,同时也降低了更新表的速度。如:对表进行Insert、update、delete时,效率降低。索引概述。
2024-03-23 23:51:06
1421
原创 MySQL进阶——存储引擎
存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式。存储引擎是基于表的,而不是基于库的,所以存储引擎可以被称为表类型。#1、查询建表语句 --默认存储引擎InnoDBshow create table 表名;#2、查询当前数据库支持的存储引擎#3、在建表的时候指定存储引擎create table 表名{。。。。DATAInnoDB:是MySQL的默认存储引擎,支持事务、外键。如果应用对事务的完整性要求较高,在并发条件下要求数据的一致性,数据操作除了插入和查询外还有。
2024-03-22 17:56:46
845
原创 11种行为型设计模式(下)
观察者模式:对象之间多对一依赖的一种设计方案,被依赖的对象是Subject,依赖的对象是Observer,Subject通知Observer变化。个人理解:观察者模式就是一种似广播的模式,一个站对多个对象。观察者模式(Observer Pattern)是一种软件设计模式,它定义了一种一对多的依赖关系,使得多个观察者对象同时监听某一个主题对象。当主题对象的状态发生变化时,所有依赖于它的观察者都会得到通知并自动更新。1、中介者模式是一种行为型设计模式,用来减少对象间的直接耦合。
2024-03-20 17:17:05
1338
原创 11种行为型模式(上)
1、模板方法模式,又叫模板模式。在一个抽象类中中公开定义了执行它的方法模板,它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行2、简单说,模板方法模式定义一个操作中的算法骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,就可以重定义该算法的某些特定步骤。3、模板模式属于行为者模式。对原理图中的说明1、AbstractClass抽象类,类中实现了模板方法,定义了算法的骨架,具体子类需要取实现,其他的抽象方法operation2,3,4。
2024-03-20 15:38:58
912
原创 Wait()方法是否会释放对象锁之外的锁?
今天看并发的时候,看的调用wait()有人现在就要问了,啥是对象锁,其实就是对象作为锁的条件。上述就是一个对象锁。继续看,然后我就去做了一个小测试,看看调用wait方法,会不会释放对象锁。这里让线程1拿到对象锁,再开始休眠;再让线程2去拿对象锁。如果线程2拿到对象锁,代表wait方法会自动释放所拿到的对象锁。运行结果如下:还真会自动释放锁。问题提出,会不会释放在wait方法之外的所有锁呢?
2024-03-19 20:55:14
438
原创 7大结构型设计模式
1、定义装饰者模式:动态的将新功能附加到对象上。在对象功能扩展方面,它比继承更有弹性,装饰者模式也体现了开闭原则//1、接口//2、具体咖啡类@Overridereturn 1.0;@Override//3、装饰者类//4、测试demo装饰者模式是一种结构型设计模式,它允许你动态地将责任附加到对象上。这种模式可以通过创建一个包装类来包裹原始类,在不改变原始类接口的情况下,给其添加新的功能。
2024-03-18 19:55:03
1484
原创 桥接模式以及在JDBC源码剖析
个人理解:将桥接模式理解为一种将抽象部分和具体实现部分分离开的设计模式。桥接模式通过对象间的组合关系,而不是继承关系,来实现抽象部分和实现部分的解耦。(抽象和具体分开)SpringMVC的三层架构中,service接口和serviceImpl也是运用了这种桥接思想。桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立变化而互不影响。桥接模式通过对象间的组合关系,而不是继承关系,来实现抽象部分和实现部分的解耦。
2024-03-11 19:56:02
632
原创 适配器模式已经在SpringMVC中的源码实现
1、类适配器模式介绍基本介绍:Adapter类,通过继承src类,实现dst类接口,完成src -> dst的适配1、基本思路和类适配器相同,只是将Adapter类做了修改,不是继承src类,而是持有src类的实例,以解决兼容性问题。即:持有src类,实现dst类接口,完成src -> dst的适配2、根据合成复用原则,在系统中尽量使用关联关系代替继承关系1、适配器模式又称缺省适配器模式。
2024-03-10 16:29:45
701
原创 代理模式以及静态代理、JDK代理、Cglib代理的实现
1、代理对象不需要实现接口,但是目标对象要实现接口,否则不能用动态代理2、代理对象的生成,是利用JDK的API,动态的在内存中构建代理对象3、动态代理又称:JDK代理,接口代理1、静态代理和JDK代理都要求目标对象实现一个接口,但是有时候目标对象只是一个单独的对象,并没有实现任何的接口,这个时候可使用目标对象子类来实现代理——Cglib代理2、Cglib代理也叫做子类代理,它是在内存中构建一个子类对象从而实现对目标对象功能扩展,有些地方也将Cglib代理归属动态代理。
2024-03-08 16:52:16
988
1
原创 div聊天框始终保持在底部
在设计一个网络聊天室的时候,每次发完消息,用下面这种方式,将div上加入。这样的id标签,就可以通过使用了原生 JavaScript 的。来获取聊天容器的引用。
2024-03-08 09:58:24
280
原创 创建型设计模式合集
原型模式是一种创建型设计模式,它允许创建对象的同时保持其内部状态的一份拷贝,从而避免了使用详细的构造函数和初始化过程。个人理解:就是通过克隆已有的对象,来创建新的对象,从而减少对象实例化过程。1、建造者模式又称生成器模式,是一种对象构建模式,可以将复杂对象的构建过程抽象出来,使这个抽象过程的不同实现方法可以构造出不同属性的对象。2、建造者模式是一步一步创建一个复杂对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部实现细节。
2024-03-04 20:26:10
1089
原创 Spring MVC 和 Spring Cloud Gateway不兼容性问题
分享一个管理SpringCloud依赖问题的方法,引入与你SpringBoot版本相对于的spring-cloud-dependencies版本,然后通过下面这种方法管理依赖,就可以避免依赖问题了。解决办法就是:删除SpringMVC的依赖,即下列依赖。
2024-03-01 22:17:58
542
原创 设计模式——三大工厂模式
介绍:1、简单工厂模式是属于创建型模式,是工厂模式的一种,**简单工厂模式是由一个工厂对象决定创建出哪种产品的实例**。是工厂模式中最简单使用的模式2、简单工厂模式:定义了一个创建对象的类,由这个类封装实例化对象的行为(代码)3、在软件开发中,当我们会用到大量的创建某种、某类或者某批对象时,就会使用到工厂模式。总结:优点:1、简单工厂模式实现了对象创建和对象使用的分离,客户端只需知道产品的类型,无需关心产品的创建细节。2、可以通过工厂方法来集中控制对象的创建,便于统一管理和维护。
2024-02-23 14:25:53
848
原创 springboot 的 websocket 里面使用 @Autowired 注入 service 或 bean 时,报空指针异常
综上所述,问题的核心在于如何解决 Spring 管理的单例对象与 WebSocket 多例对象之间的冲突。可能的解决方案包括创建一个 WebSocket 管理器来动态管理 WebSocket 对象,或者使用 Spring 提供的作用域来限定 WebSocket 对象的范围。这个问题的本质是由于 Spring 管理的对象通常是单例(singleton),而 WebSocket 对象是多例的,因为每个用户的聊天客户端对应后台的一个 WebSocket 对象。这导致了单例和多例的冲突。
2024-02-22 21:52:26
548
原创 设计模式——单例模式8种实现
这种方式基于classloder机制避免了多线程同步问题,但是instance在类装载时就实例化,单例模式中大多数是调用getInstance方法,但是导致类装载的原因有很多种,因此不能确定有其他静态方法导致类装载,这个时候初始化instance就没有导致lazy loading的效果。3、类的静态属性智慧在第一次加载类的时候初始化,所以,在这JVM帮助我们保证了线程的安全性,在类进行初始化时,别的线程无法进入。3、保持一致性:单例模式可以确保一个类只有一个实例,从而避免了多个实例之间状态的不一致性。
2024-02-20 16:25:35
1162
原创 设计模式7大原则+类图关系
设计模式:一种对软件设计中普遍存在(反复出现)的各种问题所提出的解决方案。设计模式的目的:设计模式可以帮助开发人员更好地组织代码结构,提高代码重用性、可读性、可维护性、耦合性、内聚性。经典面试题:七大设计原则核心思想能够以类图的说明设计原则在项目实际开发中,你在哪里使用到了ocp原则。。。。。设计模式分为:七大原则23种设计模式使用在算法和框架中,例如Spring框架就使用了多种的设计模式。
2024-02-19 11:03:41
1123
原创 DP进阶之最长递增子序列
其实我们思考一下,我们只需要知道,在数组nums下标为i的时候,nums[i] 与前面nums[j] (j<i)的比较,如果大于,则可以知道前面肯定有递增子序列,dp[j] + 1就是它与j位置的子序列的长度,再与自己之前的比较,看看哪个最大取哪个。2、我们可以用动态规划来解决,通过找到数组中第i个位置时候最长严格递增子序列的长度,求出最长的长度。1、首先来阅读题目,题目的意思是说,要我们求在一个数组中,来找一组从小到大递增的序列。最长递增子序列是 [2,3,7,101],因此长度为 4。
2024-02-18 13:00:22
253
原创 dp进阶之路——最后一块石头的重量
2、dp[i][j]表达的是什么:加入stone[i],同时重量为 j 的情况下,能装载重量的最大。组合 2 和 4,得到 2,所以数组转化为 [2,7,1,8,1],组合 1 和 1,得到 0,所以数组转化为 [1],这就是最优值。组合 7 和 8,得到 1,所以数组转化为 [2,1,1,1],组合 2 和 1,得到 1,所以数组转化为 [1,1,1],
2024-02-13 12:35:11
477
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人