- 博客(139)
- 收藏
- 关注
原创 面试官:你知道select * from users where id > 5 for update时会发生什么吗?
MySQL 数据库在多用户并发环境下,为了保证数据的一致性与完整性,采用了多种加锁机制。行锁是其中重要的一种,它可以确保数据库在多个事务并发执行时,能够精确控制对行数据的访问,从而避免数据冲突和不一致性问题。同时对于,也是行锁加锁中多种情况中的一种,让我们通过本文用具体的例子和详细的步骤,介绍 MySQL 中行锁的加锁机制,帮助你全面理解在不同查询场景下,MySQL 是如何对数据加锁的。行锁是一种锁定特定行数据的机制,允许多个事务并发地操作不同的数据行。
2025-01-16 11:45:33
697
原创 MySQL 主从复制不明白?本文带你轻松掌握!
最近,我的一个朋友最近正在找实习么,在前几天的面试中被问到一个这样的问题:“你项目中用到了Canal组件,你有没有想过它数据丢失的问题?”我那个朋友直接懵了啊,Canal不就是假装冒充一个数据库主从的从节点吗?对于这方面确实没有思考过啊,网上找了一些资料,也没有看到有文章说这个事。那咋今天就从MySQL的主从复制来讲讲这个问题吧。同步原理:深入解析了MySQL主从同步机制,包括数据写入、日志记录(binlog)、Log Dump线程、I/O线程和SQL线程的作用。
2024-12-17 20:58:48
815
原创 面试初体验:@Transactional引起的八股 + debug的拷打
理解AOP的工作原理和Spring的事务管理机制对于开发高效、可靠的分布式应用至关重要。在日常开发中,尽可能使用手动事务管理可以避免事务失效的问题,并且能够更精确地控制事务的粒度,从而提高系统的性能和可维护性。同时,要注意在同一类中调用带有注解的方法时,必须通过代理对象来调用,避免事务失效。
2024-12-08 16:07:21
1133
原创 从零开始的使用SpringBoot和WebSocket打造实时共享文档应用
WebSocket 是一种网络协议,它提供了一个全双工的通信通道,允许客户端和服务器之间进行实时、双向的数据传输。与传统的 HTTP 协议不同,WebSocket 连接在建立后会保持打开状态,不需要频繁的建立连接,从而大大提高了数据交换的效率。WebSocket 协议通常用于实时聊天、在线游戏、金融行情推送等场景。在本文中,我们将利用 WebSocket 来实现一个共享文本框。
2024-12-06 20:37:40
1288
原创 如何设计一个高性能百万的直播弹幕系统,听我娓娓道来
本文通过逐步优化直播弹幕系统,解决了高并发、高性能和高可用性的挑战。我们在设计中综合考虑了系统架构、数据一致性、缓存策略以及异步处理等关键因素,最终实现了一个能够支持百万级并发量的高质量弹幕系统。
2024-12-04 17:21:44
969
原创 InnoDB横空出世,你真的想过为什么它能替代MyISAM吗?
从MyISAM到InnoDB,存储引擎的发展映射了数据库技术从“性能优先”向“功能全面”的转变。MyISAM并非毫无用武之地,但它更适合简单、低并发场景。而InnoDB凭借事务支持、高并发能力和出色的可靠性,已经成为现代数据库应用的首选。所以,当下次被问到“为什么用InnoDB”时,你不仅能给出答案,还能讲出一段数据库“进化史”。选择InnoDB,就是选择稳中求胜。
2024-11-19 15:43:50
815
原创 分布式事务(指导篇)
本文介绍了分布式系统中的一些重要理论和实践方法,帮助我们理解如何在复杂的分布式环境中实现事务的一致性。通过CAP定理,我们了解到在分布式系统中,一致性、可用性和分区容错性之间需要做出权衡。BASE理论则提供了一种更加灵活的设计思路,通过基本可用、软状态和最终一致性来实现高可用性和可靠性。AP模式(最终一致性):强调高可用性和最终一致性,适用于对实时一致性要求不高但对系统可用性要求较高的场景,如电商平台和社交网络。CP模式(强一致性)
2024-11-16 15:32:36
509
原创 提升大数据量分页查询性能:深分页优化全解
当user表具有主键或索引字段时,我们可以借助主键进行子查询以确定偏移起点,这会极大减少扫描行数,从而显著提高查询性能。# 子查询优化SELECT *SELECT idLIMIT 10;直接查询结果显示,查询时间仅为 0.013 秒,性能提升了 200 多倍!书签优化,也称为滚动查询,是一种通过记录上一次查询的最大记录ID来优化深分页查询的方法。这种方法的核心思想是从第一页开始查询,然后获取本页最大的记录ID,再根据大于该记录ID的数据向后持续滚动。
2024-11-02 11:05:07
1829
原创 扫盲:缓存一致性、缓存击穿/穿透/雪崩
在日常开发中,为了提升系统的响应速度,我们通常首选缓存技术。然而,引入缓存的同时也会带来一系列不可避免的问题,如缓存一致性问题以及缓存失效后导致的击穿、穿透和雪崩现象。无论是在何种并发场景下,只要使用了缓存,就必然会面临缓存一致性的问题;而对于因缓存失效所导致的击穿、穿透和雪崩问题,不应简单地依赖数据库来硬抗这些请求。否则,你将不得不独自面对由此带来的系统压力,反思为何没有采取适当的措施来避免这些状况的发生。
2024-10-25 11:19:32
780
原创 QUIC 启动!
无队头阻塞:QUIC通过独立的数据流设计,避免了由于单个数据包丢失而导致整个连接阻塞的问题,从而提高了传输效率。更快的连接建立:QUIC优化了连接建立过程,减少了握手延迟,使得客户端与服务器之间的连接建立速度更快。连接迁移:QUIC支持无缝的连接迁移,允许客户端在不中断现有连接的情况下改变其IP地址或端口,这对于移动设备在网络切换时保持持续连接尤其重要。这三点优化使得QUIC在具备与TCP类似的流控和拥塞控制功能的同时,具有更大的优势。发现明显的会比TCP相应快个几百ms,这对系统性能还是优化挺大的。
2024-10-22 16:44:12
1097
原创 责任链模式下,解决开闭原则问题实践
说来话长,话来说长。前些天我投了一些日常实习的简历,结果足足等了两个礼拜才收到面试通知,看来如今的行情确实是挺紧张的。当时我是满怀信心去的,心想这次一定要好好拷打面试官一番,结果没想到,自我介绍刚一结束,面试官就要开始拷打我了,直接让我手撕布隆过滤器?我当时心里可真是:我勒个豆啊(此处省略无数心里话)。虽然我对它的原理是了解的,但之前还真没有亲手写过。就这样,我开始了这次的手撕布隆过滤器之旅。不过话说回来,虽然非常离谱,但这种经历也算是某种成长吧,毕竟理论和实践之间总是有些距离的。
2024-10-19 13:37:41
1586
原创 手撕布隆过滤器:原理解析与面试心得
说来话长,话来说长。前些天我投了一些日常实习的简历,结果足足等了两个礼拜才收到面试通知,看来如今的行情确实是挺紧张的。当时我是满怀信心去的,心想这次一定要好好拷打面试官一番,结果没想到,自我介绍刚一结束,面试官就要开始拷打我了,直接让我手撕布隆过滤器?我当时心里可真是:我勒个豆啊(此处省略无数心里话)。虽然我对它的原理是了解的,但之前还真没有亲手写过。就这样,我开始了这次的手撕布隆过滤器之旅。不过话说回来,虽然非常离谱,但这种经历也算是某种成长吧,毕竟理论和实践之间总是有些距离的。
2024-10-18 22:58:30
1326
原创 一致性哈希算法带来的分布式系统设计思考
高扩展性:一致性哈希允许系统在增加或移除节点时,仅需重新分配受影响的数据,大大降低了数据迁移的成本。均匀分布:通过将数据均匀分布到多个节点上,一致性哈希能够有效地避免单点过载,提高系统的整体性能。高可用性:即使在部分节点失效的情况下,一致性哈希也能通过虚拟节点或其他节点来继续服务,保证系统的稳定性。灵活的应用场景:一致性哈希不仅适用于缓存、负载均衡、数据库分片等场景,还在CDN、P2P网络、分布式文件系统等多种领域有着广泛的应用。设计原则。
2024-10-17 22:07:26
1105
原创 MySQL新手向:对比常用存储引擎
不支持事务表锁设计支持全文索引再针对它最大特点,为什么不支持事务,我们来具体说说为什么?MyISAM 存储引擎之所以不支持事务(ACID特性),主要是因为它的设计目标是那些对数据库的查询操作远多于修改操作的应用。所以在设计上,MyISAM 强调的是简单性和速度,而不是数据的一致性或回滚能力,这使得它非常适合用于只需要很少写入操作或者写入操作不会频繁导致需要回滚的场景。总之,选择哪种存储引擎取决于具体的应用场景和需求。
2024-10-17 12:18:53
1137
原创 一个连接池实现就这么简单
在这个项目中,我实现了一个简单的连接池来管理连接对象,以解决频繁创建和关闭连接带来的性能问题。连接池通过预先创建一定数量的连接,并将它们存储在数组中,当应用程序请求连接时,直接提供已建立的连接,从而提高系统响应速度和资源利用率。并发编程:如何使用 Java 的原子类 () 和同步关键字 () 来保证线程安全。等待/通知机制:如何使用wait和notifyAll来协调多线程之间的协作。
2024-10-16 10:57:49
373
原创 谈谈我的理解:引用计数 vs 可达性分析
引用计数法因其实时性和简单性,适用于嵌入式等对回收延迟要求高的场景,但需要解决循环引用问题。而可达性分析法在处理复杂对象关系上更强,尤其适用于Java这类系统。同时选择哪种方法取决于应用的实时性、内存资源和引用结构。
2024-10-15 17:22:44
893
原创 开源:轻量级异步编排框架
一个简单实现的异步框架,通过注解对方法、类对象添加异步操作核心技术:Java + 线程池 + 动态代理/AOP我们的项目基本功能已经完善,但仍有一些扩展空间。通常情况下,可以使用JDK自带的结合自定义线程池来实现大部分异步编排的场景。然而,当需要对多个方法或类进行频繁的异步调用时,这种方式可能会变得繁琐且难以维护。为了解决这个问题,我们开发了这个异步框架。该框架通过简单的注解机制,允许开发者轻松地将同步方法转换为异步执行。这样不仅简化了异步编程的复杂度,还提高了代码的可读性和可维护性。
2024-10-14 10:49:04
732
原创 全新视角:带你重新认识订单失效处理
上述几种实现方式各有优缺点,选择哪种方式取决于具体的应用场景和需求。如果对性能要求不高且不需要分布式支持,可以考虑使用DelayQueue;如果需要高性能和分布式支持,可以选择使用 Redis 过期机制;如果已经使用了 Spring 框架,并希望利用其集成优势,可以使用 Spring Schedule 实现定时任务。在实际应用中,还需要综合考虑系统的扩展性、可靠性和维护成本等因素。推荐使用:在大多数情况下,采用MQ(消息队列)或定时任务MQ:适用于大型分布式系统,需要高可靠性和高并发处理能力。
2024-10-13 12:00:43
858
原创 如何实现热部署?
在这里,我们通过继承ClassLoader类,覆盖了的loadClass方法来实现特定的类加载逻辑。核心作用如下:负责加载包下的类,并从项目的 target 目录下的相应.class文件加载这些类。如果请求加载的类不属于指定的包,则交由父类加载器处理。加载过程中,它使用读取类文件,并调用将字节码转换为Class对象。最后,确保在读取完成后关闭输入流。这个类加载器适用于需要动态加载特定包内类的场景。/***//*** 这里可以获取项目的target根目录*/。
2024-10-12 21:54:15
453
原创 你真的了解一个Java类是如何被加载的吗?
在生活中,我们经常会被问到:“你有没有对象?”作为一名程序员,这个问题听起来就像是在请求我们编写代码一样——不就是一个简单的“new”操作嘛!/doge但是,你真的清楚在代码中“new”一个对象背后到底发生了什么吗?让我们一起探讨一下如何在Java中“new”一个对象吧。
2024-10-12 11:49:48
988
1
原创 dp算法练习【9】
给你一个整数n,返回和为n的完全平方数的最少数量。是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,149和16都是完全平方数,而3和11不是。
2024-09-10 15:03:30
965
原创 dp算法练习【7】
给你一个按排序的整数数组nums,返回组成的新数组,要求也按排序。平方后,数组变为 [16,1,0,9,100]排序后,数组变为 [0,1,9,16,100]非常简单,思路平方后排序。优化:插入法。
2024-09-08 15:12:17
1527
原创 dp算法练习【6】
给定两个字符串text1和text2,返回这两个字符串的最长的长度。如果不存在,返回0。一个字符串的是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。"ace""abcde""aec""abcde"两个字符串的是这两个字符串所共同拥有的子序列。3最长公共子序列是 "ace" ,它的长度为 3。3最长公共子序列是 "abc" ,它的长度为 3。0两个字符串没有公共子序列,返回 0。
2024-09-07 15:58:43
796
原创 dp算法练习【5】
给你一个二维整数数组envelopes,其中,表示第i个信封的宽度和高度。当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。请计算信封能组成一组“俄罗斯套娃”信封(即可以把一个信封放到另一个信封里面)。:不允许旋转信封。3最多信封的个数为11、排序后,动态规划 = > 超时2、排序后,贪心 + 二分查找。
2024-09-06 17:36:17
656
原创 dp练习【4】
给你一个由n个数对组成的数对数组pairs,其中且。现在,我们定义一种关系,当且仅当b < c时,数对才可以跟在后面。我们用这种形式来构造。找出并返回能够形成的。你不需要用到所有的数对,你可以以任何顺序选择其中的一些数对来构造。2最长的数对链是 [1,2] -> [3,4]。3最长的数对链是 [1,2] -> [4,5] -> [7,8]。
2024-09-05 21:49:37
911
原创 dp算法练习【3】
给定两个字符串s1和s2,返回使两个字符串相等所需删除字符的值的最小和。231在 "sea" 中删除 "s" 并将 "s" 的值(115)加入总和。在 "eat" 中删除 "t" 并将 116 加入总和。结束时,两个字符串相等,115 + 116 = 231 就是符合条件的最小和。403在 "delete" 中删除 "dee" 字符串变成 "let",将 100[d]+101[e]+101[e] 加入总和。在 "leet" 中删除 "e" 将 101[e] 加入总和。
2024-09-04 10:45:13
1075
原创 dp算法练习题 [2]
给你一个字符串s,找出其中最长的回文子序列,并返回该序列的长度。子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。4一个可能的最长回文子序列为 "bbbb"。s = "cbbd"2一个可能的最长回文子序列为 "bb"。
2024-09-03 22:00:23
665
原创 dp算法练习(1)
给你一个n x n的整数数组matrix,请你找出并返回通过matrix的的。可以从第一行中的任何元素开始,并从每一行中选择一个元素。在下一行选择的元素和当前行所选元素最多相隔一列(即位于正下方或者沿对角线向左或者向右的第一个元素)。具体来说,位置(row, col)的下一个元素应当是或者。
2024-09-02 20:21:53
485
原创 ES中Root mapping definition has unsupported parameters解决方案
ES中Root mapping definition has unsupported parameters解决方案
2024-07-14 21:00:29
1439
1
原创 Redis进阶知识个人汇总
一篇关于Redis持久化、主从架构、哨兵机制、分片集群、多级缓存、Redis最佳的键值设计、批处理优化、Redis底层的数据类型、Redis如何实现5种基本数据类型、Linux的5种网络模型以及IO多路复用在Redis网络模型中的应用、Redis的内存策略(包括过期key的处理和内存淘汰策略)。
2024-06-08 16:12:55
1339
原创 ArrayList源码讲解
底层采用的是数组队列,相当于动态数组。ArrayList内部使用一个可重新分配的Object数组来存储元素,这个数组会随着元素的添加自动增长以容纳更多的元素,这就是所谓的“动态数组”。先给出源码,及其一些注解,后面会对插入和扩容进行讲解。
2024-06-02 17:47:30
865
原创 面试题 - Java基础个人总结
一般个人感觉可以结合面向对象和面向过程的区别来回答?面向过程:是一种分析和解决问题的步骤,采用函数,一步一步的实现,性能较高。强调的是步骤与操作面向对象:把一个问题分解为多个对象,建立对象目的不是为了解决某一个步骤(不类似面向过程编程中的函数),而是为了描述一个事物在整个问题过程中产生的行为。然后最后通过调控多个对象,完成某一个问题。强调的是对象和数据抽象,以及通过这些抽象来表达和控制对象的行为和相互作用。面向对象有封装、继承、多态的特 性,所以易维护、易复用、易扩展。可以设计出低耦合的系统。
2024-06-02 14:27:13
908
原创 你真的了解HTTPS协议吗
在 HTTP 协议中有可能存在信息窃听或身份伪装等安全问题。使用 HTTPS 通信机制可以有效地防止这些问题。本文即将带大家来了解这些。
2024-05-27 00:11:48
712
原创 进程与线程
进程与线程:地址空间:进程是程序的一个实例,有子集独立的地址空间;线程是进程的子集,虽然有自己的程序计数器、栈、一组寄存器,但不拥有自己独立的地址空间分配:进程创建、调度、销毁由系统内核控制,创建销毁开销大线程创建与切换较进程更为轻量,不需重新分配资源通信进程之间相互隔离,除非通过一些机制进行通信线程之间通信较容易,可直接读写同一块内存区域并行与并发并行:多核 cpu下,每个 核(core) 同时调度运行线程(同时执行)并发:线程轮流使用CPU的做法称为并发。(非同时执行)
2024-05-24 10:00:30
390
原创 对文件下载进行限流处理
今天早上刷着B站,看到一个视频说有一个需求,如何实现下载限流,我就直接看了up是怎么做的:通过休眠线程 `Thread.sleep(1000);计算已经过去的时间,并根据限制速度计算出预期的时间。如果实际时间小于预期时间,则线程休眠一段时间,以控制下载速度。首先,我们需要确定要下载的文件的URL和保存路径。在循环中,将读取到的数据写入输出流,同时更新已读取的总字节数。主要实现思路:控制每次读取文件时循环的时间,以限制下载速度。最后,在循环结束后,断开与服务器的连接,释放资源。,用于存储每次读取的数据。
2024-05-22 10:17:16
440
原创 Java实现AES加密算法工具类
对称密钥算法:AES 使用相同的密钥进行加密和解密,因此被归类为对称密钥算法。这意味着发送方和接收方必须在通信前共享密钥。块加密算法:AES 将明文分成固定大小的块(128 比特),然后对每个块进行加密。在加密过程中,每个块使用相同的密钥独立加密,增强了安全性。密钥长度:AES 支持多种密钥长度,包括 128 位、192 位和 256 位。密钥越长,破解难度越大,但同时也增加了计算成本。替代算法:AES 有三种变体,分别使用不同的密钥长度,分别为 AES-128、AES-192 和 AES-256。
2024-05-02 18:15:33
1261
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人