
1) 【一句话结论】:在开发竞赛题库系统时,通过“数据库+缓存+分布式锁”的技术选型,解决了高并发下的数据不一致与性能瓶颈,确保了系统的高可用与低延迟。
2) 【原理/概念讲解】:技术选型中,数据库(如MySQL)负责数据持久化与事务支持,缓存(如Redis)用于热点数据加速,分布式锁(如Redis分布式锁)解决并发冲突。高并发下,缓存穿透会导致数据库压力激增,缓存雪崩会导致缓存服务崩溃,需通过布隆过滤器(防穿透)、限流降级(防雪崩)缓解。数据库的读写分离(主从复制)可分担读压力,但需注意数据一致性(如最终一致性)。
3) 【对比与适用场景】:数据库与缓存的对比:
| 方向 | 数据库(如MySQL) | 缓存(如Redis) |
|---|---|---|
| 定义 | 持久化存储,事务支持 | 内存存储,高并发读写 |
| 特性 | 事务、ACID,数据持久 | 高速读写,缓存穿透/雪崩 |
| 使用场景 | 写操作多、数据持久化 | 读操作多、热点数据加速 |
| 注意点 | 连接池配置、索引优化 | 缓存失效策略、热点数据预热 |
4) 【示例】:用户查询题目信息流程(伪代码):
def get_question(id):
cache_key = f"question:{id}"
# 1. 检查缓存
data = redis.get(cache_key)
if data:
return json.loads(data)
# 2. 缓存未命中,查询数据库
data = db.query("SELECT * FROM questions WHERE id = ?", id)
if data:
# 3. 存入缓存(设置过期时间)
redis.setex(cache_key, 60, json.dumps(data))
return data
5) 【面试口播版答案】:我参与过学而思的竞赛题库系统开发,核心是解决高并发下的数据一致性与性能问题。技术选型上,我们采用MySQL(主从复制)作为数据库,Redis作为缓存层,并引入Redis分布式锁。遇到的主要挑战是用户查询量激增时,缓存穿透导致数据库压力爆炸,以及缓存雪崩引发Redis服务崩溃。解决方法是:对缓存未命中的查询,通过布隆过滤器过滤无效请求(防穿透);对缓存过期时间设置随机值(防雪崩);同时,数据库采用读写分离,主库写,从库读,分担读压力。最终系统在并发1000+时,响应时间稳定在200ms内,数据一致性通过最终一致性保证(写操作延迟1-2秒)。
6) 【追问清单】:
7) 【常见坑/雷区】: