- 博客(37)
- 收藏
- 关注
原创 B+树优势
红黑树:每个节点只存储两个节点,而IO一次会读取至少一页的数据(16K数据),而每个节点只存储一个数据,浪费IO操作,存储的节点少,树层数高,IO次数也多。1. 非叶子节点不存储数据,不需要在遍历树节点时进行IO操作,降低IO次数,IO友好。B树:每一层可以有多个节点,非叶子节点也存储数据,且叶子节点之间不互联。B+树:非叶子节点不存储数据,且叶子节点之前双向链表互联。2. 都是在叶子节点获取数据,查询效率更稳定。3. 叶子节点之间互联,便于扫库和范围查询。平衡二叉树:要大量的操作来维持树的平衡。
2024-09-06 22:55:15
439
原创 30万员工抽奖
30万个员工,其工卡号码分别是1~30万,抽10万个员工发奖品。有一个随机数生成函数rand()能够生成(0~65535]的整数,请写一个公平的抽奖程序,输出这10万个员工的工卡号码。
2024-09-06 22:54:02
352
原创 Java中syn锁状态
线程会在栈中新建一个锁记录Lock Record,锁记录中obj字段指向锁对象, 通过CAS指令将Lock Record的线程id存储在对象头的mark word中,同时也设 置偏向锁的标识为101,如果对象处于无锁状态则修改成功,代表该线程获得了偏向锁。通过CAS指令将Lock Record的地址存储在对象头的mark word中(数据进行交 换),如果对象处于无锁状态则修改成功,代表该线程获得了轻量级锁。记录锁状态的位置:在 Java 对象头里,有一块结构,叫Mark Word,里面会记录锁的状态。
2024-08-31 21:24:01
320
原创 HashMap 链表转红黑树的阈值为何为 8
密切相关:该原理阐明了在单位时间(或面积、体积)内,随机事件的平均发生次数遵循泊松分布。与一个重要的统计学原理——
2024-08-31 21:22:51
268
原创 针对小红书界面,你如何设计接口,包括主界面,打开帖子界面,有评论、点赞等等
针对小红书界面,你如何设计接口,包括主界面,打开帖子界面,有评论、点赞等等
2024-08-29 00:11:56
478
原创 乱序数组中怎么找到中位数
合并的时候先将各个数组排序,然后采用n路归并的方式不断的将有序值取出(会用到数组指针,每一个元素对应其数组被取出元素的进度),直至取出到总长度的一半,时间复杂度为(nlogx)+O(n*TL),其中前者为各个数组的排序的时间复杂度之和(假设最长的数组长度为x),后者TL为这n个数组的总长度。每次从堆中取出最小(或最大)元素,直到达到总长度的一半,以此找到中位数。将所有数组合并成一个大数组,然后对这个数组进行排序,最后找到中位数。这种方法简单直接,但如果数组总长度非常大时,可能效率不高。
2024-08-27 12:49:55
611
原创 Spring Boot启动流程
从 spring.factories 文件中加载所有列出的 ApplicationContextInitializer 实现,并将它们设置到 SpringApplication实例中,以便在应用上下文的初始化阶段执行它们。其中第三步,加载初始化器是Springboot的自动配置 的核心,从Spring,factories文件中加载并实例化指定类型的类.这一步,是Spring启动的核心步骤,这一步骤包括了实例化所有的 Bean、设置它们之间的依赖关系以及执行其他的初始化任务。
2024-08-21 00:51:33
633
原创 Paxos算法
分布式系统共识算法:共识算法的作用是让分布式系统中的多个节点之间对某个提案(Proposal)达成一致的看法Paxos 算法主要包含 2 个部分:Basic Paxos 中存在 3 个重要的角色:
2024-08-19 00:05:44
524
原创 限流算法思想
每隔 1 秒移动一次,每个窗口一秒只能处理不大于 60(请求数)/60(窗口数) 的请求, 如果当前窗口的请求计数总和超过了限制的数量的话就不再处理其他请求。其原理是将时间划分为固定大小的窗口,在每个窗口内限制请求的数量或速率,即固定窗口计数器算法规定了系统单位时间处理的请求数量。桶中装的是令牌,以一定的速率生成令牌,桶满了,就不能添加令牌了,到来的请求需要在桶中取令牌,取不到令牌的任务会被丢弃。很显然, 当滑动窗口的格子划分的越多,滑动窗口的滚动就越平滑,限流的统计就会越精确。优点:实现简单,易于理解。
2024-08-19 00:04:51
412
原创 Ping一个网络的过程
③发起 Ping 命令的设备接收到 ICMP Echo Reply 消息后,计算并显示从发送 Echo Request 到接收到 Echo Reply 的时间(通常称为往返时间 RTT,Round-Trip Time),以及可能的丢包情况。①当执行 Ping 命令,如ping javabetter.cn,Ping 首先解析域名获取 IP 地址,然后向目标 IP 发送一个 ICMP Echo Request 消息。Ping 通常会发送多个请求,以便提供平均响应时间和丢包率等信息,以便我们了解网络连接的质量。
2024-08-17 13:23:41
490
原创 Cookie和Session的区别
Session 指的就是服务器和客户端一次会话的过程。它是另一种记录客户状态的机制。不同的是 cookie 保存在客户端浏览器中,而 session 保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上,这就是 session。Cookie 是保存在客户端的一小块文本串的数据。客户端向服务器发起请求时,服务端会向客户端发送一个 Cookie,客户端就把 Cookie 保存起来。在客户端下次向同一服务器再发起请求时,Cookie 被携带发送到服务器。
2024-08-17 13:23:07
380
原创 memory引擎的hash索引结构怎么实现的
类似hashmap 1.7中的 将索引字段获得hash值,进行映射确定桶下标位置其中我们根据建立索引的列(name)由哈希函数计算出hashkey后再和桶数取模,将name放进对应的桶中,由此我们也就不难看出,hash表中的元素没有任何顺序可言,所以它也就更适合做等值查询
2024-08-16 00:02:23
149
原创 什么是索引下推?
索引条件下推优化(Index Condition Pushdown (ICP) )是 MySQL5.6 添加的一项索引优化功能,它允许存储引擎在索引遍历过程中,执行部分 WHERE字句的判断条件,直接过滤掉不满足条件的记录,从而减少回表次数,提高查询效率。索引条件下推优化可以减少存储引擎查询基础表的次数(减少回表次数),也可以减少 MySQL 服务器从存储引擎接收数据的次数(减少存储引擎层和 Server 层的数据传输量)。
2024-08-16 00:01:46
267
原创 IO流用到的设计模式
IO流用到的设计模式装饰器(Decorator)模式 可以在不改变原有对象的情况下拓展其功能。例如,可以通过 BufferedInputStream(字节缓冲输入流)来增强 FileInputStream 的功能。 适配器(Adapter Pattern)模式 主要用于接口互不兼容的类的协调工作。例如,InputStreamReader 使用 StreamDecoder (流解码器)对字节进行解码,实现字节流到字符流的转换,OutputStreamWriter 使用StreamEncoder(流编码器
2024-08-13 13:19:40
526
原创 数据库幻读场景
4.A再去查询可以查询到了,因为新版本数据的事务id改为了A的,A就可以访问到了。3.此时记录对于A是不可见的,此时A去更新这条记录(1.A事务去查询一条不存在的记录。2.B事务插入这条记录。
2024-08-11 18:42:06
690
原创 RabbitMQ知识总结
这种模式,才是所谓的RabbitMQ的高可用模式,跟普通集群模式不一样的是,你创建的queue,无论元数据(元数据指RabbitMQ的配置数据)还是queue里的消息都会存在于多个实例上,然后每次你写消息到queue的时候,都会自动把消息到多个实例的queue里进行消息同步。这种方式简单,装上插件,声明交换机的时候将delayed=“true”,然后发送消息设置setDelay()发生消息积压(满)时,会刷盘一些消息到硬盘上,腾出空间,再接收消息,这个过程是阻塞的。1.一个消息只被消费了一次。
2024-08-09 12:52:06
723
原创 SQL基本语法总结
drop table if exists 表名;create table ‘表名’(‘列名‘ int not null;‘列名‘ varchar(32) not nulldrop table 表名。
2024-08-09 12:51:02
616
原创 设计模式七大原则
依赖倒转原则要求我们在程序代码中传递参数时或在关联关系中,尽量引用层次高的抽象层类,即使用接口和抽象类进行变量类型声明、参数类型声明、方法返回类型声明,以及数据类型的转换等,而不要用具体类来做这些事情。根据接口隔离原则,当一个接口太大时,我们需要将它分割成一些更细小的接口,使用该接口的客户端仅需知道与之相关的方法即可。一个类只负责一个功能领域中的相应职责,或者可以定义为:就一个类而言,应该只有一个引起它变化的原因。使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口。
2024-08-07 13:05:55
383
原创 通过拦截器给默认字段赋值,如何实现mybatis拦截器?
无需修改已有代码,如果使用AOP依然需要在每个位置添加注解,而Mybatis拦截器无需修改。
2024-08-05 00:09:55
266
原创 Linux常用命令
显示网络接口的配置信息(在较新的 Linux 发行版中已被 ip 命令替代)。cat 文件名 | grep 关键字 -C 10。:显示网络连接、路由表和网络接口信息。:实时显示网络流量和连接的工具。查看cpu:lscpu、top。
2024-08-04 18:45:01
424
原创 CAP理论与BASE理论初探
即当发生网络分区(因为某些故障某些节点之间不连通)时,如果我们要继续服务,那么一致性和可用性只能二选一,也就是说有CP架构、AP架构,如果网络分区正常的话(系统在绝大部分时候所处的状态),也就说不需要保证 P 的时候,C 和 A 能够同时保证。Basically Available(基本可用)、Soft-state(软状态) 和 Eventually Consistent(最终一致性)Consistency(一致性)、Availability(可用性)、Partition Tolerance(分区容错性)
2024-08-04 03:09:05
462
原创 三次握手每次报文丢失会发生什么?
默认重发五次,之后自动关闭连接进入CLOSED状态,服务端建立连接失败;而此时客户端认为自己已经建立连接成功,因此开始向服务端发送数据,但是服务端的 accept()系统调用已经返回,此时不在监听状态,因此服务端接收到客户端发送来的数据时会发送 RST 报文给客户端,消除客户端单方面建立连接的状态。服务端不会进行任何的动作,而客户端由于一段时间内没有收到服务端发来的确认报文,等待一段时间后会重新发送 SYN 报文,如果仍然没有回应,会重复这个过程,直到发送次数超过最大重传次数限制,就会返回连接建立失败。
2024-08-03 12:24:53
260
原创 半连接与SYN Flood攻击
在短时间内,伪造不存在的 IP 地址, 向服务器发送大量 SYN 报文但是不回复。当服务器回复 SYN+ACK 报文后,不会收到 ACK 回应报文,那么 SYN 队列里的连接旧不会出对队,久⽽久之就会占满服务端的 SYN 接收队列(半连接队列),使得服务器不能为正常⽤户服务。状态, 同时在内部创建了两个队列:半连接队列(SYN 队列)和全连接队列(ACCEPT 队列)。半连接队列存放的是三次握手未完成的连接,全连接队列存放的是完成三次握手的连接。TCP 进入三次握手前,服务端会从。
2024-08-03 12:24:13
296
原创 数据库中的死锁问题
两个事务,事务A先获取相同区间的间隙锁,然后事务B也获取相同区间的间隙锁,这是两个事务都持有相同的间隙锁,间隙锁是不冲突的(间隙锁的意义只在于阻止区间被插入,因此是可以共存的。此时,事务A插入数据或者别的操作,检测到当前位置有间隙锁,会生成插入意向锁,锁的状态设置为等待状态,等待B的间隙锁释放;事务B插入数据,也检测到当前位置有间隙锁,也会生成插入意向锁,等待A的间隙锁释放,此时就发生了死锁。只要系统发生死锁,这些条件必然成立,但是只要破坏任意一个条件就死锁就不会成立。
2024-08-01 15:42:21
360
原创 MySQL的锁分类
使整个数据库就处于只读状态,会阻塞其他线程和主要应用在全库逻辑备份加上全局锁,意味着整个数据库都是只读状态。那么如果数据库里有很多数据,备份就会花费很多的时间,关键是备份期间,业务只能读数据,而不能更新数据,这样会造成业务停滞。如果数据库的引擎支持的事务支持可重复读的隔离级别,那么在备份数据库之前先开启事务,会先创建 Read View,然后整个事务执行期间都在用这个 Read View,而且由于 MVCC 的支持,备份期间业务依然可以对数据进行更新操作。
2024-08-01 15:41:25
586
原创 HashMap线程不安全场景
JDK1.7 中的 HashMap 使用的是头插法插入元素,在多线程的环境下,扩容的时候头插法可能会导致链表中的节点指向错误的位置,就有可能导致出现环形链表,进而使得查询元素的操作陷入死循环无法结束。因为计算出来的位置可能会被其他线程的 put 覆盖。本来哈希冲突是应该用链表的,但多线程时由于没有加锁,相同位置的元素可能就被干掉了,也就是说覆盖。线程 1 执行 put 时,因为元素个数超出阈值而导致出现扩容,线程 2 此时执行 get,就有可能出现这个问题。
2024-07-30 13:14:27
478
原创 基于Redis实现的分布式锁-[setnx命令、Redission]
当线程1加锁成功后,master节点数据会异步复制到slave节点,此时当前持有Redis锁的master节点宕机,slave节点被提升为新的master节点,假如现在来了一个线程2,再次加锁,会在新的master节点上加锁成功,这个时候就会出现两个节点同时持有一把锁的问题。2.在高并发下,一个业务有可能会执行很快,先客户1持有锁的时候,客户2来了以后并不会马上拒绝,它会自旋不断尝试获取锁,如果客户1释放之后,客户2就可以马上持有锁,性能也得到了提升。
2024-07-30 13:12:53
209
原创 JVM的常见调优参数、调优工具
1.堆大小:-Xms -Xmx2.堆新生代与老年代比例:-XX:newSize -XX:MaxNewSize3.新生代中s区和e区比例:-XXSurvivorRatio4.升代年龄:-XX:MaxTenuringThreshold5.大文件直接分配在老年代中的阈值:-XXPetenureSizeThreshold1.栈大小:-Xss1.元空间大小 -XX:MetaspaceSize -XX:MetaspaceSize1.设置垃圾回收器:-XX:+UseG1GC -XX:+UseParallelGC 2.
2024-07-28 03:21:42
234
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人