java面经

"直接失业"

Posted by HZY on April 11, 2026

Redis

20260411-102215.png

缓存

缓存穿透

查询不存在的数据,导致没有数据写入缓存,直击数据库

  • 缓存空数据
    • 内存占用高
  • 布隆过滤器
    • 底层是bitmap
    • 可能发生误判,内存占用小
缓存击穿

key有过期时间,key过期的时候大量并发请求访问,那么可能同时触发缓存重建的过程,导致mysql被击垮

  • 互斥锁
    • 缓存重建时候需要拿锁,拿锁才能去重建缓存,其他线程等待
    • 强一致,性能差
  • 逻辑过期
    • 不设置过期时间,逻辑过期
    • 获取锁,异步重建缓存,直接返回旧数据
    • 高可用,性能优
缓存雪崩

大量缓存集体过期,同时失效,或者Redis宕机

  • 随机值过期
  • Redis集群
  • 限流降级
  • 多级缓存
双写一致性
  • 一致性要求高
  • 允许延迟一致

  • 读:直接返回,走缓存的路子
  • 写:延迟双删
    • 写删缓存后改数据库:
    • 先改后删
    • 上面都会导致数据不一致性
  • 使用延时双删: 删两次,但不能保证完全 强一致性

  • 其他解决方案:强一致性数据加锁
    • 使用读写锁
    • 读的时候用共享锁
    • 写的时候用排他锁
  • 追求最终一致性
    • 使用消息中间件
持久化
  • RDB
    • 把内存数据存储到硬盘中
    • save/ bgsave 是否使用主进程
    • redis.conf
    • 执行原理:fork主线程,完成fork之后读取内存数据写入RDB文件
    • RDB期间如何保证数据一致性, 使用 copy on write
  • AOF
    • Append Only file
    • 默认关闭
    • bgrewriteaof, 可以设置重写机制

20260411-105751.png

数据过期策略
  • 惰性删除
    • 需要使用的时候,再检查是否过期,过期了就删除
    • cpu友好,内存不友好
  • 定期删除
    • 每隔一段时间,对一些key进行检查
    • SLOW和FAST模式
  • 二者配合使用
数据淘汰策略
  • redis内存不够,会淘汰一部分数据

20260411-110326.png

  • 优先使用 allkeys-lru
  • 如果没有冷热数据区分: allkeys-random

20260411-110438.png

分布式锁

  • 集群中的定时任务
  • 抢单
  • 幂等性
分布式
  • 因为服务是集群式,所以不能用sychronized锁方法
    • 我们使用redis去实现一个分布式锁就好

XiaoLin Coding

Redis

  • redis memcached
    • 数据结构丰富,支持持久化,支持集群,有lua,事务,订阅模式

MySQL

索引

  • Mysql的 innoDB引擎是不支持hash索引的
  • 前缀索引优化,覆盖索引优化
    • 前缀索引对大文本等十分好用
    • 覆盖索引解决的是宽表数据回表查询慢的问题
  • 索引失效
    • 左/左右模糊匹配
    • 对索引列进行了 计算,函数,类型转换
    • 联合索引是否遵循 最左匹配原则
    • WHERE 子句中,如果OR前的条件列是索引列,OR后的条件列不是索引列
  • 深度分页
    • 无法解决
    • 最好使用游标分页

事务

  • ACID
    • 原子性 一致性 隔离性 持久性
    • 持久性是通过重做日志来保证的
    • 原子性是通过日志回滚来保证的
    • 隔离性
  • 并行事务
    • 脏读 幻读 不可重复读
    • 脏读是读到了 写未提交
    • 不可重复读 是 读到了 修改前后的数据
    • 幻读主要是增删造成的
  • 隔离级别
    • 读未提交,读已提交,可重复读,串行化
    • 读未提交: 脏读 不可重复读 幻读
    • 读已提交: 不可重复读 , 幻读
    • 可重复读: 幻读
    • 串行化

  • 全局锁,表级锁(表锁,元数据所,意向锁,AUTO-INC锁),行级锁(记录锁,间隙锁,临键锁)

FloCA

难点

  • 大模型不懂流程结构
    • RAG : 极其依赖检索到的文本
    • VLM
    • 图序列化
  • 幻觉
    • prompt工程
    • 微调
    • 自然语言转为符号表达式