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
- 实践项目应用


posted @ 2026-02-20 16:00  寒人病酒  阅读(1)  评论(0)    收藏  举报