
面试
文章平均质量分 72
这个专栏的灵感来自于我收到的许多粉丝私信,大家向我咨询有关面试的问题和建议。我深感荣幸和责任,希望通过这个专栏,能够为大家提供更多关于面试的知识、技巧和经验。我们将一起探讨面试。期待粉丝们ssp的offer喜讯。
程序员三木
[优快云全栈领域优秀创作者| 阿里云博客社区专家博主] 作为某云服务提供商的后端开发人员,我将在这里与大家简要分享一些实用的开发小技巧。在我的职业生涯中积累了丰富的经验,希望能通过这个博客与大家交流、学习和成长。
展开
-
Redis的过期键的删除策略
每隔一定的时间,会扫描一定数量的数据库的expires字典中一定数量的key,并清除其中已过期的key。字典会保存所有设置了过期时间的key的过期时间数据,其中,key是指向键空间中的某个键的指针,value是该键的毫秒精度的UNIX时间戳表示的过期时间。但是会占用大量的CPU资源去处理过期的数据,从而影响缓存的响应时间和吞吐量。我们都知道,Redis是key-value数据库,我们可以设置Redis中缓存的key的过期时间。Redis的过期策略就是指当Redis中缓存的key过期了,Redis如何处理。原创 2024-05-13 22:26:15 · 409 阅读 · 1 评论 -
AOF日志重写的时候,是由bgrewriteaof子进程来完成的,不用主线程参与,我们今天说的非阻塞也是指子进程的执行不阻塞主线程。但是,你觉得,这个重写过程有没有其他潜在的阻塞风险呢?如果有的话,
写实复制”顾名思义,就是在写发生时,才真正拷贝内存真正的数据,这个过程中,父进程也可能会产生阻塞的风险,就是下面介绍的场景。但是此时父进程依旧是会有流量写入的,如果父进程操作的是一个已经存在的key,那么这个时候父进程就会真正拷贝这个key对应的内存数据,申请新的内存空间,这样逐渐地,父子进程内存数据开始分离,父子进程逐渐拥有各自独立的内存空间。因为内存分配是以页为单位进行分配的,默认4k,如果父进程此时操作的是一个bigkey,重新申请大块内存耗时会变长,可能会产阻塞风险。原创 2024-05-13 22:25:15 · 454 阅读 · 0 评论 -
[AIGC] redis 持久化相关的几道面试题
持久化就是把内存的数据写到磁盘中去,防止服务宕机了内存数据丢失。原创 2024-05-12 22:58:13 · 750 阅读 · 2 评论 -
[AIGC] 几道 redis数据结构相关面试题
首先,SDS 主要通过 未使用空间来实现的。空间预分配,在 SDS 中的表现是,如果对 SDS 的长度进行修改,程序会多分配一部分的未使用空间,至于分配多少取决于len属性,当len原创 2024-05-12 22:57:06 · 548 阅读 · 0 评论 -
[redis] 说一说 redis 的底层数据结构
Redis有等底层数据结构。Redis并没有使用这些数据结构来直接实现键值对数据库,而是基于这些数据结构创建了一个对象系统,来表示所有的key-value。原创 2024-05-07 22:30:20 · 1281 阅读 · 2 评论 -
[redis] 数据类型的底层实现
与上面的 OBJ_ENCODING_EMBSTR 编码方式的不同之处在于 此时动态字符串 sds 的内存与其依赖的 redisObject 的。当哈希对象保存的键值对数量小于 512,并且所有键值对的长度都小于 64 字节时,使用压缩列表存储;当有序集合的长度小于某个特定值,并且所有元素的长度都小于 64 字节时,使用压缩列表存储;当列表的长度小于 512,并且所有元素的长度都小于 64 字节时,使用压缩列表存储;当集合的长度小于某个特定值,并且所有元素都是整数时,使用整数集合存储;原创 2024-05-07 22:29:05 · 358 阅读 · 0 评论 -
[redis] 为什么使用redis
Redis(Remote Dictionary Server) 是一个使用 C 语言编写的,开源的(BSD许可)高性能非关系型(NoSQL)的键值对数据库。Redis 可以存储键和五种不同类型的值之间的映射。键的类型只能为字符串,值支持五种数据类型:字符串、列表、集合、散列表、有序集合。与传统数据库不同的是 Redis 的数据是存在内存中的,所以读写速度非常快,因此 redis 被广泛应用于缓存方向,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB。原创 2024-05-06 22:28:34 · 586 阅读 · 0 评论 -
什么是脏读?幻读?不可重复读?
数不一致,例如有一个事务查询了几列(Row)数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。:某个事务 A 已更新一份数据,另一个事务 B 在此时读取了同一份数据,由于某些原因,事务 A 回滚,而事务B读取到事务 A 回滚前的数据。例子:小明修改了A,B数据,小红同时又插入了一条C数据,小明会感觉自己明明数据都改了,突然多出来一条,以为。例子:小明多次读取A数据,小红在小明读取数据时,每次读取都修改了数据并提交,小明多次读到的数据不一致。原创 2024-05-05 15:41:47 · 265 阅读 · 0 评论 -
[AIGC] 哈希索引与B+索引的几道八股文
聚簇索引:将数据存储与索引放到了一块,找到索引也就找到了数据非聚簇索引:将数据存储于索引分开结构,索引结构的叶子节点指向了数据的对应行,myisam通 key_buffer 把索引先缓存到内存中,当需要访问数据时(通过索引访问数据),在内存中直接搜索索引,然后通过索引找到磁盘相应数据,这也就是为什么索引不在 key buffer 命中时,速度慢的原因。原创 2024-05-05 15:32:59 · 903 阅读 · 0 评论 -
[AIGC] 数据库相关几道面试题
聚簇索引:将数据存储与索引放到了一块,找到索引也就找到了数据非聚簇索引:将数据存储于索引分开结构,索引结构的叶子节点指向了数据的对应行,myisam通 key_buffer 把索引先缓存到内存中,当需要访问数据时(通过索引访问数据),在内存中直接搜索索引,然后通过索引找到磁盘相应数据,这也就是为什么索引不在 key buffer 命中时,速度慢的原因。原创 2024-04-28 20:44:29 · 891 阅读 · 1 评论 -
索引的数据结构(b树,hash)
索引的数据结构和具体存储引擎的实现有关,在MySQL中使用较多的索引有等,而我们经常使用的InnoDB存储引擎的默认索引实现为:B+树索引。对于哈希索引来说,底层的数据结构就是哈希表,因此在绝大多数需求为单条记录查询的时候,可以选择哈希索引,查询性能最快;其余大部分场景,建议选择BTree索引。原创 2024-04-28 20:41:00 · 512 阅读 · 0 评论 -
Mybatis 几道入门面试题
MyBatis 是一个可以自定义 SQL、存储过程和高级映射的持久层框架。原创 2024-04-24 17:00:00 · 495 阅读 · 1 评论 -
Spring 相关的几道简单但不好达的面试题
控制反转,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通俗地讲,IOC 就是把对象的创建、初始化、销毁交给 spring 来管理,而不是由开发者控制,实现控制反转。“依赖”是指接收方所需的对象。“注入”是指将“依赖”传递给接收方的过程。在“注入”之后,接收方才会调用该“依赖”。原创 2024-04-22 23:13:29 · 518 阅读 · 1 评论 -
[JVM 面试题] 类的加载过程
。通过全限定名来加载生成 class 对象到内存中,然后进行验证这个 class 文件,包括文件格式校验、元数据验证,字节码校验等。准备是对这个对象分配内存。解析是将符号引用转化为直接引用(指针引用),初始化就是开始执行构造器的代码。原创 2024-04-22 23:11:34 · 290 阅读 · 0 评论 -
JVM 垃圾回收算法(重要)
标记—清除算法是最基础的垃圾回收算法,后续的垃圾收集算法都是基于标记—清除算法进行改进而得到的。标记—清除算法分为“标记”和“清除”两个阶段,首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。标记过程与标记—清除算法一样,但后续步骤不是直接回收被标记的对象,而是让所有存活的对象都向一端移动,然后清除边界以外的内存。复制算法是将可用内存分成大小相等的两块,每次只使用其中的一块,当用完一块内存时,将还存活着的对象复制到另外一块内存,然后把已使用过的内存空间一次清理掉。复制算法解决了效率问题。原创 2024-04-21 22:57:13 · 638 阅读 · 0 评论 -
JVM 引用的分类
JDK1.2 之前,Java 中引用的定义很传统:如果 reference 类型的数据存储的数值代表的是另一块内存的起始地址,就称这块内存代表一个引用。在 JDK 1.2 之后,Java 将引用分成四种,按照引用强度从高到低的顺序依次是:强引用、软引用、弱引用、虚引用。引用计数算法和根搜索算法都需要通过判断引用的方式判断对象是否可回收。原创 2024-04-21 22:54:42 · 598 阅读 · 0 评论 -
JVM 如何判断对象是否可回收
垃圾回收器在对堆进行回收之前,首先需要确定哪些对象是可回收的。常用的算法有两种,引用计数算法和根搜索算法。原创 2024-04-21 22:54:08 · 537 阅读 · 0 评论 -
Java 与垃圾回收有关的方法
该方法在 Object 类中被定义,在释放对象占用的内存之前会调用该方法。该方法的默认实现不做任何事,如果必要,子类应该重写该方法,一般建议在该方法中释放对象持有的资源。方法 gc 的作用是提示 Java 虚拟机进行垃圾回收,该方法由系统自动调用,不需要人为调用。其实,java.lang.System.gc 等价于 java.lang.Runtime.getRuntime.gc 的简写,都是调用垃圾回收器。调用垃圾回收器的方法是 gc,该方法在 System 类和 Runtime 类中都存在。原创 2024-04-21 22:53:23 · 210 阅读 · 0 评论 -
Java 内存分配原则
主要有一下 3 条原则。原创 2024-04-21 22:52:49 · 260 阅读 · 0 评论 -
[Java基础面试题] volatie 与 synchronized
否则,该线程就会阻塞等待,直到获得锁为止。当一个线程执行完 synchronized 代码块或方法后,它会释放锁,这样其他线程才有机会获取锁并执行相应的操作。需要注意的是,使用synchronized关键字会对程序性能产生一定影响,因为每次进入synchronized代码块或方法都需要获得锁,这可能导致线程之间的竞争和等待。需要注意的是,虽然 volatile 变量保证了它们的读写操作是原子性的,但它并不保证多个操作的组合是原子性的。关键字用于修饰变量,表示该变量是易变的,其值可能会被不同的线程修改。原创 2024-04-21 22:51:42 · 347 阅读 · 0 评论 -
[Java 基础面试题] IO相关
IO 即,输入和输出。数据输入到计算机内存的过程即输入,反之输出到外部存储(比如数据库,文件,远程主机)的过程即输出。数据传输过程类似于水流,因此称为 IO 流。IO 流在 Java 中分为输入流和输出流,而根据数据的处理方式又分为字节流和字符流。Java IO 流的 40 多个类都是从如下 4 个抽象类基类中派生出来的。: 所有的输入流的基类,前者是字节输入流,后者是字符输入流。: 所有输出流的基类,前者是字节输出流,后者是字符输出流。原创 2024-04-21 22:50:41 · 543 阅读 · 0 评论 -
[Java基础面试题] Map 接口相关
② 创建时如果给定了容量初始值,那么 Hashtable 会直接使用你给定的大小,而 HashMap 会将其扩充为 2 的幂次方大小(HashMap 中的tableSizeFor()方法保证,下面给出了源代码)。也就是说 HashMap 总是使用 2 的幂作为哈希表的大小,后面会介绍到为什么是 2 的幂次方。① 创建时如果不指定容量初始值,Hashtable 默认的初始大小为 11,之后每次扩充,容量变为原来的 2n+1。下面这个方法保证了 HashMap 总是使用 2 的幂作为哈希表的大小。原创 2024-04-21 22:49:11 · 457 阅读 · 0 评论 -
[每天一道面试题] HTTP,FTP,TFTP的底层实现协议是什么
TFTP: 与 HTTP 和 FTP 不同,简单文件传输协议(TFTP)实际上是基于UDP的。TFTP是为了简化传输而设计的,常用于设备的初始引导和将文件传输到有限功能的设备,因此选择使用无连接的UDP协议。它们的底层实现主要依赖于传输层的两种协议—— TCP(传输控制协议) 和 UDP(用户数据报协议)。FTP用于在网络上进行文件的传输,它也使用了TCP的可靠性,以确保文件不会在传输过程中丢失或出错。所以,说到底层实现协议,HTTP 和 FTP 是基于TCP,而TFTP 是基于 UDP。原创 2024-04-07 22:26:21 · 482 阅读 · 0 评论 -
[金三银四] 操作系统上下文切换系列
CPU 上下文切换就是先把前一个任务的 CPU 上下文(CPU 寄存器和程序计数器)保存起来,然后加载新任务的上下文到这些寄存器和程序计数器,最后再跳转到程序计数器所指的新位置,重新加载指令数据,运行新任务。系统内核会存储切换下来的上下文信息,当此任务再次被分配给 CPU 运行时,CPU 会重新加载这些上下文,这样就能保证任务原来的状态不受影响,让任务看起来还是连续运行。原创 2024-03-24 22:46:28 · 1028 阅读 · 1 评论 -
[金三银四] 系统调用相关
系统根据所有进程的状态建立几张索引表,如就绪索引表,阻塞索引表等,并把各索引表在内存的首地址记录在内存的一些专用单元中,在每个索引表的表目中,记录具有相应状态的某个PCB在PCB表中的地址。而在这个固定区域里,主要有链接和索引两种方式。:把具有同一状态的PCB,链接成一个队列,这样可以形成若干就绪队列、阻塞队列和空白队列等,优先级高的进程的PCB排在前面。操作,使S=S-1,若S原创 2024-03-10 22:11:48 · 809 阅读 · 3 评论 -
[百度二面]操作系统进程、锁相关面试题
在多道程序环境下,多个进程可以竞争有限数量的资源。当一个进程申请资源时,如果这时没有可用资源,那么这个进程进入等待状态。有时,如果所申请的资源被其他等待进程占有,那么该等待进程有可能再也无法改变状态。这种情况称为死锁。2.23 死锁的四个必要条件互斥:资源必须处于非共享模式,即一次只有一个进程可以使用。如果另一进程申请该资源,那么必须等待直到该资源被释放为止。请求与等待:一个进程至少应该占有一个资源,并等待另一资源,而该资源被其他进程所占有。不可剥夺:资源不能被剥夺。原创 2024-03-10 22:10:12 · 1063 阅读 · 0 评论 -
Elasticsearch面试题
系统中的数据, 随着业务的发展,时间的推移, 将会非常多, 而业务中往往采用模糊查询进行数据的搜索, 而模糊查询会导致查询引擎放弃索引,导致系统查询数据时都是全表扫描,在百万级别的数据库中,查询效率是非常低下的,而我们使用 ES 做一个全文索引,将经常查询的系统功能的某些字段,比如说电商系统的商品表中商品名,描述、价格还有 id 这些字段我们放入 ES 索引库里,可以提高查询速度。集群是一个或多个节点(服务器)的集合,它们共同保存您的整个数据,并提供跨所有节点的联合索引和搜索功能。原创 2023-12-17 16:21:37 · 1253 阅读 · 1 评论 -
[Kafka 常见面试题]如何保证消息的不重复不丢失
最多一次: 消息不会被重复发送,最多被传输一次,但也有可能一次不传输;最少一次: 消息不会被漏发送,最少被传输一次,但也有可能被重复传输;精确的一次(Exactly once): 不会漏传输也不会重复传输,每个消息都传输被一次而且仅仅被传输一次,这是大家所期望的。在Kafka发送数据的时候,每次发送消息都会有一个确认反馈机制,确保消息正常被收到。可以通过设置决定 ack 策略。0: 生产者不会等待 broker 的 ack,这个延迟最低但是存储的保证最弱。原创 2023-12-17 16:03:46 · 1424 阅读 · 0 评论 -
[Spring] 字节一面~Spring 如何解决循环依赖问题 以及 @resource 与 @autowire 同时存在时谁生效
通俗地说,就是设置两个池子:一个成品池子,一个半成品池子。在注入bean,向容器获取bean的时候,优先向成品池子要,要不到,再去向半成品池子要。Spring在实例化一个bean的时候,是首先递归实例化其所依赖的所有bean,直到某个bean没有依赖其他bean,此时就会将该实例返回,然后反递归的将获取到的bean设置为各个上层bean的属性的。这跟bean的处理顺序有关,在源码中可以找个两个bean的order的大小关系,当然我们可以手动修改bean的比较器来决定哪个bean起作用。原创 2023-11-26 13:57:57 · 1027 阅读 · 1 评论 -
[Java 源码] 秋招常被问到 GC 相关的几道面试题(集中在分配以及回收)
其实一套组合拳下来,问的就是是什么、为什么、怎么办。什么是垃圾回收以及什么是垃圾,怎么判断对象是垃圾,为什么说它是垃圾等等方法 finalize 在 Object 类中被定义,该方法的默认实现不做任何事。在释放对象占用的内存之前会调用该方法,如果必要,子类应该重写该方法,一般建议在该方法中释放对象持有的资源。原创 2023-11-26 13:52:11 · 1271 阅读 · 0 评论 -
[Java 源码] 美团一面~ArrayList 的底层实现
与 Java 中的数组相比,它的容量能动态增长。默认情况下,新的容量会是原容量的1.5倍,这里用了位运算提高效率。● 如果传入初始容量,会判断这个传入的值,如果大于0,就 new一个新的Object数组,如果等于0,就直接设置 elementData为 EMPTY_ELEMENTDATA。ArrayList里面有两个概念,一个是capacity,它表示的就是“容量”,其实质是数组elementData的长度。ArrayList有三个构造方法,不同的构造方法的容量是不一样的,具体可以查看JDK 源码。原创 2023-11-26 13:39:11 · 786 阅读 · 0 评论 -
[中间件~大厂面试题] 腾讯三面,40亿的QQ号如何去重
如果限制在1GB内存,并且不依赖外部存储或中间件,HashSet都无法满足要求。文件分片和外部排序算法可以适应1GB内存限制,但涉及到额外的文件操作和排序步骤。使用数据库的去重功能可能需要额外的存储开销。Redis作为中间件可以满足内存限制,但需要依赖Redis服务。布隆过滤器是一种适用于大规模数据去重的高效数据结构,可以根据预期插入数量和误判率进行内存估算。这是一种简单粗暴的方法,使用内置的哈希集合数据结构。需要将40亿个QQ号全部加载到内存中,因此可能会超出1GB的内存限制。原创 2023-10-02 14:29:45 · 1622 阅读 · 14 评论 -
「网络」1.你所不知道的浏览器缓存精品答案
你真的懂浏览器缓存吗。原创 2023-09-01 08:00:00 · 1119 阅读 · 46 评论 -
「操作系统」1. 基础
操作系统(Operating System,简称 OS)是管理计算机硬件与软件资源的程序,是计算机的基石。操作系统本质上是一个运行在计算机上的软件程序 ,用于管理计算机硬件和软件资源。操作系统存在屏蔽了硬件层的复杂性。操作系统的内核(Kernel)是操作系统的核心部分,它负责系统的内存管理,硬件设备的管理,文件系统的管理以及应用程序的管理。原创 2023-09-01 07:30:00 · 1119 阅读 · 2 评论 -
「Redis」1. 数据类型的底层实现
在这篇博文中,我们将简单总结在面试中怎么回答Redis数据类型的底层实现。因为面试时间就那么点,言简意赅的描述自己会的知识显得尤为重要‼️。原创 2023-08-28 21:51:09 · 967 阅读 · 1 评论 -
ssp offer技巧 | 面试经验专栏介绍 | 金九银十
欢迎来到我的面试经验专栏!在这个专栏中,我将与大家分享我在多个领域的面试经验,涵盖Java、GO、操作系统、Mysql、计算机网络、Redis等领域。作为一名经验丰富的技术人员,我将通过文章的形式,为大家提供宝贵的面试技巧、常见问题解答和实际案例分析。原创 2023-08-28 07:30:00 · 928 阅读 · 3 评论