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

面试篇: Redis(持续更新)

Redis基础

Redis为什么速度快?

  1. 纯内存操作:数据存储在内存中,读写速度远高于磁盘数据库。

  2. 单线程模型:避免多线程竞争和上下文切换,通过I/O多路复用(如epoll)处理高并发请求。

  3. 高效数据结构:如跳跃表(ZSet)、压缩列表(Hash/List)优化查询效率。

  4. 协议简单:RESP协议轻量,解析效率高。

注意:Redis 6.0支持多线程I/O处理网络请求,但核心命令执行仍为单线程。


Redis单线程模型的优缺点? 优点: • 无锁设计,避免线程安全问题。

• 原子操作天然支持事务性。

• 适合高吞吐场景(如缓存、计数器)。

缺点**: • 无法利用多核CPU(需通过集群分片解决)。

• 长命令(如KEYS *)会阻塞后续请求。


数据结构

Redis支持哪些数据类型?应用场景

  1. String:缓存、分布式锁(SETNX)、计数器(INCR)。

  2. Hash:存储对象(如用户信息),支持字段级操作。

  3. List:消息队列(LPUSH/BRPOP)、最新消息列表。

  4. Set:标签系统、共同好友(SINTER)。

  5. ZSet:排行榜(ZADD/ZRANGE)、延迟队列。

  6. BitMap:用户签到统计、活跃状态记录。

  7. HyperLogLog:基数统计(如UV统计)。

  8. Stream:消息队列(支持消费者组)。


ZSet底层实现原理 ZSet通过两种结构实现:

  1. 跳跃表(SkipList):支持有序性,范围查询时间复杂度为O(log n)。

  2. 哈希表(Dict):存储元素到分值的映射,分值查询时间复杂度为O(1)。 • 优化:元素较少时使用压缩列表(ziplist),超过阈值后转为跳跃表。


持久化与高可用

RDB和AOF的区别及优缺点

特性RDB(快照)AOF(日志)
数据安全性可能丢失最后一次快照后的数据最多丢失1秒数据(appendfsync everysec
恢复速度快(二进制文件直接加载)慢(需重放命令)
文件体积
适用场景备份、容灾高数据安全要求场景

混合持久化(Redis 4.0+):结合RDB快照和AOF增量日志,重启时先加载RDB再重放AOF。


Redis主从复制流程

  1. 全量同步:从节点首次连接主节点时,主节点生成RDB文件发送给从节点。

  2. 增量同步:主节点维护环形缓冲区(repl_backlog),从节点断线后通过PSYNC同步增量数据。

  3. 心跳机制:主从节点通过PING/PONG维持连接状态。


集群与高可用

Redis Sentinel(哨兵)的作用

  1. 监控:检测主从节点状态。

  2. 自动故障转移:主节点宕机时,选举新主节点并切换。

  3. 配置通知:向客户端推送新主节点地址。

缺点:需客户端支持Sentinel协议,分片需手动实现。

Redis Cluster分片原理

  1. 哈希槽(16384个):通过CRC16(key) % 16384计算槽位,每个节点管理部分槽。

  2. 数据迁移:支持动态扩缩容,槽位可在线迁移。

  3. 高可用:每个主节点有1~N个从节点,主节点故障时从节点自动接替。


事务与内存管理

Redis事务的ACID特性

  1. 原子性:事务中命令按顺序执行,但失败后无回滚(部分支持)。

  2. 隔离性:单线程模型保证事务执行期间无并发干扰。

  3. 持久性:依赖RDB/AOF配置。

Redis内存淘汰策略noeviction:默认策略,拒绝写入新数据。

allkeys-lru:淘汰最近最少使用的键。

volatile-ttl:淘汰剩余存活时间最短的键。

allkeys-random:随机淘汰任意键。


常见问题解决方案

缓存穿透、击穿、雪崩解决方案

  1. 穿透:非法请求查询不存在的数据。 • 方案:布隆过滤器拦截非法请求;缓存空值(设置短过期时间)。

  2. 击穿:热点Key失效后请求压垮数据库。 • 方案:互斥锁重建缓存(SETNX);逻辑过期(物理永不过期)。

  3. 雪崩:大量Key同时过期。 • 方案:随机过期时间;多级缓存(本地缓存+Redis)。

分布式锁实现要点

  1. 加锁:SET key unique_value NX EX 30(原子操作)。

  2. 解锁:Lua脚本校验值后删除(避免误删)。

  3. 续期:守护线程定期延长锁时间(如Redisson的看门狗机制)。


提示:面试中需结合具体场景(如电商、社交)举例说明技术选型。

http://www.xdnf.cn/news/6236.html

相关文章:

  • vue3基础学习 [简单标签] (vscode)
  • More Effective C++:改善编程与设计(上)
  • Redis内存淘汰策略和过期键删除策略有哪些?
  • Flutter在键盘的上方加一个完成按钮
  • JAVA异常体系
  • Linux proc文件系统 内存影射
  • YOLO11解决方案之热力图探索
  • 二分查找的边界问题
  • KUKA机器人中断编程3—暂停功能的编程
  • Selenium-Java版(环境安装)
  • fio 命令在 Linux 系统中的应用示例
  • Android锁
  • android studio导入项目
  • json-server的用法-基于 RESTful API 的本地 mock 服务
  • jQuery知识框架
  • Spring Cloud Gateway 聚合 Swagger 文档:一站式API管理解决方案
  • 鸿蒙OSUniApp 实现精美的用户登录和注册页面#三方框架 #Uniapp
  • Vue ElementUI原生upload修改字体大小和区域宽度
  • WeakAuras Lua Script ICC (BarneyICC)
  • 【周输入】510周阅读推荐-2
  • TTS-Web-Vue系列:Vue3实现侧边栏与顶部导航的双向联动
  • 23-单调队列-滑动窗口
  • LeetCode 每日一题 3341. 到达最后一个房间的最少时间 I + II
  • NAT网关(网络地址转换网关)的用途与场景
  • Mac的web服务器
  • [滑动窗口]越短越合法(可转化成越长越合法)
  • 【每天一个知识点】模型轻量化(Model Compression and Acceleration)技术
  • 麒麟环境下Selenium的使用
  • 语音识别-2
  • 【Oracle专栏】清理告警日志、监听日志