
1) 【一句话结论】
针对招聘系统高并发场景,采用以Redis为主、Memcached为辅的分层缓存架构,通过布隆过滤器防缓存穿透、随机TTL+缓存预热防缓存雪崩、分布式锁防缓存击穿,结合RabbitMQ持久化消息+消费端重试的异步更新机制,确保缓存与数据库数据一致性。
2) 【原理/概念讲解】
老师会解释每个关键概念:
3) 【对比与适用场景】
| 特性 | Redis | Memcached | 适用场景 |
|---|---|---|---|
| 数据结构 | 支持字符串、列表、集合、哈希、有序集合等复杂结构 | 仅支持简单key-value | 需复杂数据操作(如职位列表聚合、计数器) |
| 持久化 | 支持(RDB/AOF,数据可持久化) | 无持久化,仅内存 | 数据需要持久化或故障恢复 |
| 事务支持 | 支持(多命令事务,保证原子性) | 不支持 | 需事务保证数据一致性 |
| 分布式 | 支持集群(Redis Cluster,内置分片与负载均衡) | 不支持(需第三方扩展,如MemcachedB) | 分布式环境下高并发读 |
| 适用场景 | 排行榜、计数器、复杂查询结果缓存 | 用户会话、简单高并发读(如用户登录状态、简单数据缓存) | 对数据结构要求低,读多写少 |
4) 【示例】(职位列表缓存设计)
job_list:page:{page_id}(page_id为分页标识,如1、2,区分不同页面的职位列表)。SET job_list:hot 3600 EX 3600)。deliveryMode=2)到RabbitMQ,消息内容为job_list_update:page:{page_id}。消费者处理流程:
SETNX job_list:page:{page_id}:delete_lock 1 EX 10,10秒过期,避免并发删除)。DEL job_list:page:{page_id})。SET job_list:page:{page_id} 1800 EX 1800,TTL 30分钟)。job_list:page:{page_id}:v1),数据库更新时版本号递增。缓存更新时检查版本号是否匹配,若不匹配则重新查询数据库并更新缓存。5) 【面试口播版答案】
面试官您好,针对招聘系统高并发场景的缓存策略,核心是构建分层缓存架构,以Redis为主、Memcached为辅。首先,缓存层选择:Redis支持复杂数据结构(如职位列表聚合),适合业务逻辑;Memcached适合简单高并发读,如用户会话。然后,key设计采用业务标识+时间戳+版本号,比如job_list:page:{page_id},确保唯一性。缓存更新用TTL(30分钟)+缓存预热(每天凌晨加载热门数据,TTL 1小时),防雪崩;用布隆过滤器防穿透,分布式锁(Redis SETNX,30秒过期)防击穿。数据一致性通过RabbitMQ持久化消息(deliveryMode=2)+消费端重试机制,确保异步更新不丢失;结合版本号校验(缓存加版本号,更新时检查一致性)。总结:通过分层、多防护策略,有效应对高并发。
6) 【追问清单】
7) 【常见坑/雷区】
job_list,导致不同页面的缓存冲突或失效)。