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

高频面试--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.xdnf.cn/news/676801.html

相关文章:

  • [yolov11改进系列]基于yolov11引入分布移位卷积DSConv的python源码+训练源码
  • AI智能体策略FunctionCalling和ReAct有什么区别?
  • 多卡训练的开源大模型,开箱即用
  • Jenkins实践(8):服务器A通过SSH调用服务器B执行Python自动化脚本
  • WSL连接网络
  • 新太空原子钟任务为全球标准化测高系统铺平道路
  • 编译原理——语法制导的语义计算
  • 欢乐熊大话蓝牙知识11:如何打造一个低功耗蓝牙温湿度传感器?
  • getline()跳过输入
  • 01背包问题
  • 【Elasticsearch】_update api用于更新单文档,更新多个文档使用_update_by_query
  • 软件更新 | TSMaster 202504 版本已上线!三大功能让车载测试更智能
  • 基于Python技术的面部考勤微信小程序的设计与实现
  • 2025年上半年第1批信息系统项目管理师论文真题解析与范文
  • 【力扣】面试题 01.04. 回文排列
  • RS485 接口,Modbus协议模拟量输出模块的使用步骤
  • git的使用
  • python函数的高级1——深拷贝+yeild
  • SQL思路解析:窗口函数该如何使用?
  • 【Java Web】5.Mybatis
  • ZU15EG 四核被禁用掉了2个核
  • 芯片跑post sim,在waveform中一般要check哪些点?
  • 代码随想录算法训练营 Day56 图论Ⅶ 最小生成树算法 Prim Kruskal
  • Map集合(双列集合)
  • 在PyTorch中,对于一个张量,如何快速为多个元素赋值相同的值
  • C语言栈详解
  • Git安装
  • 【Webtrees 手册】第 10章 - 用户体验
  • Mysql常用知识3:Kafka和数据库优化
  • 本地部署离线翻译(LibreTranslate)