- 博客(57)
- 收藏
- 关注
原创 git常用命令
git reset 将暂存区的文件取消暂存或者是切换到指定版本。git commit 将暂存区的文件修改提交到版本库。git remote add 添加远程仓库。git add 将文件的修改加入暂存区。git status 查看文件状态。git remote 查看远程仓库。git clone 从远程仓库克隆。git pull 从远程仓库拉取。git push 推送到远程仓库。git log 查看日志。
2024-12-30 11:06:42
253
原创 关于解决IDEA中git的commit没有反应的问题解决方案(最全)
5. 检查红框部分,是否和第一步的编码一致。1.首先检查你的idea是否能使用git。6.在提交的时候(最重要)(不要勾选)3.点击settings(不要勾选)2.查看你的idea右下角的编码。4.检查Code style。
2024-12-30 10:59:40
900
1
原创 SpringBoot事务回滚--Propagation.NESTED
如果希望其中一个方法回滚时其他两个方法也回滚,可以将它们的事务传播行为设置为。可以捕获这些异常并决定是否整体回滚(取决于业务逻辑)对于三个方法,假设分别为。
2024-12-03 13:12:51
303
原创 redis--Mysql和redis数据一致性问题(延时双删)
3.延时双删,延时时间是一个预估值,不能确保 mysql 和 redis 数据在这个时间段内都实时同步或持久化成功了。2.延时双删,不适合“秒杀”这种频繁修改数据和要求数据强一致的场景。1.延时双删,有等待环节,如果系统要求低延时,这种场景就不合适了。CAP 原则指的是,这三个要素最多。一致性(Consistency),指的是在一个分布式系统中,
2024-10-17 17:29:48
513
原创 redis--过期策略和内存淘汰策略
以下介绍redis的6中内存淘汰策略,内存淘汰策略允许Redis在内存资源紧张时,根据一定的策略主动删除一些键值对,以释放内存空间并保持系统的稳定性1、noeviction(不淘汰策略)当内存不足以容纳新写入数据时,Redis将新写入的命令返回错误,这个策略确保数据的完整性,但会导致写入操作失败。2、volatile-lru(最近最少使用)从设置了过期时间的键中选择最少使用的键进行删除,该策略优先删除最久未被访问的键,保留最常用的键。3、volatile-ttl(根据过期时间优先)
2024-10-17 17:06:32
509
原创 设计模式--工厂模式
工厂模式的介绍工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一,它提供了一种创建对象的方式,使得创建对象的过程与使用对象的过程分离。工厂模式提供了一种创建对象的方式,而无需指定要创建的具体类。通过使用工厂模式,可以将对象的创建逻辑封装在一个工厂类中,而不是在客户端代码中直接实例化对象,这样可以提高代码的可维护性和可扩展性。 重点:其中的核心思想就是把创建对象和使用对象解耦,由工厂负责对象的创建,而用
2024-10-15 14:46:48
483
1
原创 设计模式--单例模式
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供了一个全局访问点来访问该实例。
2024-10-15 14:31:53
506
1
原创 java基础--接口和抽象类的区别
接口:使用interface关键字定义,是一种引用类型,类似于类,但它仅包含方法的声明(在Java 8及更高版本中,还可以包含默认方法和静态方法,但默认方法仍然需要被实现类调用)。抽象类:使用abstract关键字定义,是一种不能被实例化的类,但它可以包含抽象方法和非抽象方法。
2024-08-05 14:27:19
318
原创 MYSQL--binlog和redo log
MySQL日志主要包括错误日志、查询日志、慢查询日志、事务日志、二进制日志几大类。其中比较重要的就是二进制日志binlog(归档日志)、事务日志redo log(重做日志)和undo log(回滚日志)。这篇文章主要来讲解binlog和redo log定义:Redo Log是InnoDB存储引擎特有的日志,用于记录数据页的物理变化,即数据在磁盘上的修改。作用保证事务的持久性:在数据库崩溃或意外关闭时,通过Redo Log可以恢复未提交的事务,确保数据的一致性。提高写性能。
2024-08-05 14:16:47
1611
1
原创 MYSQL--事务
对数据进行修改的所有并发事务是彼此隔离的,这表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务。修改数据的事务可以在另一个使用相同数据的事务开始之前访问这些数据,或者在另一个使用相同数据的事务结束之后访问这些数据。如果由于某种原因,事务在成功更新这两个账户之前终止了,则不会更新这两个账户的余额,并且会撤销对任何账户余额的修改,事务不能部分提交。另外,当事务修改数据时,如果任何其他进程正在同时使用相同的数据,则直到该事务成功提交之后,对数据的修改才能生效。如果事务中的任何元素失败,则整个事务将失败。
2024-08-05 13:35:42
830
原创 布隆过滤器
原理布隆过滤器主要由一个很长的二进制向量(即位数组)和一系列随机映射函数(即哈希函数)组成。当一个元素被加入布隆过滤器时,它会通过多个哈希函数生成多个哈希值,并将这些哈希值对应的位数组中的位置设置为1。当需要检查一个元素是否存在于布隆过滤器中时,同样通过多个哈希函数生成哈希值,并检查这些位置是否全部为1。如果全部为1,则元素存在;如果有任何一个位置不为1,则元素不存在。优缺点。
2024-08-05 10:52:10
262
原创 Redis--缓存击穿、缓存穿透、缓存雪崩
但是,布隆过滤器存在误判的情况,即可能将不存在的元素判断为存在。缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,而查询的结果在数据库中也不存在,因此不会写入缓存。就是当缓存中的大量数据在同一时间失效,且这些数据的访问量又非常大时,所有的请求都会直接打到数据库上,导致数据库负载急剧增加,可能引发数据库崩溃,进而影响整个系统的正常运行。:在系统启动或者低峰期时,预先将一些热点数据加载到缓存中,这样在系统高峰期时,这些热点数据就已经存在于缓存中了,从而避免了缓存击穿的发生。
2024-08-05 10:36:43
1171
2
原创 redis--分布式锁(1)
为什么要使用分布式锁?本地锁只能锁住单台机器多线程请求的资源分布式锁是多台机器共同访问redis中的一个数据,只有获取到锁的线程才能访问在更新MySQL和Redis之前,先获取一个分布式锁。这样,只有获取到锁的线程才能执行更新操作,从而避免了并发更新导致的数据不一致问题。但是这种方法可能会导致性能下降和死锁的风险。因此,在使用分布式锁时需要谨慎考虑。
2024-08-03 21:50:14
452
原创 Rabbitmq中的死信队列
消息投递到MQ中存放 消息已经过期 消费者没有及时的获取到我们消息,消息如果存放到mq服务器中过期之后,会转移到备胎死信队列存放。2.如果生产者投递消息到普通队列中,普通队列发现该消息一直没有被消费者消费。的情况下,在这时候会将该消息转移到死信(备胎)交换机中,死信(备胎)交换机。的情况下,在这时候会将该消息转移到死信(备胎)交换机中,死信(备胎)交换机。普通队列中缓存起来,普通队列对应有自己独立普通消费者。普通队列中缓存起来,普通队列对应有自己独立普通消费者。死信队列和普通队列区别不是很大。
2024-08-03 21:27:32
1896
原创 Rabbitmq的几种工作模式
的交换机(具体交换机的类型和概念小伙伴们可以自行查阅下,这里主要讲工作模式),生产者将消息发送给这个交换机,这个交换机把消息发送给每一个和其绑定的队列(注意。#号表示支持匹配多个词;*号表示只能匹配一个词,假如同一个队列与交换机直接设置的多个模糊的key都符合传入的,那么也只传送一次。的交换机不需要key所以生产者传递直接传""就好)(谁处理快,谁做的多)路由模式Routing。
2024-08-03 19:37:05
898
原创 并发--快速查询死锁信息
由于synchronized是独占型锁,t1只能等t2释放B的资源,但是t2又需要锁住资源A才能执行完代码并释放锁。t1拿到锁将资源A锁住,此时时间片到了,线程切换到t2,t2锁住了资源B,此时轮到t1继续执行t1想锁住资源B。此时t1等待t2释放资源,t2等待t1释放资源,此时就形成了死锁。jstack:jdk提供的一个工具,可以查看java进程中线程堆栈信息。具体的死锁相关概念请看我的另一边博客,这里就不详细介绍了。5.然后根据信息,我们可以清楚的看到程序发生死锁的原因。
2024-07-30 17:15:12
436
原创 数据结构--B树 B+树
B+树的非叶子节点只存储key值,做索引使用,一页能存储更多的key的值,树的高度越低B+树的叶子结点相连,对整颗树的遍历只需要一次遍历叶子结点即可 区间查找B树:每个节点都包含key和value,根据key值查找value的时候,只要找到key,就能立马找到valueB树一般用做磁盘 B+树一般用作数据库。
2024-07-30 16:10:24
1272
原创 数据结构-- 2-3-4树和红黑树
2-3-4树是一种自平衡的树数据结构,它是B树(B-tree)的一个特例,通常用于数据库和文件系统的索引结构中,以维持数据的有序性并允许搜索、顺序访问、插入、删除等操作都能在对数时间内完成。但需要注意的是,2-3-4树本身保证了节点至少有⌈m/2⌉个子节点(对于m=4的情况,即至少2个子节点),但并不要求节点总是满的。分裂操作涉及将节点中的一个关键字移动到父节点(如果父节点已满,则也需要分裂),并相应地调整子节点的链接。5.从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑色节点。
2024-07-30 14:55:11
492
原创 并发编程--CyclicBarrier 和 CountDownLatch
CyclicBarrier 和 CountDownLatch 非常类似,它也可以实现线程间的技术等待,但是它的功能比 CountDownLatch 更加复杂和强大。主要应用场景和 CountDownLatch 类似。CyclicBarrier 的字面意思是可循环使用(Cyclic)的屏障(Barrier)。它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活。CyclicBarrier 默认的构造方法是。
2024-07-30 14:18:25
946
原创 并发编程--ReentrantLock
非公平锁在调用 lock 后,首先就会调用 CAS 进行一次抢锁,如果这个时候恰巧锁没有被占用,那么直接就获取到锁返回了。非公平锁在 CAS 失败后,和公平锁一样都会进入到 tryAcquire 方法,在 tryAcquire 方法中,如果发现锁这个时候被释放了(state == 0),非公平锁会直接 CAS 抢锁,但是公平锁会判断等待队列是否有线程处于等待状态,如果有则不去抢锁,乖乖排到后面。
2024-07-25 18:02:01
606
原创 并发编程--synchronized升级
Java SE 1.6为了减少获得锁和释放锁带来的性能消耗,引入了偏向锁和轻量级锁,在Java SE 1.6中,锁一共有4种状态级别从低到高依次是:无锁状态偏向锁状态轻量级锁状态和重量级锁状态这几个状态会随着竞争情况逐渐升级。锁可以升级但不能降级,意味着偏 向锁升级成轻量级锁后不能降级成偏向锁。这种锁升级却不能降级的策略,目的是为了提高 获得锁和释放锁的效率重点。
2024-07-24 14:53:03
808
原创 并发编程--synchronized介绍
此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。死锁是并发系统中的一种重要现象,它可能导致系统资源的浪费和进程的停滞。例如:下面代码 t1拿到锁之后,因为一些异常情况没有释放锁 (死循环又或者是t1拿到一个数据库锁释放锁的时候抛出了异常,没释放掉。
2024-07-23 14:23:04
789
1
原创 并发编程--volatile
volatile是轻量级的 synchronized,它在多处理器开发中保证了共享变量的可见性。可见性的意思是当一个线程 修改一个共享变量时,另外一个线程能读到这个修改的值。如果volatile变量修饰符使用恰当的话,它比的使用和执行成本更低,因为它不会引起线程上下文的切换和调度。
2024-07-23 14:03:46
1067
1
原创 MySQL--索引(2)
更新代价比聚集索引要小 。非聚集索引的更新代价就没有聚集索引那么大了,非聚集索引的叶子节点是不存放数据的跟聚集索引一样,非聚集索引也依赖于有序的数据可能会二次查询(回表) :这应该是非聚集索引最大的缺点了。 当查到索引对应的指针或主键后,可能还需要根据指针或主键再到数据文件或表中查询。这是 Mysql 的表的文件截图: 即使是 MYISAM 也是这样,虽然 MYISAM 的主键索引确实需要回表, 因为它的主键索引的叶子节点存放的是指针。但是如果 SQL 查的就是主键呢?主键索引
2024-07-22 22:34:26
1282
原创 MySQL--索引(1)
索引是一种用于快速查询和检索数据的数据结构。常见的索引结构有: B 树, B+树和 Hash。索引的作用就相当于目录的作用。打个比方: 我们在查字典的时候,如果没有目录,那我们就只能一页一页的去找我们需要查的那个字,速度很慢。如果有目录了,我们只需要先去目录里查找字的位置,然后直接翻到那一页就行了。
2024-07-22 21:32:47
889
原创 计算机网络知识-面试点1
1. 三握四挥定义:在计算机网络中,特别是TCP/IP协议中,“三握”指的是三次握手(Three-way Handshake),而“四挥”则指的是四次挥手(Four-way Handshake)。这两个过程分别用于TCP连接的建立和断开。三握:三次握手(Three-way Handshake)三次握手是TCP协议中用于建立连接的过程,确保通信双方能够正常地接收和发送数据。具体过程如下:第一次握手:客户端向服务器发送一个SYN(同步序列编号)标志位
2024-07-22 17:42:28
1526
原创 JVM--双亲委派模型
站在Java虚拟机的角度来看,只存在两种不同的类加载器:一种是启动类加载器Bootstrap ClassLoader),这个类加载器使用C++语言实现,是虚拟机自身的一部分;另外一种就是其他所有的类加载器,这些类加载器都由Java语言实现,独立存在于虚拟机外部,并且全都继承自抽象类java.lang.ClassLoader。站在Java开发人员的角度来看,类加载器就应当划分得更细致一些。自JDK 1.2以来,Java。
2024-07-21 20:59:18
1007
原创 JVM--内存分配与回收策略
对象的内存分配,从概念上讲,应该都是在堆上分配(而实际上也有可能经过即时编译后被拆散 为标量类型并间接地在栈上分配在经典分代的设计下,新生对象通常会分配在新生代中,少数 情况下(例如对象大小超过一定阈值)也可能会直接分配在老年代。对象分配的规则并不是固定的, 《Java虚拟机规范》并未规定新对象的创建和存储细节,这取决于虚拟机当前使用的是哪一种垃圾收集器,以及虚拟机中与内存相关的参数的设定2.内存分配问题。
2024-07-19 22:31:37
1126
原创 JVM--经典的垃圾收集器
如果说收集算法是内存回收的方法论,那垃圾收集器就是内存回收的实践者。《Java虚拟机规 范》中对垃圾收集器应该如何实现并没有做出任何规定,因此不同的厂商、不同版本的虚拟机所包含 的垃圾收集器都可能会有很大差别,不同的虚拟机一般也都会提供各种参数供用户根据自己的应用特 点和要求组合出各个内存分代所使用的收集器。本文标题中“经典二字并非情怀,它其实是讨论范围的限定语,这里讨论的是在JDK 7 Update 4 之后(在这个版本中正式提供了商用的G1收集器,此前G1仍处于实验状态)、
2024-07-19 22:11:44
1205
原创 JVM--HostSpot算法细节实现
不需要线程的执行代码 主动去配合,在垃圾收集发生时,系统首先把所有用户线程全部中断,如果发现有用户线程中断的地 方不在安全点上,就恢复这条线程执行,让它一会再重新中断,直到跑到安全点上。,当灰色对象要删除指向白色对象的引用关系时,就将这个要删 除的引用记录下来,在并发扫描结束之后,再将这些记录过的引用关系中的灰色对象为根,重新扫描 一次。,当黑色对象插入新的指向白色对象的引用关系时,就将这个新 插入的引用记录下来,等并发扫描结束之后,再将这些记录过的引用关系中的黑色对象为根,重新扫描一次。
2024-07-17 21:51:48
1071
原创 JVM--垃圾收集算法
那么假如要现在进行一次只局限于新生代区域内的收集(Minor GC),但新生代中的对象是完全有可能被老年代所引用的,为了找出该区域中的存活对象,不得不在固定的GC Roots之外,再额外遍历整个老年代中所有对象来确保可达性分析结果的正确性,反过来也是一样[3]。遍历整个老年代所有对象的方案虽然理论上可行,但无疑会为内存回收带来很大的性能负担。为了解决这个问题,就需要对分代收集理论添加第三条经验法则(跨代引用假说)
2024-07-16 22:40:47
1366
2
原创 JVM---对象是否存活及被引用的状态
无论是通过引用计数算法判断对象的引用数量,还是通过可达性分析算法判断对象是否引用链可 达,判定对象是否存活都和“引用离不开关系。在JDK 1.2版之前,Java里面的引用是很传统的定义: 如果reference类型的数据中存储的数值代表的是另外一块内存的起始地址,就称该reference数据是代表 某块内存、某个对象的引用。这种定义并没有什么不对,只是现在看来有些过于狭隘了,一个对象在 这种定义下只有“被引用或者未被引用两种状态,对于描述一些食之无味,弃之可惜。
2024-07-16 22:12:30
1187
原创 JVM--自动内存管理--JAVA内存区域
此外,如果对象是一个Java数组,那在对象头中还必须有一块用于记录数组长度的数据,因为虚拟机可以通过普通Java对象的元数据信息确定Java对象的大小,但是如果数组的长度是不确定的,将无法通过元数据中的信息推断出数组的大小。解释:例如在java栈的本地变量表中存有多个reference指向同一对象的,如果对象被移动(地址变化)只需要改变变句柄中的实例数据指针就可以,而reference指向的是对象实例数据的指针,所以不需要变化,而直接指针访问就需要改变每一个reference中的句柄地址。
2024-07-15 17:54:35
1004
原创 Hash表以及put方法源码的分析
Hash表(Hash Table),也被称为散列表,是一种根据关键码值(Key value)而直接进行访问的数据结构。它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数称为散列函数(Hash Function),存放记录的数组称为散列表2.源码解读1. 首先执行.put方法时会调用通过hash方法,用key生成一个哈希值2. 然后执行putVal方法实现putint n, i;else {K k;e = p;else {;break;break;
2024-07-14 17:44:10
654
原创 AOP代码中的三种形式(自定义切面类, 使用Spring的原生API进行AOP,注解)
AOP,全称Aspect Oriented Programming,即面向切面编程,是一种编程范式和架构模式。它是面向对象编程(OOP)的延续和发展,同时也是函数式编程的一种衍生范型。AOP通过预编译方式和运行期动态代理实现程序功能的统一维护,能够在不修改源代码的情况下,给程序动态统一添加功能。xml--proxy-target-class="true" 表示使用cglib代理.默认为false,创建有接口的jdk代理-->--切面:由切入点和通知组成-->--切入点 pointcut-->
2024-07-10 22:19:56
1297
原创 SpringBoot防止重复提交 AOP+自定义注解+redis
在Web开发中,重复提交(也称为双重提交或重复表单提交)是指用户在没有明确意图的情况下,多次提交同一表单的情况。这可能是由于用户多次点击提交按钮、表单提交过程中的网络延迟导致用户重复点击、或者由于浏览器的自动重试机制(如在网络中断后恢复连接时)等原因造成的。这种情况可能造成数据库插入多条数据等等2.用一个小例子实现防止重复提交2.1// 可以定义一些属性,比如超时时间等// 默认60秒首先自定义一个注解,用来给方法设置多长时间内再次调用相同的数据,属于重复提交。
2024-07-10 20:19:59
616
原创 java中的静态代理,jdk动态代理,cglib动态代理
代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能.这里使用到编程中的一个思想:不要随意去修改别人已经写好的代码或者方法,如果需改修改,可以通过代理的方式来扩展该方法。
2024-07-09 22:34:39
996
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人