
日更计划
文章平均质量分 83
日更计划
Sivan_Xin
Hi,终于等到你。爱好:Coding&Debug。博客内容:后端方向。喜欢和优秀的人做有挑战的事!
展开
-
【面试实战】计算机网络面试实战
🙋♂答:IP地址用来标识网络中的唯一一台设备。IP 地址(IPv4 地址)由 32 位正整数来表示,IP 地址在计算机是以二进制的方式处理的。IP使用点分十进制来表示,也就是8位一组,共4组,用分割,再将每组转换为十进制。发送方发送数据,设置目标设备的IP地址作为数据包的目的地。路由:如果目标设备与发送方不再同一个子网内,发送方将数据包发送到默认网关中(路由器)。之后路由器查询路由表,根据目的地址转发给下一跳,直到数据包到达目标设备所在的子网。原创 2023-05-24 20:53:04 · 1093 阅读 · 0 评论 -
【面试实战】Redis缓存设计
🙋♂答:简名达意。雪崩,就是大量缓存数据在同一时间失效,或者Redis宕机。此时有大量的用户请求无法在Redis处理。直接访问数据库,导致数据库压力剧增,可能造成数据库宕机、等一系列连锁反应,最终整个系统崩溃,这就是缓存雪崩的问题。🙋♂答:缓存击穿可以认为是缓存雪崩的子集。击穿,指的是某个热点数据过期,大量请求访问该热点数据,就无法从缓存中获取,导致MySQL服务器压力剧增,可能引发宕机等一系列问题,最终导致系统崩溃,就是缓存击穿的问题。🙋♂答:缓存穿透,就是大量请求访问。原创 2023-05-22 20:55:52 · 1193 阅读 · 0 评论 -
【面试实战】Redis过期删除与内存淘汰
🙋♂答:过期删除策略就是删除过期键值对采用的方法。Redis采用惰性删除 + 定期删除两种策略。惰性删除:就是在每次访问key的时候,都先对key的过期时间进行检查。如果过期,就删除,返回null给客户端;没有过期就正常返回。定期删除:会每隔10S 检查一次数据库,先从过期字典中随机抽取20个key,检查这20个key是否过期。如果key的过期数量大于25%,继续重复进行检查;反之停止继续删除。原创 2023-05-21 22:46:50 · 540 阅读 · 0 评论 -
【面试实战】Redis持久化面试题
🙋♂答:Redis的数据都是存储在内存中的,当Redis重启后,内存中的数据就会丢失,但是Redis实现了数据持久化的方式。主要通过AOF日志和RDB日志来实现。🙋♂答:RDB快照记录某一瞬间的内存数据,记录实际的数据。在恢复数据时,比AOF的效率更高。原创 2023-05-17 21:18:18 · 755 阅读 · 0 评论 -
【面试题】面试官:昨天问了MySQL,今天问问Redis
计算出剩余的空间大小,可以用来判断空间是否满足修改需求,如果不满足的话,就会自动将 SDS 的空间扩展至执行修改所需的大小,然后才执行实际的修改操作,所以使用 SDS 既不需要手动修改 SDS 的空间大小,也不会出现前面所说的缓冲区溢出的问题。因此, SDS 的 API 都是以处理二进制的方式来处理 SDS 存放在 buf[] 里的数据,程序不会对其中的数据做任何限制,数据写入的时候时什么样的,它被读取时就是什么样的。在更新数据的时候,只更新缓存,同时将缓存数据设置为脏的,然后立马返回,并不会更新数据库。原创 2023-05-08 22:40:21 · 529 阅读 · 1 评论 -
【面试题】面试官:说说你对MySQL的了解
今天给大家推荐几道常见的MySQL面试题,来试试你能答对几道?原创 2023-05-07 21:12:18 · 639 阅读 · 0 评论 -
【面试必备】Java集合面试题全总结
Java集合由哪两大接口派生而来?Collection接口,主要用于存放单一元素。下面有三个主要的子接口:List、Set、Queue。Map接口:主要用于存放键值对。List、Set、Queue、Map四者的区别?List中存储有序、可重复元素。Set中存储无序、不可重复元素。Queue按照特定顺序进行排序,存储有序、可重复元素。Map存储键值对。key是无序的,不可重复;value是无序的,可重复。如何选用集合?我们只需要存放元素值时,就选用Collection接口的集合。原创 2023-04-20 00:08:25 · 424 阅读 · 0 评论 -
【4.18】贪心算法入门必刷题
相当于(prices[3] - prices[2]) + (prices[2] - prices[1]) + (prices[1] - prices[0])。那么根据prices可以得到每天的利润序列:(prices[i] - prices[i - 1])…(prices[1] - prices[0])。而i也是从0开始找的,如果碰到了最远的距离,说明不能继续往前走了,此时就要比较这个最远覆盖距离是否已经超过了界限。假如第0天买入,第3天卖出,那么利润为:prices[3] - prices[0]。原创 2023-04-18 23:13:13 · 690 阅读 · 0 评论 -
【4.17】贪心算法入门
贪心的本质是选择每一阶段的局部最优,从而达到全局最优。刷题或者面试的时候,手动模拟一下感觉可以局部最优推出整体最优,而且想不到反例,那么就试一试贪心。原创 2023-04-17 22:32:31 · 393 阅读 · 0 评论 -
【4.14】今天讲两道TCP面试题
因为TCP是字节流的协议,TCP层必须要保证收到的字节数据是完整并且有序的,当序列号较低的TCP段在网络中丢失,即使序列号较高的TCP段已经被接受了,但是应用层也**无法从内核读取这段数据。HTTP/2多个请求是跑在一个TCP连接中的,当TCP连接丢包,整个TCP就要等待重传,那么就会阻塞该TCP连接中的所有请求,所以HTTP/2队头阻塞问题就是因为TCP协议导致的。因为TLS是在应用层实现的握手,TCP是在内核实现的握手,这两个握手过程无法结合在一起,总是得先完成TCP握手,才能进行TLS握手,所以。原创 2023-04-14 18:29:26 · 443 阅读 · 0 评论 -
【4.13(补)】二叉搜索树的遍历、插入、删除
二叉搜索树的删除涉及到五个方面,尤其要注意,当删除的节点左右都有子节点时,要将左子节点放到右子节点的最左边。这才符合二叉搜索树的原则。因为二叉搜索树是有序的,第一次找到p和q中间的值,就是最近的公共祖先。本题只需要找到空的节点进行插入即可。通过保存父节点的值,进行插入操作。通过函数的返回值,进行插入操作。原创 2023-04-14 11:17:20 · 420 阅读 · 0 评论 -
【4.10】回溯在二叉树中的应用
为叶子节点,则要在path中排除该节点。总之,本题需要使用父节点来判断节点是不是不满足条件的右子节点,如果是,就将其弹出即可。解法二:使用回溯算法,进入一个节点前,先增加该节点深度,退出一个节点后,减去该节点深度。构造一个二叉树,就在递归中去构造。函数返回结果就是上一层递归中父节点的左右子节点。在递归进右叶子节点后,只对右叶子节点进行操作即可。首先将所有的节点都加入path中。解法一:简单的层序遍历。原创 2023-04-11 00:15:39 · 337 阅读 · 0 评论 -
【leetCode 257】一道算法题延伸出的Java内存知识
在递归遍历中,如果我们使用全局变量,则每次递归中大家都共享这个变量。在这类查找路径的问题中就会出现一些错误。也就是当前深度优先到了一条路径,在转到另一条路径时,之前的结果还在全局变量中保存,但是此时已经不是我们想要的路径了。所以应对这种问题,我给出了两种方案每个dfs方法中定义一个局部变量。局部变量是保存在栈帧的局部变量表中,方法的调用需要通过栈来进行传递,每次调用方法,都有一个对应的栈帧被压入栈中,每一个方法掉用结束后,都有一个栈帧被弹出。这样一来,就可以避免全局变量出现的问题。原创 2023-04-09 21:06:42 · 310 阅读 · 0 评论 -
【4.7】使用Spring session实现Session共享
下一次访问请求时,请求的头部会带有Cookie。Spring Session提供了一套创建和管理Servlet HTTPSession的方案,Spring Session提供了集群Session功能,默认采用外置的Redis来存储Session数据,以此来解决Session共享问题。如果没有Session共享,session的信息放在内存中,如果Tomcat关闭,内存中的Session就会销毁。在实现共享后,只要Cookie中的Session ID 无法改变,多实例的任意一个被销毁,都不会影响用户访问。原创 2023-04-07 22:34:01 · 504 阅读 · 0 评论 -
【4.6】Spring Security 在项目中的使用
用户认证授权信息【通过实现UserDetailsService接口】返回一个User对象(封装了authorities[权限])。不是,这里自定义异常处理,使用AccessDeniedHandler,返回一个错误页面,更友好。添加依赖,配置Filter,配置Spring Security三个步骤,就可以集成使用Spring Security。在使用Spring Security之前,需要配置,这里使用Java类配置的方法。实现用户授权,也就是只有授权后才可以使用该功能。只有在有权限时,按钮才可用。原创 2023-04-06 23:03:09 · 417 阅读 · 0 评论 -
【4.5】(蓝桥备战)动态规划、KMP算法
前缀表的原理:由于我们失败的位置是后缀子串(aa)的后面(在f匹配失败了),那么就要找到相同的前缀的后面重新匹配。由于前缀就是从下标0开始的,所以前缀的后面就是前缀的长度,就是前缀表对应的值。一般KMP使用next数组,其实。原创 2023-04-05 23:11:45 · 220 阅读 · 0 评论 -
【4.3】(蓝桥备战)动态规划经典例题
数论:两个数的最大公因数不是1(不为互质),说明可能最大公因数是奇数/偶数,那么就凑不出来偶数或奇数,(最大公因数是奇数,凑不出偶数,反之成立)凑不出来的个数是无限个。动态规划:如果能凑出j,那么一定能凑出j + num[i],即为找到重叠子问题。也找到了递推公式推导方法。小明想知道,长度为 m,每个数都是 1 到 n 之间的正整数的摆动序列一共有多少个。如果一个序列的奇数项都比前一项大,偶数项都比前一项小,则称为一个摆动序列。原创 2023-04-05 00:02:00 · 365 阅读 · 0 评论 -
【4.3蓝桥备战】小朋友崇拜圈、正则问题
最后返回结果时,也要比较一次current和max,因为可能最后一次current没有被统计。DFS函数定义:计算当前。原创 2023-04-03 23:23:56 · 298 阅读 · 0 评论 -
【4.2】蓝桥杯真题训练(省赛备考)
蓝桥杯是国内著名的计算机比赛,每年吸引了数以万计的学生参加。在比赛中,参赛者需要通过多个难度级别的编程题目,展现他们的算法与编程能力。随着蓝桥杯比赛的不断升温,题目难度和复杂度也在不断提高。因此,对于参赛者来说,熟悉和掌握蓝桥杯题目解法是至关重要的。在本文中,今天给大家带来四种省赛真题题型,都是很常考的题型,可以多加练习。原创 2023-04-02 21:28:12 · 268 阅读 · 0 评论 -
【4.1】Socket编程、TCP挥手
如果关闭方调用shutdown()函数关闭连接,指定了之关闭发送方向,而接收方向没有关闭,那么意味着主动关闭方还是可以接收数据的。调用close(),说明没有数据要传输了,服务端收到FIN后调用会read,返回EOF,当服务器端发送FIN,服务端会调用close(),客户端收到后进入2MSL的计时,经过2MSL后,进入CLOSE状态。服务端处于 CLOSE_WAIT 状态时,调用了 close 函数,内核就会发出 FIN 报文,同时连接进入 LAST_ACK 状态,等待客户端返回 ACK 来确认连接关闭。原创 2023-04-01 22:50:56 · 577 阅读 · 0 评论 -
面试官:说说你对TCP协议的了解
TCP头格式有哪些序列号:每个TCP都有一个标识,通过SYN包传给接收端,每发送一次数据,就累加数值,目的是防止TCP在网络中乱序。确认应答号:确认应答号表示下一个分配的序列号,接收端主机收到确认应答号,表示收到该应答号之前的网络包。目的是解决TCP包在网络中丢失的问题。控制位ACK:ACK为1,表示收到之前的消息,确认应答位有效。RST:RST为1,表示发生异常,连接强制中断。SYN:SYN为1,表示建立连接,序列化进行初始化。FIN:FIN为1,表示希望关闭连接,之后不会有数据发送。原创 2023-03-31 22:37:25 · 194 阅读 · 0 评论 -
【3.30】如何优化TCP?三次握手、四次挥手分析
TCP 是面向连接的、可靠的、双向传输的传输层通信协议,所以在传输数据之前需要经过三次握手才能建立连接。我们可以通过调整三次握手中的参数,来提高TCP三次握手的性能。上图可见,客户端和服务端都可以针对三次握手优化性能,但是两者的优化方式是不同的。三次握手建立连接的首要目的是同步序列号。只有同步了序列号才有可靠传输,TCP的许多特性都依赖于序列号实现,比如流量控制、丢包重传。SYN的全称就叫做Synchronized Sequence Numbers(同步序列号)客户端优化优化SYN_SENT状态SYN_SE原创 2023-03-30 22:34:47 · 499 阅读 · 0 评论 -
【3.29】Redis持久化详解(含思维导图)
所以 Redis 在使用 bgsave 快照过程中,如果主线程修改了内存数据,不管是否是共享的内存数据,RDB 快照都无法写入主线程刚修改的数据,因为此时主线程(父进程)的内存数据和子进程的内存数据已经分离了,子进程写入到 RDB 文件的内存数据只能是原本的内存数据。子进程带有主进程的数据副本,这里使用子进程而不是线程,因为如果是使用线程,多线程之间会共享内存,那么在修改共享内存数据的时候,需要通过加锁来保证数据的安全,而这样就会降低性能。Redis的读写操作都是在内存中进行的,所以Redis的性能高。原创 2023-03-29 22:27:31 · 330 阅读 · 0 评论 -
❤️独特的算法❤️:一文解决编辑距离问题
392. 判断子序列 - 力扣(LeetCode)对比1143T,1143是两个字符串都可以删元素,而本题如果删元素是删除字符串t,因为只有t有多余的字符串。115. 不同的子序列 - 力扣(LeetCode),与392. 判断子序列 - 力扣(LeetCode)类似,也是删除元素,并且只能删除其中有多余字符的字符串。不同的是,在s[i - 1]与t[i - 1]相等时,也要考虑不使用s[i - 1]的情况。583. 两个字符串的删除操作 - 力扣(LeetCode)与1143题思路基本一致。原创 2023-03-29 00:40:00 · 266 阅读 · 0 评论 -
【基础篇】Java类加载器详解
对于初始化阶段,虚拟机严格规范了有且只有 5 种情况下,必须对类进行初始化(原创 2023-03-27 22:52:09 · 829 阅读 · 0 评论 -
❤️独特的算法❤️:一文解决买卖股票问题
投资股票是一种广泛使用的财务手段,但是如何最大化收益是一个非常困难的问题。在这篇文章中,我们将介绍一种高效的算法来解决这个问题:买卖股票问题算法。原创 2023-03-26 22:55:16 · 302 阅读 · 0 评论 -
JVM垃圾回收详解
引用类型是Java垃圾回收机制的重要组成部分,它们可以帮助开发者更好地控制对象的生命周期,有效避免内存泄漏和OutOfMemoryError等问题。JDK1.2 以后,Java 对引用的概念进行了扩充,将引用分为强引用、软引用、弱引用、虚引用四种(引用强度逐渐减弱)强引用(StrongReference):最常见的引用类型。当我们使用 new 创建一个对象时,默认是强引用。只要强引用存在,垃圾回收器就不会回收对象。原创 2023-03-25 14:00:29 · 614 阅读 · 0 评论 -
【3.24】Mybatis常见面试题
原理是,MyBatis 解析 A 标签,发现 A 标签引用了 B 标签,但是 B 标签尚未解析到,尚不存在,此时,MyBatis 会将 A 标签标记为未解析状态,然后继续解析余下的标签,包含 B 标签,待所有标签解析完毕,MyBatis 会重新解析那些被标记为未解析的标签,此时再解析 A 标签时,B 标签已经存在,A 标签也就可以正常解析完成了。手写sql,为优化SQL提供了可能。创建目标对象的代理对象,调用目标方法,进入拦截器方法,拦截器发现是null值,就会发送sql语句,把具体值查询上来。原创 2023-03-24 20:48:37 · 550 阅读 · 0 评论 -
【3.23】Spring常见面试题
什么是Spring框架?Spring是一个为了简化企业级开发的开源框架。Spring提供的功能主要是Ioc和AOP。即控制反转和面向切面编程。Spring包含的模块有哪些?是Spring的核心模块,主要提供IoC依赖注入功能。具体的有:spring-core:Spring框架基本的核心组件,包含很多关键类。spring-beans:提供对bean的创建、解析等功能的支持。spring-context:给Spring提供一个运行时环境,保存各个对象的状态和相互的依赖关系。AOP模块,原创 2023-03-23 21:48:06 · 226 阅读 · 0 评论 -
【3.22】操作系统内存管理(整理)、Java并发
我们想要同时在内存中运行多个程序,就需要把进程所使用的地址隔离,所以使用了虚拟内存。简单来说,虚拟内存地址是程序使用的内存地址。物理内存地址是实际存在硬件里面的地址。,进程持有的虚拟地址会通过 CPU 芯片中的内存管理单元(MMU)的映射关系,来转换变成物理地址,然后再通过物理地址访问内存。操作系统使用和的方式管理虚拟地址与物理地址之间的关系。:程序是由若干个逻辑分段组成的,如可由代码分段、数据分段、栈段、堆段组成。不同的段是有不同的属性的,所以就用分段()的形式把这些段分离出来。原创 2023-03-22 21:36:46 · 771 阅读 · 1 评论 -
【3.21】TCP/IP体系结构、Java并发编程
TCP/IP网络模型自顶向下一共分为4层。应用层OSI七层网络体系中,将应用层继续划分传输层传输层为应用层,主要使用TCP和UDP两个协议。比如TCP协议可以实现可靠传输,进行流量控制、超时重传、拥塞控制等。TCP 的全称叫传输控制协议(),大部分应用使用的正是 TCP 传输层协议,比如 HTTP 应用层协议。TCP 相比 UDP 多了很多特性,比如流量控制、超时重传、拥塞控制等,这些都是为了保证数据包能可靠地传输给对方。原创 2023-03-21 20:16:51 · 286 阅读 · 0 评论 -
【3.20】BFS算法、操作系统进程管理(整理)、Java并发面试题
互斥锁与自旋锁最底层的两种锁就是互斥锁和自旋锁,有很多高级的锁都是基于它们实现的。互斥锁加锁失败后,线程会释放 CPU,给其他线程;互斥锁是一种「独占锁」,比如当线程 A 加锁成功后,此时互斥锁已经被线程 A 独占了,只要线程 A 没有释放手中的锁,线程 B 加锁就会失败,于是就会释放 CPU 让给其他线程,既然线程 B 释放掉了 CPU,自然线程 B 加锁的代码就会被阻塞。自旋锁加锁失败后,线程会忙等待,直到它拿到锁;原创 2023-03-20 21:26:35 · 491 阅读 · 0 评论 -
面试官:说一下MySQL中的锁机制吧
当查询的记录存在时,扫描到的二级索引记录加的是next-key lock,扫描到的第一个不符合条件的二级索引记录,next-key 锁会退化成间隙锁。RR隔离级别下,会存在幻读的问题,InnoDB为了解决可重复读隔离级别下的幻读问题,就引出了next-key 锁,是记录锁和间隙锁的组合。的范围查询,如果“等于”的等值查询的记录是存在于表中,那么该记录的索引中的 next-key 锁会。当查询的记录不存在时,扫描到第一条不符合条件的二级索引记录, next-key 锁会退化成间隙锁。原创 2023-03-19 16:24:59 · 3152 阅读 · 0 评论 -
【3.18】MySQL事务整理
在提到隔离级别之前,注意并不是所有的引擎都能支持事务,比如 MySQL 原生的 MyISAM 引擎就不支持事务,也正是这样,所以大多数 MySQL 的引擎都是用 InnoDB。如果记录的 trx_id 值小于Read View中的 min_trx_id 值,表示这个版本的记录是在创建 Read View。在早期的数据库中,只有读读之间的操作才可以并发执行,读写,写读,写写操作都要阻塞,这样就会导致MySQL的并发性能极差。,多个事务如果发生读写冲突,后访问的事务必须等前一个事务执行完成,才能继续执行;原创 2023-03-18 19:41:11 · 328 阅读 · 0 评论 -
【3.17】MySQL索引整理、回溯(分割、子集问题)
但是,当单表数据库到达某个量级的上限时,导致内存无法存储其索引,使得之后的 SQL 查询会产生磁盘 IO,从而导致性能下降,所以增加硬件配置,可能会带来立竿见影的性能提升。,就引出了二级索引(非聚簇索引/辅助索引),它也是利用了 B+ 树的数据结构,但是二级索引的叶子节点存放的是主键值,不是实际数据。)、 count(主键字段)在执行的时候,如果表里存在二级索引,优化器就会选择二级索引进行扫描。索引覆盖,就是当查询的数据是主键值时,那么在二级索引就能查询到,不用再去聚簇索引查,就表示发生了索引覆盖,原创 2023-03-17 21:51:19 · 617 阅读 · 0 评论 -
【3.16】回溯法、关于网络的LInux命令
回溯法是一种搜索方式。回溯是递归的副产品,有递归就会有回溯。因为回溯的本质是穷举,穷举所有可能,然后选出我们想要的答案,如果想让回溯法高效一些,可以加一些剪枝的操作,但也改不了回溯法就是穷举的本质。回溯法,一般可以解决如下几种问题:回溯法解决的问题都可以抽象为树形结构,是的,我指的是所有回溯法的问题都可以抽象为树形结构!因为回溯法解决的都是在集合中递归查找子集,集合的大小就构成了树的宽度,递归的深度,都构成的树的深度。递归就要有终止条件,所以必然是一棵高度有限的树(N叉树)。回溯法模板回溯函数模板返回值以及原创 2023-03-16 21:47:20 · 117 阅读 · 0 评论 -
【3.15】Redis缓存、高可用,网络系统,二叉树
Redis是内存数据库,我们经常将MySQL中的数据缓存在Redis中,这样可以提高读写性能。缓存异常的三个问题就是:缓存雪崩、击穿、穿透。缓存雪崩(无缓存,但大量请求)当大量缓存数据在同一时间过期(失效)或者Redis宕机,此时有大量的用户请求都无法在Redis中处理,请求直接访问数据库,导致数据库压力剧增,可能造成数据库宕机、等一系列连锁反应,最终整个系统崩溃,这就是缓存雪崩的问题。针对大量数据同时过期而引发的缓存雪崩问题,常见的应对方法有下面这几种:均匀设置过期时间;原创 2023-03-15 21:24:05 · 775 阅读 · 3 评论 -
【3.14】Redis过期删除、内存淘汰、主从复制,操作系统文件系统,设备管理
这样程序员不需要了解文件系统的工作原理,只需要了解 VFS 提供的统一接口即可。文件的使用使用文件之前应先打开文件。使用。原创 2023-03-14 20:05:57 · 307 阅读 · 0 评论 -
【3.13】栈与队列、进程调度
优先级队列:其实**就是一个披着队列外衣的堆**,因为优先级队列对外接口只是从队头取元素,从队尾添加元素,再无其他取元素的方式,看起来就是一个队列。而且优先级队列内部元素是自动依照元素的权值排列。原创 2023-03-13 21:03:21 · 252 阅读 · 0 评论 -
【3.12】二叉树的前中后遍历
二叉树的前序位置只能获取父节点传递过来的值,但是后序位置的代码不仅可以获取参数数据,还可以获取。前序遍历,先取中间节点的值,按照中左右的顺序进行遍历。中序遍历,先取左子节点的值,按照左中右的顺序遍历。:遍历完左子树之后,即将要遍历子树之前。:即将离开当前节点之前。指的是几个不同的位置。:进入下一个节点之前。原创 2023-03-12 20:55:10 · 100 阅读 · 0 评论