当前位置: 首页 > article >正文

高频面试--redis

Reids

1. 常见的数据结构(string, list, hash, set, zset)

答法模板:

Redis 提供五种核心数据结构:

  • String:最基本的类型,支持整数、自增、自减、位操作。

  • List:双端链表,支持消息队列(如 LPUSH/RPOP)。

  • Hash:键值对集合,适合存储对象(如用户信息)。

  • Set:无序集合,支持去重、集合运算(如交并差)。

  • ZSet(Sorted Set):有序集合,元素按 score 排序,适用于排行榜。

可加一句:

实际开发中我用 ZSet 做过文章点赞排行榜,Set 做签到记录,List 做延迟队列等。


2. ZSet 的底层实现

答法模板:

ZSet 底层是 跳表(SkipList)+ 哈希表(HashMap) 的组合:

  • 哈希表用来快速定位元素(O(1));

  • 跳表用于按 score 排序,支持范围查询(O(log n))。

可补一句:

跳表在性能上接近平衡树,但实现简单,Redis 源码中使用跳表而非红黑树。


3. Redis 分布式锁实现(原子性、死锁问题)

答法模板:

Redis 分布式锁常用 SET key value NX PX timeout 保证原子性(一次性设置键和过期时间)。

  • 使用唯一标识避免误删;

  • 删除时用 Lua 脚本保证检查和删除是原子操作;

  • 避免死锁要设置过期时间;

  • 复杂业务推荐用 Redisson,它实现了可重入锁、看门狗续约等机制。


4. AOF 重写机制

答法模板:

AOF(Append Only File)是 Redis 的持久化方式之一。

  • AOF 重写(rewrite)会在文件过大时触发;

  • 并不是清空旧文件,而是重新生成最短命令集合

  • AOF 重写过程是后台线程完成,不影响主线程。

可补一句:

Redis 会同时维护新旧 AOF 文件,在 rewrite 成功后再原子性切换。


5. RDB 的写时复制技术(Copy-On-Write)

答法模板:

RDB 是通过 fork() 子进程生成快照。

  • 子进程把内存数据写入磁盘;

  • 主进程继续服务;

  • Redis 使用写时复制(Copy-On-Write),保证 fork 后内存修改不会影响子进程写入快照。


6. Redis 集群为什么采用 Gossip 协议同步数据

答法模板:

Redis Cluster 中节点通过 Gossip 协议互相传播节点状态,实现故障感知。

  • 每个节点周期性 ping 其他节点;

  • 如果多个节点判断某节点不可达,即认为该节点挂了;

  • Gossip 协议保证了集群的可扩展性和容错性。


7. Redis 分片解决单机实例压力大问题

答法模板:

Redis Cluster 采用哈希槽分片方案,共 16384 个槽位,每个主节点负责一部分槽。

  • key 会通过 CRC16 算法映射到槽;

  • 不同槽分布在不同节点,实现负载均衡;

  • 节点可动态扩容或迁移槽。


8. MySQL 与 Redis 数据一致性问题

答法模板:

Redis 是缓存层,MySQL 是持久层,典型一致性问题有:

  • 缓存穿透:查询不存在数据 → 使用布隆过滤器或缓存空值;

  • 缓存击穿:热点 key 过期瞬间高并发访问 → 加互斥锁(互斥更新);

  • 缓存雪崩:大量 key 同时过期 → 设置过期时间随机化;

  • 读写一致性:采用「先写数据库,后删缓存」策略;或使用消息队列异步刷新。


🧠 总结面试技巧:

  • 回答时注意层次清晰:“现象 → 原因 → 方案”

  • 能举实际项目中的使用更加分

  • 不确定的地方坦诚说“我理解的是……”,不要硬编

http://www.lryc.cn/news/2392609.html

相关文章:

  • CRMEB 单商户Java版 v2.3公测版发布,欢迎体验!
  • (四) 本地YARN集群的部署
  • 华为OD机试真题——求最多可以派出多少支队伍(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现
  • 《软件工程》第 12 章 - 软件测试
  • 消息队列-kafka为例
  • 学习STC51单片机20(芯片为STC89C52RCRC)
  • 链路追踪神器zipkin安装详细教程教程
  • RabbitMQ备份与恢复技术详解:策略、工具与最佳实践
  • bug: uniCloud 查询数组字段失败
  • Php JIT 使用详解
  • 视觉分析开发范例:Puppeteer截图+计算机视觉动态定位
  • Linux 基础开发工具的使用
  • ElasticSearch查询指定时间内出现的次数/2秒内出现的次数
  • 华为云Flexus+DeepSeek征文 | Dify-LLM平台一键部署教程及问题解决指南
  • STP协议:如何消除网络环路风暴
  • 哈工大计算机系统2025大作业——Hello的程序人生
  • 物联网常用协议Modbus、CAN、BACnet介绍
  • Vue中van-stepper与input值不同步问题及解决方案
  • react基础技术栈
  • Three.js搭建小米SU7三维汽车实战(4)场景搭建
  • redis五种数据结构底层实现
  • Excel 统计某个字符串在指定区域出现的次数
  • 【Kubernetes】ubuntu20.04通过kubeadm + Docker安装k8s
  • 前端开源JavaScrip库
  • 【Linux我做主】进度条小程序深度解析
  • MySQL 使用全局锁会导致的问题?
  • 从Homebrew找到openssl.cnf文件并拷贝到Go项目下使用
  • 在Java对象转JSON字符串时不显示无值参数
  • 在 Ubuntu 服务器上 下载 Clash 文件使用代理
  • 微信小程序一次性订阅封装