每天一套面试题Day28-八股高频(9)
48.消息队列如何保证不重复消费?
消息队列层面:利用Kafka的生产者幂等或RocketMQ的消息去重,减少源头重复
业务层面(核心):根据场景选择方案。比如对于订单支付,我们使用‘数据库唯一索引+状态机’,先插入一条消费记录,利用唯一约束防止重复
监控层面:记录消费日志,定期对账,发现异常人工干预
49.说说synchronize的用法及原理
50.什么是 LRU 算法?
LRU(Least Recently Used)算法是一种缓存/页面置换策略:始终优先淘汰“最后一次被访问时间最久远”的那一项,用时间局部性原则来最大化命中率。
51.布隆过滤器的原理
添加元素 将元素依次通过k个哈希函数,生成k个哈希值。 对每个哈希值取模m,得到在位数组中的位置h₁, h₂, ..., hₖ。 将这些位置的值设为1。 查询元素 对查询元素执行相同的k次哈希和取模操作,得到k个位置。 若所有位置的值均为1,则认为元素可能存在(可能误判);否则元素一定不存在(无漏判)
52.redo log / undo log / binlog 各自作用?
53.介绍一下分布式事务和常见解决方案。
分布式事务是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统节点上。当一个业务操作需要跨多个服务、数据库或消息中间件来完成时,为了保证数据的一致性,就需要分布式事务。 强一致性:以2PC为代表,性能低,阻塞大。 最终一致性(主流):以TCC、事务消息、Saga为代表,通过业务设计(补偿、重试、校对)来达到最终一致,高可用。 选型关键:根据业务场景在一致性、性能、复杂度之间做权衡
54.线程间同步方式有哪些?
线程间同步是指协调多个线程的执行顺序,确保它们能够正确地共享资源,避免出现数据竞争和不一致的问题。 线程间同步方式主要有以下几种:
互斥锁(Mutex):用于保护共享资源,确保同一时间只有一个线程可以访问该资源。
条件变量(Condition Variable):用于线程间的条件等待,当某个条件不满足时,线程可以等待在条件变量上,直到其他线程改变条件并通知它。
信号量(Semaphore):用于控制同时访问共享资源的线程数量,可以是二进制信号量(类似互斥锁)或计数信号量。
读写锁(Read-Write Lock):允许多个线程同时读共享资源,但写操作是互斥的。
自旋锁(Spinlock):与互斥锁类似,但不会让线程进入睡眠状态,而是循环检查锁是否可用,适用于短时间的等待。
55.聚簇索引与非聚簇索引的区别?
聚簇索引(Clustered Index) 并不是一种单独的索引类型,而是一种数据存储方式。InnoDB引擎中,表数据文件本身就是按B+树结构组织的一个索引,叶节点包含了完整的行数据。一个表只能有一个聚簇索引。
非聚簇索引(Non-Clustered Index / Secondary Index) 是独立于数据存储结构的索引。其叶子节点不包含行数据,而是包含指向行数据的指针(在InnoDB中,这个指针是主键值)。一个表可以有多个非聚簇索引。
记录刷过的面试真题

