一、Redis核心概念与特性
-
Redis是什么?
Redis是基于内存的键值型NoSQL数据库,支持多种数据结构(字符串、哈希、列表、集合、有序集合等),常用于缓存、分布式锁、消息队列等场景。其核心优势在于内存存储带来的高性能(可达10万+ QPS)和单线程模型避免并发冲突。
-
Redis为什么快?
- 内存存储,读写无磁盘I/O瓶颈
- 单线程模型避免上下文切换
- I/O多路复用(如epoll)高效处理网络请求
- 优化的数据结构(如跳跃表、压缩列表)
二、数据结构与使用场景
数据结构 | 典型场景 | Java代码示例(Spring Data Redis) |
---|---|---|
String | 缓存、计数器、分布式Session | redisTemplate.opsForValue().set("key", value) |
Hash | 存储对象属性(如用户信息) | redisTemplate.opsForHash().put("user:1", "name", "Alice") |
List | 消息队列、最新消息列表 | redisTemplate.opsForList().leftPush("queue", msg) |
Set | 标签、共同好友 | redisTemplate.opsForSet().add("tags", "Java") |
ZSet | 排行榜、延迟队列 | redisTemplate.opsForZSet().add("rank", "userA", 100) |
三、持久化与高可用
-
持久化机制
- RDB:定时快照,文件紧凑但可能丢失数据(适合备份)
- AOF:记录写命令,数据更安全但文件较大
- 混合持久化(Redis 4.0+):结合RDB快照与增量AOF日志,提升恢复效率
-
高可用方案
- 主从复制 :一主多从实现读写分离,通过
REPLICAOF
命令配置 - 哨兵模式:自动监控故障转移,解决主节点单点问题
- Cluster集群:数据分片存储,支持横向扩展(官方推荐方案)
- 主从复制 :一主多从实现读写分离,通过
四、Java集成与实战
-
Spring Boot整合
@Configuration @EnableCaching public class RedisConfig { @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(factory); template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); return template; } }
使用
@Cacheable
注解实现声明式缓存。 -
分布式锁实现
// 加锁(SETNX + 过期时间) Boolean locked = redisTemplate.opsForValue().setIfAbsent("lock:order", "req123", 30, TimeUnit.SECONDS); // 解锁(Lua脚本保证原子性) String script = "if redis.call('get', KEYS[1](@ref) == ARGV[1] then return redis.call('del', KEYS[1](@ref) else return 0 end"; redisTemplate.execute(new DefaultRedisScript<>(script, Long.class), Collections.singletonList("lock:order"), "req123");
需注意锁续期问题(推荐Redisson的WatchDog机制)。
五、高频面试题解析
-
缓存穿透/击穿/雪崩
- 穿透:缓存与数据库均无数据 → 布隆过滤器拦截非法请求
- 击穿:热点key过期 → 互斥锁重建缓存
- 雪崩:大量key同时过期 → 随机过期时间 + 集群部署
-
内存淘汰策略
当内存达到
maxmemory
阈值时触发淘汰,策略包括:volatile-lru
(默认):淘汰最近最少使用的过期键allkeys-lfu
:淘汰全库最不经常使用的键noeviction
:禁止淘汰,直接报错(需谨慎选择)
-
延时任务实现误区
- 避免使用Key过期监听:Redis过期事件存在延迟且不保证可靠
- 推荐方案 :Redisson的
DelayedQueue
或RocketMQ定时消息
六、优化与陷阱
- 大Key治理:单个Value不超过1MB,集合元素控制在1万以内
- Pipeline批量操作:减少网络往返耗时
- 熔断降级:Hystrix+Fallback防止Redis宕机导致服务雪崩
- 缓存一致性:采用Cache-Aside模式,更新时先更新DB再删缓存(双删策略)