文章目录
一、Redis基础与核心机制
1. Redis为什么快?
2. Redis的持久化机制有哪些?优缺点是什么?
- RDB(快照):
优点:二进制压缩文件,恢复速度快,适合备份和灾难恢复。
缺点:可能丢失最后一次快照后的数据(取决于配置频率)。- AOF(追加日志):
优点:数据持久化更可靠(支持每秒同步、每次操作同步)。
缺点:文件体积大,恢复速度慢。- 混合持久化(Redis 4.0+):结合RDB和AOF,重启时先加载RDB快照,再重放AOF增量日志。
3. Redis的过期键删除策略?
- 惰性删除:访问键时检查是否过期,过期则删除。
- 定期删除:每隔一段时间随机抽取部分键检查并删除过期键。
- 内存淘汰策略:当内存不足时,根据maxmemory-policy(如LRU、LFU、随机)淘汰键。
二、Redis高级特性与实战
4. 如何用Redis实现分布式锁?
- 单节点实现:
SET lock_key unique_value NX PX 30000 # NX表示不存在才设置,PX设置超时时间
释放锁时需用Lua脚本验证值,避免误删其他客户端的锁。
- RedLock算法(多节点分布式锁):
向多个Redis实例依次申请锁,半数以上成功才算获取锁。
需处理时钟漂移、节点宕机等问题,实际中推荐使用Redisson客户端。
5. 缓存穿透、缓存雪崩、缓存击穿的区别及解决方案?
- 缓存穿透:查询不存在的数据(如恶意攻击)。
解决:布隆过滤器拦截非法请求,缓存空值(设置短过期时间)。- 缓存雪崩:大量缓存同时过期,请求直接压到数据库。
解决:随机化过期时间,集群部署,热点数据永不过期。- 缓存击穿:热点数据过期瞬间,高并发请求击穿缓存。
解决:互斥锁(Redis SETNX)、逻辑过期时间(后台异步更新)。
6. Redis如何实现延迟队列?
- 使用Sorted Set(ZSET):
将消息的到期时间作为score,定时轮询ZSET中score小于当前时间的数据。- Redis 5.0+ Streams:
使用XADD添加消息,XREADGROUP阻塞消费,结合PENDING队列处理超时任务。
三、Redis集群与高可用
7. Redis Cluster的槽(Slot)分配机制?
Redis Cluster将数据分为16384个槽,每个节点负责一部分槽。
客户端根据CRC16(key) % 16384计算槽位,直接路由到对应节点。
节点间通过Gossip协议通信,支持动态扩缩容和自动故障转移。
8. Redis主从复制原理?
- 全量同步:从节点首次连接主节点时,主节点生成RDB文件发送给从节点。
- 增量同步:主节点将写命令缓存到复制积压缓冲区(repl_backlog),从节点断线重连后发送偏移量,主节点补发缺失的命令。
- 命令传播:主节点持续将写命令发送给从节点。
9. Redis Sentinel和Cluster的区别?
- Sentinel:基于主从复制的高可用方案,监控主节点状态并自动故障转移,不解决数据分片问题。
- Cluster:分布式数据分片方案,支持水平扩展和高可用,内置数据分片和故障转移。
四、Redis应用场景与性能优化
10. Redis在Java中的典型应用场景?
- 缓存加速:高频查询结果缓存(如Spring Cache + Redis)。
- 分布式Session:统一存储用户Session,支持多服务共享。
- 排行榜/计数器:利用ZSET、INCR命令实现实时统计。
- 消息队列:通过List(LPUSH/BRPOP)、Streams实现轻量级队列。
- 分布式锁:通过SETNX或Redisson实现。
11. 如何优化Redis的内存使用?
- 选择合适的数据结构:如小数据用Hash的ziplist编码。
- 设置过期时间:避免无效数据长期占用内存。
- 内存碎片整理:Redis 4.0+支持MEMORY PURGE或配置activedefrag。
- 使用共享对象:如0~9999的整数会预分配,复用相同对象。
12. Redis如何处理大Key和热Key问题?
- 大Key:
拆分(如Hash拆分为多个Key)、压缩值、删除无用数据。- 热Key:
本地缓存(如Guava Cache)、多副本(通过CLUSTER KEYSLOT分散读请求)、限流降级。
五、Redis新特性与生态工具
13. Redis 7.0+的重要新特性?
- Function:支持Lua脚本的持久化存储,替代传统EVAL。
- Multi-Part AOF:AOF文件拆分为多个子文件,提升恢复效率。
- ACL增强:更细粒度的权限控制。
- Sharded Pub/Sub:集群模式下支持分片发布订阅。
14. Redis与Redisson的结合使用?
Redisson是Redis的Java客户端,提供分布式对象(如RList、RMap)和服务(如分布式锁、信号量)。
示例:通过RLock实现可重入锁,RBucket管理对象存储,RTopic实现发布订阅。
六、Redis监控与运维
15. 如何监控Redis的性能?
- 命令行工具:INFO命令查看内存、命中率、持久化状态等。
- 可视化工具:RedisInsight、Grafana + Prometheus(通过redis_exporter采集指标)。
- 关键指标:内存使用率、命中率(keyspace_hits/(keyspace_hits+keyspace_misses))、连接数、延迟。
高频实战场景题
如何实现一个分布式限流器?
使用Redis的INCR和EXPIRE命令实现滑动窗口计数,或通过Lua脚本保证原子性。
Redis和数据库的数据一致性如何保证?
缓存失效时,使用延迟双删(先删缓存,更新数据库,再删缓存)。
结合消息队列(如Binlog监听)异步更新缓存。
如何用Redis实现秒杀系统的库存扣减?
使用WATCH + 事务或Lua脚本保证原子性扣减库存。
通过DECR命令扣减库存,结合限流防止超卖。