分布式缓存详解(Java开发者视角)
2025-08-30 本文已影响0人
_浅墨_
一、什么是分布式缓存?
分布式缓存是指将缓存数据存储在多个节点(服务器)上的缓存架构。相比单机缓存,它能提供更高的
可用性、扩展性和性能。在大型分布式系统中,缓存通常作为数据库前的一层"加速层",减少数据库压力。
常见实现:Redis、Memcached、Hazelcast 等。
二、为什么需要分布式缓存?
1. 单机缓存的不足
- 内存有限,存不下海量数据。
- 容易成为单点故障(机器宕机 → 缓存不可用)。
- 难以水平扩展。
2. 分布式缓存的优势
- 容量可扩展:增加节点即可扩容。
- 高可用性:节点宕机时可通过副本/主从机制继续服务。
- 分布式访问:数据可根据一致性哈希分散在不同节点上,提高性能。
三、典型使用场景
1. 高频访问数据
如商品详情页、用户信息、文章内容。
→ 减少数据库查询次数。
2. Session 管理
在分布式部署下,用户可能访问不同的应用服务器。
→ 将 Session 放入分布式缓存(如 Redis)来保持一致性。
3. 排行榜/计数器
需要快速更新和读取的场景,比如:
- 新闻阅读量 - 视频播放量 - 游戏排行榜
4. 分布式锁
利用缓存(Redis)提供的 SETNX + EXPIRE 实现分布式锁。
四、常见架构模式
1. Cache Aside(旁路缓存)
- 应用先查缓存,缓存没有再查数据库并写入缓存。
- 适合 读多写少 的场景。
2. Read Through(读穿缓存)
- 应用只查缓存,缓存 miss 时由缓存服务自己回源数据库。
- 简化应用逻辑,但缓存服务需支持。
3. Write Through(写穿缓存)
- 应用写数据时先写缓存,再由缓存写入数据库。
- 保证数据一致性,但写入延迟增加。
4. Write Back(回写缓存)
- 应用写数据时只写缓存,由缓存异步刷入数据库。
- 写性能高,但有数据丢失风险。
五、典型问题与解决方案
1. 缓存穿透
请求的数据不存在于缓存和数据库中,导致每次都访问数据库。
解决方案:
- 使用 布隆过滤器 拦截无效请求。
- 对空结果也缓存(短期缓存)。
2. 缓存击穿
热点 Key 失效时,大量请求同时打到数据库。
解决方案:
- 设置 热点数据永不过期。
- 或使用互斥锁/单飞机制。
3. 缓存雪崩
大量缓存同时过期或缓存服务宕机,导致数据库压力骤增。
解决方案:
- 设置过期时间随机化。
- 使用多级缓存(本地缓存 + 分布式缓存)。
- 部署缓存集群,保证高可用。
六、Java 使用案例
1. Spring Boot + Redis 示例
@Service
public class UserService {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
@Autowired
private UserRepository userRepository;
public User getUserById(Long id) {
String key = "user:" + id;
// 先查缓存
User user = (User) redisTemplate.opsForValue().get(key);
if (user != null) {
return user;
}
// 缓存未命中,查数据库
user = userRepository.findById(id).orElse(null);
if (user != null) {
redisTemplate.opsForValue().set(key, user, 10, TimeUnit.MINUTES);
}
return user;
}
}
2. 使用 Redis 实现分布式锁
public boolean tryLock(String key, String requestId, long expireTime) {
Boolean success = redisTemplate.opsForValue().setIfAbsent(key, requestId, expireTime, TimeUnit.MILLISECONDS);
return success != null && success;
}
public boolean releaseLock(String key, String requestId) {
String value = (String) redisTemplate.opsForValue().get(key);
if (requestId.equals(value)) {
redisTemplate.delete(key);
return true;
}
return false;
}
七、总结
分布式缓存是现代高并发系统的关键组件,能有效减轻数据库压力,提升性能。
在 Java 开发中,Redis 是最常用的方案,需要重点掌握:
- 缓存架构模式(Cache Aside、Read/Write Through、Write Back)
- 典型问题(穿透、击穿、雪崩)及解决方案
- Java 集成实践(Spring Data Redis、Redisson)
通过合理设计缓存方案,可以让系统既 快 又 稳。