梦彻底醒了
这话是上周一个学生跟我说的,他双非一本大三下,刚结束人生第一次面试,他跟我说自己那点底细在面试官面前根本藏不住 —— 简历上编的项目,被追问两句就露了馅;头天晚上临时抱佛脚背的八股文,面试的时候一句也想不起来。
他说大学三年是真玩爽了,课能逃就逃,时间大多耗在宿舍里打游戏。直到面试官盯着他问 “这项目你到底做没做过”,他才反应过来:那些偷过的懒,迟早要变成拦路的坎。
现在他暑期实习是指望不上了,目标很明确:冲秋招。
其实像他这样的学生我见过不少,总觉得时间还多,混到毕业再说。可职场不看你过去有多 “爽”,只看你现在能拿出什么本事。编的项目经不住推敲,临时背的知识点撑不起面试,这些都是实实在在的教训。
秋招还有时间,把那些打游戏的功夫用在补八股、做真项目上,比什么都强。别等机会真来了,又只能眼睁睁看着它溜走。
我把他的故事分享出来,也是想给还在迷茫的同学提个醒:与其在虚拟世界里消磨时光,不如尽早认清现实,脚踏实地提升自己,毕竟为未来努力,什么时候开始都值得。
话都说到这了,文章的剩余部分我就分享一些数据库和缓存的常见面试题供大家学习(复习):
答案: 索引是一种数据结构,用于快速定位表中的数据,减少I/O操作。其核心作用包括:
常见索引类型包括:
WHERE id > 100)。WHERE name='Alice'),但不支持范围查询。MATCH AGAINST)。注意:索引并非越多越好,需避免过度索引导致写入性能下降。
答案: ACID是事务的四大特性:
实现机制:
MySQL的事务隔离级别(从低到高):
答案:
特性 | InnoDB | MyISAM |
|---|---|---|
事务支持 | 支持(ACID特性) | 不支持 |
锁机制 | 行锁(细粒度) | 表锁(粗粒度) |
索引结构 | B+树,聚簇索引 | B+树,非聚簇索引 |
外键支持 | 支持 | 不支持 |
存储文件 | .frm(表结构)、.ibd(数据+索引) | .frm(表结构)、.MYD(数据)、.MYI(索引) |
适用场景 | 高并发写入、事务型业务 | 读多写少、非事务场景 |
总结:InnoDB是MySQL的默认引擎,适合电商、金融等需要事务和高并发的场景;MyISAM已逐渐被淘汰,仅用于历史项目。
答案: 数据库锁按粒度分为:
按操作类型分为:
乐观锁 vs 悲观锁:
SELECT ... FOR UPDATE手动加锁,阻塞其他事务。version字段)或CAS(Compare-And-Swap)实现无锁操作。场景:悲观锁适用于冲突频繁的场景(如秒杀),乐观锁适用于冲突较少的场景(如商品库存更新)。
答案: 优化步骤如下:
slow_query_log),使用pt-query-digest分析。EXPLAIN查看索引使用情况,检查是否存在全表扫描。OR条件)。SELECT *,只查询必要字段。JOIN替代。WHERE id > last_id LIMIT 10)。innodb_buffer_pool_size)。答案: 主从复制原理:
主从延迟原因:
解决方法:
SHOW SLAVE STATUS查看Seconds_Behind_Master,设置报警阈值。答案: 分库分表策略分为:
hash(id) % N将数据分散到N个库/表。选择策略:
注意事项:
答案: 数据库范式是设计数据库表结构的规则,目的是减少数据冗余,提高数据一致性。常见范式包括:
范式化的优点:
缺点:
反范式化: 在性能敏感的场景(如报表系统),可适当引入冗余字段,减少Join操作。
答案:
INSERT INTO ... VALUES (...),(...)替代逐条插入。innodb_flush_log_at_trx_commit=2,降低日志刷盘频率(牺牲部分持久化)。答案: MVCC是InnoDB实现可重复读隔离级别的核心机制,通过版本号和Undo Log实现多版本数据共存。其原理如下:
trx_id(事务ID)和roll_ptr(指向Undo Log的指针)。优点:
局限性:
答案: Redis支持以下数据结构:
INCR)。LPUSH + BRPOP)、最新消息列表。hset user:1 name Alice)。SINTER/SUNION)。示例:
答案: Redis支持两种持久化机制:
dump.rdb)。SAVE/BGSAVE,或配置自动触发(如save 900 1:900秒内至少1次写操作)。always:每条命令同步到磁盘(安全,性能低)。everysec:每秒同步一次(默认,平衡安全与性能)。no:由操作系统决定(性能高,风险大)。appendonly.aof)。选择建议:
everysec策略。答案:
NULL值,设置短过期时间。TTL = 300 + random(60))。SET ... NX加锁,确保只有一个线程重建缓存。答案: Redis事务特性:
与MySQL事务的区别:
特性 | Redis事务 | MySQL事务 |
|---|---|---|
原子性 | 命令级原子性(但不支持回滚) | 事务级原子性(支持回滚) |
隔离性 | 单线程执行,无并发问题 | 多线程并发,需锁机制和MVCC |
持久性 | 依赖RDB/AOF,不保证持久化 | 强持久化(Redo Log) |
使用场景 | 简单批量操作(如INCR + SET) | 复杂事务(如银行转账) |
注意:Redis事务中的命令在入队时检查语法错误,执行时不回滚。
答案: Redis集群实现方式包括:
主从复制 vs 哨兵模式:
选择建议:
答案: 优化Redis性能的策略包括:
maxmemory和淘汰策略(如allkeys-lru)。bigkey),减少内存碎片。MEMORY USAGE监控内存占用。keepalive)。tcp-backlog)。MULTI/EXEC事务。BGREWRITEAOF)。redis-cli info监控指标(如used_memory、instantaneous_ops_per_sec)。slowlog get),优化慢命令。答案: 处理Redis内存不足的步骤如下:
redis-cli --rdb memory分析RDB文件的内存占用。redis-cli --bigkeys)。snappy压缩JSON)。ZSet替代List)。active-expire-effort参数)。maxmemory-policy(如volatile-ttl、allkeys-lru)。appendfsync everysec)。答案:
特性 | Pipeline | 事务 |
|---|---|---|
命令执行 | 批量发送命令,服务端顺序执行 | 命令入队,通过EXEC原子执行 |
原子性 | 不保证原子性(可能部分成功) | 保证原子性(全部成功或失败) |
网络开销 | 减少网络往返次数,提升吞吐量 | 单次网络请求,开销低 |
错误处理 | 错误命令会被忽略 | 执行时发现错误,事务终止 |
适用场景 | 批量读操作(如MGET) | 复杂写操作(如INCR + SET) |
示例:
GET命令。MULTI + DECR + SET。答案: 过期策略:
内存淘汰策略(通过maxmemory-policy配置):
选择建议:
volatile-ttl。allkeys-lru。noeviction。答案:
特性 | Redis | Memcached |
|---|---|---|
数据结构 | 支持String、List、Hash等复杂结构 | 仅支持Key-Value |
持久化 | 支持RDB和AOF | 不支持 |
内存管理 | 自动淘汰(LRU等策略) | 自动淘汰(LRU) |
分布式 | 原生支持Cluster | 依赖客户端分片 |
事务 | 支持简单事务(MULTI/EXEC) | 不支持 |
适用场景 | 缓存、消息队列、分布式锁等 | 简单Key-Value缓存 |
总结:Redis功能更全面,适合复杂业务场景;Memcached轻量级,适合高并发简单缓存。