JAVA面试题速记-redis知识点

1. redis数据结构

字符串(String),哈希(Hash),列表(List),集合(Set),有序集合(ZSet)

  • 字符串 String:redis中最基本数据类型, 每个键都可以关联一个字符串值
  • 哈希 Hash:适合存储对象类型数据
  • 列表 List:有序集合,支持 LPUSH/RPUSH 等操作
  • 集合 Set:无序集合,去重,支持交并差集。
  • 有序集合 ZSet:有序,带权重(分数),支持按分数排序
  • 三种特殊数据结构类Geospatial Hyperloglog Bitmap

2. redis 如何持久化数据

RDB(快照):全量备份模式

  • 原理:定时将内存数据以二进制格式保存到磁盘(如save 60 10000表示60秒内10000次修改时触发)。
  • 优点:文件紧凑、恢复速度快。缺点:可能丢失最后一次快照后的数据。

AOF(日志):增量备份模式

  • 原理:记录所有写操作命令,支持always(每条命令同步)、everysec(每秒同步)、no(操作系统决定)三种策略。
  • 优点数据安全性高,最多丢失1秒数据, 缺点:文件体积大、恢复速度慢。

选择建议:

  • 对数据安全性要求高 → AOF(everysec)。
  • 允许少量数据丢失,追求恢复速度 → RDB。
  • 混合备份:大量数据使用粗粒度(时间上)的rdb快照方式,性能高,恢复时间快。增量数据使用细粒度(时间上)的AOF日志方式,尽量保证数据的不丢失。

3. 如何从持久化文件中恢复数据?

  • 停止Redis服务。
  • 将备份文件(如dump.rdbappendonly.aof)放到数据目录(通过dir配置项指定)。
  • 启动Redis服务,自动加载文件。

redis 缓存击穿、缓存雪崩如何解决?

  • 缓存击穿 | 缓存雪崩:某时刻大规模的key失效,大量的请求打在数据库上,导致数据库压力巨大,在高并发的情况下数据库宕机。即使重启数据库后又会海量请求到数据库
  • 设置不同的过期时间和随机值来错开过期时间,避免同一时刻大量缓存失效。

4. redis 缓存数据的过期策略有哪些?

  • 定期删除:定期扫描所有键,删除过期的数据。
  • 惰性删除:每次读取数据时检查是否过期。
  • LRU 删除:内存满时,删除最久未使用的数据。

5. redis缓存与数据库如何保证一致性

  • 同步策略 先更新数据库、再删除缓存(优选)

同步删除+可靠消息删除: 适用于不强制要求数据一致性的情景 流程:先更新数据库、再删除缓存,如果删除失败就发可靠MQ不断重试删除缓存,直到删除成功或重试5次。问题:MQ多次重试失败,导致长期脏数据。

  • 延时双删方案:比同步删除策略一致性更高的方案。

流程:先删除缓存再更新数据库,大约在数据库从库更新后再删一次。问题:时间无法控制,不能保证 在数据库从库更新后删除缓存。如果在从库更新前删除,用户再在更新前查从库又把脏数据写在缓存里了。

  • 异步监听+可靠消息删除:很多大厂正在使用的方案。

流程: 更新数据库后不做操作;Canal等组件监听binlog发现有更新时就发可靠MQ删除缓存;如果删 除缓存失败,就基于手动ack、retry等机制,让消息在有限次数之内不断重试。优点:异步删除,性能更 高;可靠消息重试机制,多次删除保证删除成功。问题:要求canal等binlog抓取组件高可用,如果canal故 障,会导致长期脏数据。

6. redis 如何实现分布式锁?

  • 使用 Redis 的 SETNX 命令实现分布式锁。
  • 结合过期时间,防止锁死。

7. redis 的高可用如何实现?讲讲主从复制。

  • 主从复制:一个主节点(master),多个从节点(slave),数据同步。
  • 读写分离:主节点写,读操作可以通过从节点分担。
  • 哨兵 Sentinel:自动故障转移,主节点宕机时,哨兵会选举新的主节点。

8. 什么是 redis 的 bigkey?

一个 key 对应的 value 所占用的内存比较大,那这个 key 就可以看作是 bigkey。

  • String 类型的 value 超过 几十或上百 kb 已经算是 bigkey 了
  • 复合类型(List、Hash、Set、Sorted Set 等)的 value 包含的元素超过 5 千 到 1 万个

9. redis的 bigKey如何处理?

  • 分割 bigkey:将一个 bigkey 分割为多个小 key。例如上万字段数量的 Hash 按照一定策略(比如二次哈希)拆分为多个小Hash(如user#1、user#2)。
  • 手动清理:Redis 4.0+ 可以使用 UNLINK 命令来异步删除一个或多个指定的 key。Redis 4.0 以下可以考虑使用 SCAN 命令结合 DEL 命令来分批次删除。
  • 采用合适的数据结构:例如,文件二进制数据不使用 String 保存、用ZSet代替List、采用压缩算法处理。
  • 开启 lazy-free(惰性删除/延迟释放):lazy-free 特性是 Redis 4.0 开始引入的,指的是让 Redis 采用异步方式延迟释放 key 使用的内存,将该操作交给单独的子线程处理,避免阻塞主线程。

10. redis如何实现实现分布式锁?

  • 使用SETNX 命令是可以帮助我们实现互斥 , 带来的问题: 不同的服务异常死锁其他服务无法获取锁问题, 若客户端获取锁后崩溃,未释放锁,都将导致其他客户端永远无法获取锁
  • 使用 redisson提供的分布式锁服务。RLock是其核心接口,支持公平和非公平锁。加锁和解锁通过Lua脚本在Redis中执行,确保原子性。公平锁利用Redis的List和ZSet实现线程的FIFO等待队列。Redisson通过watchDog机制自动续期锁,防止业务执行超时导致锁过早释放,同时使用Redis的发布订阅功能实现锁的释放通知
  • 只要线程一加锁成功,就会启动一个watch dog看门狗的后台线程,会每隔10秒检查一下,如果线程一还持有锁,那么就会不断的延长锁key的生存时间。因此,Redisson就是使用Redisson解决了锁过期释放,业务没执行完问题。

11. redis的分布式模式有哪些?

哨兵模式集群模式,核心区别如下:

哨兵模式: 高可用(解决单点故障),单主节点,无法扩展, 监控主从节点,主节点宕机时选举从节点升级为主节点,实现故障转移;

集群模式:水平扩展(解决性能瓶颈),多主节点,水平扩展,有(16384个槽位,节点分槽)将数据分片存储在多个节点,每个节点负责一部分槽位,支持自动故障转移

 

 

 

 

posted @ 2026-02-22 13:13  蜜獾互联网  阅读(12)  评论(0)    收藏  举报