Java面试——Redis

一、Redis基础与核心机制

1. Redis为什么快?

  • 基于内存操作:数据存储在内存中,读写速度快;
  • 单线程模型:避免多线程上下文切换和竞争问题(Redis 6.0后支持多线程IO,但命令执行仍单线程);
  • 高效数据结构:如跳跃表压缩列表哈希表等;
  • I/O多路复用:基于epoll/kqueue实现非阻塞网络模型,高并发下高效处理请求。

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命令扣减库存,结合限流防止超卖。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值