Redis缓存设计:缓存穿透、击穿、雪崩及解决方案
Redis缓存设计:缓存穿透、击穿、雪崩及解决方案
Redis是高性能的键值对数据库,深入理解其应用场景对后端工程师至关重要。
一、Redis基础
缓存是提升系统性能的重要手段,理解缓存常见问题和解决方案对设计高并发系统至关重要
1.1 数据结构
# String
SET key value
GET key
INCR counter
# Hash
HSET user:1 name "Tom"
HGET user:1 name
HGETALL user:1
# List
LPUSH queue "task1"
RPUSH queue "task2"
LPOP queue
# Set
SADD tags "java" "redis"
SMEMBERS tags
# ZSet
ZADD ranking 100 "user1"
ZRANGE ranking 0 -1 WITHSCORES
二、应用场景
2.1 缓存
// 缓存穿透防护
public User getUserById(Long id) {
String key = "user:" + id;
User user = redisTemplate.opsForValue().get(key);
if (user == null) {
user = userMapper.selectById(id);
if (user == null) {
// 缓存空值,防止穿透
redisTemplate.opsForValue().set(key, "", 5, TimeUnit.MINUTES);
} else {
// 缓存热点数据
redisTemplate.opsForValue().set(key, user, 30, TimeUnit.MINUTES);
}
}
return user;
}
2.2 分布式锁
public boolean tryLock(String key, String value, long expireTime) {
return redisTemplate.opsForValue()
.setIfAbsent(key, value, expireTime, TimeUnit.SECONDS);
}
public void unlock(String key, String value) {
String currentValue = redisTemplate.opsForValue().get(key);
if (value.equals(currentValue)) {
redisTemplate.delete(key);
}
}
三、常见面试题
Q1: Redis和Memcached的区别?
答案:
- Redis支持持久化,Memcached不支持
- Redis支持多种数据结构,Memcached只支持String
- Redis支持主从复制,Memcached不支持
- Redis性能略低,但功能更强大
Q2: 如何解决缓存雪崩?
答案:
1. 加互斥锁
2. 缓存预热
3. 双层缓存策略
4. 设置随机过期时间
四、总结
掌握Redis对提升系统性能至关重要:
✅ 核心要点
- 理解数据结构和使用场景
- 掌握缓存设计模式
- 了解分布式锁实现
进阶方向
- 阅读Redis源码
- 学习Redis Cluster
- 实践项目应用

浙公网安备 33010602011771号