大家好,我是陈一。如果文章对你有帮助,请留下一个宝贵的三连哦~ 万分感谢!
一、Redis是什么?为什么用它?
Redis(Remote Dictionary Server) 是一个高性能的 内存数据库,支持多种数据结构(如String、Hash、List、Set等),常用于缓存、分布式锁、消息队列等场景。
为什么用Redis?
- 极速读写:数据存储在内存,比磁盘数据库快100倍以上。
- 缓解数据库压力:将热点数据缓存到Redis,避免频繁访问数据库。
- 丰富的数据结构:灵活应对不同业务场景(如排行榜用ZSet)。
- 高可用:支持主从复制、哨兵、集群模式,保障服务稳定性。
二、Redis核心数据结构与使用场景
数据结构 | 特点 | 典型应用场景 | 示例代码(Java) |
---|---|---|---|
String | 最简单的Key-Value存储 | 缓存验证码、计数器 | set user:1 "Alice" |
Hash | 存储对象属性 | 用户信息、商品详情 | hset product:1001 name "Phone" price 5000 |
List | 有序、可重复 | 消息队列、最新消息列表 | lpush news "Update1" |
Set | 无序、去重 | 好友关系、抽奖去重 | sadd friends:1 "user2" "user3" |
ZSet | 有序、按分数排序 | 排行榜、延迟任务 | zadd leaderboard 95 "PlayerA" |
三、Redis缓存三大经典问题及解决方案
1. 缓存穿透(查不存在的数据)
问题:大量请求绕过缓存,直接访问数据库(如查询ID=-1的数据)。
解决:
- 布隆过滤器:预加载合法Key,拦截非法请求。
- 缓存空值:
set key:null " " 300
(设置短过期时间)。
2. 缓存雪崩(大量Key同时过期)
问题:缓存集中失效,数据库瞬间压力激增。
解决:
- 随机过期时间:
expire key 3600 + random(600)
。 - 集群部署:Redis Cluster分散节点压力。
3. 缓存击穿(热点Key过期)
问题:某个热点Key失效,大量并发请求直达数据库。
解决:
- 互斥锁:使用
setnx
命令保证只有一个线程重建缓存。 - 永不过期:逻辑过期时间 + 异步更新。
四、持久化机制:RDB vs AOF
机制 | 原理 | 优点 | 缺点 | 适用场景 |
---|---|---|---|---|
RDB | 定时生成数据快照 | 文件小,恢复快 | 可能丢失最后一次快照后的数据 | 容灾备份 |
AOF | 记录所有写操作命令 | 数据完整性高 | 文件大,恢复慢 | 高数据安全要求场景 |
生产建议:开启 AOF + RDB
混合模式(Redis 4.0+),兼顾性能与安全。
五、Redis高可用方案
1. 主从复制(Master-Slave)
主节点写,从节点读,数据异步同步。 缺点:主节点宕机需手动切换。
2. 哨兵模式(Sentinel)
- 自动监控主节点状态,故障自动切换。
- 架构图:
3. Cluster集群
- 数据分片存储,支持水平扩展。
- 每个节点负责一部分槽(slot),通过CRC16算法分配。
六、Java操作Redis实战
1. 客户端选择
-
Jedis:同步阻塞,简单易用。
-
Lettuce(推荐):基于Netty,支持异步、响应式编程,连接可复用。
2. Spring Data Redis整合
@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {RedisTemplate<String, Object> template = new RedisTemplate<>();template.setConnectionFactory(factory);template.setKeySerializer(RedisSerializer.string());template.setValueSerializer(RedisSerializer.json());return template;}
}// 使用注解缓存
@Cacheable(value = "user", key = "#userId")
public User getUserById(String userId) {// 查询数据库
}
注意事项:
-
避免大Key(如超过10KB的String)。
-
使用连接池配置(如最大连接数、超时时间)。
-
监控慢查询:
slowlog get 10
。
七、高频面试题整理
1. Redis为什么快?
内存操作、单线程避免竞争、IO多路复用。
2. 如何选择数据结构?
根据业务需求,如统计UV用HyperLogLog。
3. 内存淘汰策略有哪些?
volatile-lru
(最近最少使用)、allkeys-random
等,共8种策略。
4. 如何实现分布式锁?
setnx + expire
或 RedLock算法。
八、总结
Redis是Java面试必考的高频知识点,掌握其核心概念、数据结构、缓存问题解决方案及高可用架构,能让你在面试中脱颖而出。建议结合实际项目经验(如用Redis优化接口响应时间),并动手实践集群搭建与性能调优。
学习资源推荐:
-
《Redis设计与实现》
-
Redis官方文档:redis.io
-
在线实验:Redis Labs
翻过这座山,他们就会听到你的故事!转发本文给需要的朋友,一起备战金三银四! 🚀