随笔分类 - 八股
摘要:笔者本来是想要自己去研读美团的文章(https://tech.meituan.com/2020/04/02/java-pooling-pratice-in-meituan.html),去实现一个动态线程池,虽然最后没有成功,因为发现已经有大佬写好了,我们只需要引入依赖就可以了,但是通过这篇文章,我也
阅读全文
摘要:修饰成员变量:被 static 修饰的成员变量属于类,而不属于类的某个具体对象,它在内存中只有一份,被所有该类的对象共享。例如, public static int count; 定义了一个静态变量 count ,可通过 类名.count 的方式访问。 修饰成员方法:静态方法同样属于类,可直接通过类
阅读全文
摘要:RabbitMQ消息丢失可能发生在生产端、队列和消费端,以下是针对不同环节消息丢失的解决办法: 生产端消息丢失 事务机制:在发送消息时,将信道设置为事务模式。生产者发送消息后,若事务提交成功,则消息发送成功;若事务回滚,则消息发送失败,可进行重试。 确认机制(publisher confirm):生
阅读全文
摘要:Redis之所以速度快,主要有以下几个原因: 内存存储 Redis将数据存储在内存中,内存的读写速度比传统的磁盘存储快得多,这使得Redis可以在短时间内处理大量的读写请求。 单线程架构 Redis采用单线程模型来处理客户端的请求,避免了多线程环境下的线程切换和锁竞争开销,提高了执行效率。同时,Re
阅读全文
摘要:Git是一款分布式版本控制系统,其底层原理主要涉及以下几个方面: 对象存储 Git把所有数据都存储为对象,主要有四种类型:blob(存储文件内容)、tree(存储目录结构和文件信息)、commit(包含提交信息、作者、提交时间等,通过指针指向对应的tree对象)和tag(用于给特定的提交打标签)。
阅读全文
摘要:Redis的淘汰策略有以下几种: 1. volatile-lru(最近最少使用):从已设置过期时间的键中,选择最近最少使用的键进行淘汰。 2. volatile-ttl:从已设置过期时间的键中,选择剩余生存时间最短的键进行淘汰。 3. volatile-random:从已设置过期时间的键中,随机选择
阅读全文
摘要:线程池的主要参数: corePoolSize(核心线程数):线程池中一直存活的线程数量,即使它们处于空闲状态也不会被销毁。 maximumPoolSize(最大线程数):线程池中允许的最大线程数量,包括空闲状态的线程和正在执行任务的线程。 workQueue(工作队列):存放等待执行的任务的队列。当
阅读全文
摘要:原子性(Atomicity)的实现 实现机制:Undo Log(回滚日志) Undo Log记录:当事务对数据进行修改时,InnoDB 会先记录修改前的数据到 Undo Log 回滚操作:如果事务失败需要回滚,引擎会使用 Undo Log 将数据恢复到事务开始前的状态 多版本控制:Undo Log
阅读全文
摘要:ZGC是一种垃圾回收器,由Oracle开发,主要用于Java虚拟机(JVM)中,以下是其相关介绍 特点### 低延迟:ZGC采用了多种优化技术,如染色指针、读屏障等,能够实现几乎停顿时间为零的垃圾回收,大大降低了应用程序的停顿时间。 高吞吐量:在保证低延迟的同时,ZGC也能维持较高的吞吐量,不会因为
阅读全文
摘要:以下是一些会出现Full GC的情况以及对象进入老年代的条件: 出现Full GC的情况 老年代空间不足:当老年代中剩余空间无法满足新对象的分配需求时,就会触发Full GC,以回收老年代中的垃圾对象,释放空间。 持久代(元空间)空间不足:在Java 7及之前的版本中,持久代用于存储类的元数据等信息
阅读全文
摘要:频繁Full GC会导致应用程序停顿时间过长,影响性能。定位问题可从以下几个方面入手: 内存分配与使用 检查堆内存大小设置:查看是否堆内存设置过小,无法满足应用程序的内存需求,可通过 -Xmx 和 -Xms 参数调整。 分析内存泄漏:使用内存分析工具如MAT、JProfiler等,检查是否存在对象引
阅读全文
摘要:使用 EXPLAIN 查看执行计划 作用:分析查询优化器选择的执行计划,包括索引使用、表连接顺序等。 语法:EXPLAIN SELECT * FROM 表名 WHERE 条件; 输出关键字段: type:访问类型(如ALL全表扫描、INDEX索引扫描、ref非唯一索引等)。 key:实际使用的索引。
阅读全文
摘要:优点: 解耦,生产者和消费者无需直接交互,通过消息队列进行通信,降低系统模块间的耦合度。在项目中,判题服务与其他模块可独立开发、维护和扩展。 异步处理,能提高系统响应速度,将耗时操作异步化。比如提交判题请求后,系统无需等待判题完成,可立即返回响应,判题任务在后台由RabbitMQ调度执行。 削峰填谷
阅读全文
摘要:布隆过滤器(Bloom Filter)是一种概率型数据结构,用于高效判断一个元素是否在集合中。它的优势在于空间效率和查询时间都远超一般的数据结构,但存在一定的误判率。 原理:布隆过滤器本质上是由一个长度为m的位数组(初始值都为0)和k个哈希函数组成。当一个元素加入集合时,通过k个哈希函数对该元素进行
阅读全文
摘要:登录时,系统验证用户身份生成JWT令牌。在后续请求中,拦截器获取令牌,解析出用户信息和权限标识。然后把权限信息存入ThreadLocal,方便在业务处理线程内随时获取。比如,在涉及到访问不同模块功能时,像赛事系统的管理功能,先从ThreadLocal中获取权限,判断当前用户是否有对应权限。若为管理员
阅读全文
摘要:用户首次登录 1、用户在客户端输入账号和密码,点击登录按钮,客户端将账号和密码发送到服务器端。 2、服务器端接收到请求后,对账号和密码进行验证。 3、如果验证通过,服务器生成 Token ,并将 Token 与当前线程进行关联。可以使用 ThreadLocal 来存储 Token , 如 Threa
阅读全文
摘要:识别热点数据通常可通过以下几种方法: 基于访问频率统计:利用日志记录或专门的监控工具,统计一段时间内每个数据项的访问次数。设定一个阈值,当某个数据项的访问次数超过该阈值时,将其视为热点数据。例如,通过分析服务器的访问日志,统计不同数据请求的频率,对于访问频率较高的数据库记录、文件或缓存对象等,标记为
阅读全文
摘要:在高并发情况下,互斥锁的性能会受到一定影响,具体如下: 性能影响 竞争开销:当多个线程同时竞争互斥锁时,未获取到锁的线程会被阻塞,这会导致上下文切换,增加系统开销。上下文切换需要保存和恢复线程的执行状态,涉及到 CPU 寄存器的读写等操作,频繁的上下文切换会消耗大量的 CPU 时间,降低系统性能。
阅读全文
摘要:缓存击穿问题概述 缓存击穿指的是某个热点数据的缓存过期瞬间,大量请求同时访问该数据,这些请求会直接穿透缓存,打到数据库上,从而给数据库带来巨大压力,甚至可能导致数据库崩溃。逻辑过期和互斥锁是两种解决缓存击穿问题的有效策略,下面分别介绍它们的工作原理以及如何配合工作。 逻辑过期解决缓存击穿问题的原理
阅读全文
摘要:确定随机 TTL 的取值范围的 1、基于业务数据的更新频率 首先要分析业务数据的更新特性。如果数据更新较为频繁,那么 TTL 的取值范围应该相对较小。例如,股票价格数据,其价格可能每分钟甚至每秒都在变动,此时 TTL 可以设置在数秒到几分钟的范围,如 5 - 60 秒。这样可以保证缓存数据能及时反映
阅读全文

浙公网安备 33010602011771号