五、Redis
Redis 为什么快题目 7Redis 为什么快一、纯内存特点数据存放在内存优点读写速度极快二、单线程优点无锁竞争无线程切换CPU 开销低Redis 瓶颈内存网络而不是 CPU。三、I/O 多路复用使用epoll实现单线程监听大量 socket四、Redis 6.0 补充网络 IO 多线程命令执行仍单线程Redis 数据类型Redis 常用数据类型类型用途String缓存、计数器Hash存对象List队列Set去重ZSet排行榜扩展类型BitmapHyperLogLogGeoStreamRedis 是否线程安全一、服务端Redis 服务端线程安全原因单线程执行命令二、客户端客户端是否线程安全Jedis否Lettuce是RedisTemplate是Redis 缓存三大问题题目 6Redis 缓存三大问题一、缓存穿透问题查询不存在的数据解决布隆过滤器缓存空对象二、缓存击穿问题热点 key 失效解决互斥锁逻辑过期三、缓存雪崩问题大量 key 同时过期解决过期时间加随机值Redis 集群布隆过滤器布隆过滤器是什么布隆过滤器概率型数据结构用于判断元素是否存在核心特点一定不存在如果返回不存在那么一定不存在可能存在如果返回存在那么可能不存在即有误判底层结构组成结构作用位数组存储标记位多个哈希函数计算位置添加元素步骤用 k 个哈希函数计算位置对应 bit 位设为 1查询元素步骤同样计算 k 个位置判断是否全部为 1查询结果结果含义有 0一定不存在全是 1可能存在优点空间占用极小查询速度快例如1 亿数据 ≈ 100 多 MB缺点缺点说明有误判可能误判存在不支持删除普通布隆过滤器无法删除典型应用防止缓存穿透流程请求 → 布隆过滤器 → Redis → MySQL如果布隆过滤器判断不存在直接返回避免请求打到数据库Redis 实现使用RedisBloom模块。常见命令添加BF.ADD查询BF.EXISTSRedis 集群故障切换Redis 主从 哨兵一、故障检测流程PING 检测 ↓ 主观下线 ↓ 客观下线二、Leader 选举使用RaftLeader 哨兵负责选择新主节点更新配置三、部署要求至少 3 个哨兵Redis Cluster一、节点通信使用Gossip 协议二、故障切换流程PFAIL → FAIL ↓ 从节点发起选举 ↓ 获得多数票 ↓ 升级为新主三、特点内置高可用无需 SentinelRedis 数据丢失一、异步复制丢失问题主节点未同步成功就宕机导致数据丢失解决方案min-replicas-to-write1作用至少一个从节点确认后才返回成功二、脑裂问题问题网络分区导致双主后果恢复后旧主数据被丢弃解决方案min-replicas-max-lag10作用从节点延迟过大时拒绝写入三、强一致方案WAIT作用强制同步复制缺点性能下降Redis Cluster 原理一、哈希槽总数16384计算方式CRC16(key) % 16384二、作用数据分片快速定位节点三、扩缩容优势特点只迁移部分槽不需要全量迁移四、客户端重定向类型作用MOVED永久重定向ASK临时重定向五、Cluster 优势水平扩展多主写入高并发六、Cluster 缺点不支持跨节点事务不支持跨节点批量操作解决Hash Tag哈希槽原理Redis 哈希槽一、核心概念Redis Cluster共 16384 个槽二、槽位计算CRC16(key) % 16384三、三大优势1自动分片key 自动分布到不同节点。2扩缩容方便只迁移部分槽数据。3客户端直连客户端缓存槽位映射直接访问目标节点四、为什么是 16384原因bitmap 只需约 2KB兼顾网络开销和灵活性Redis 主从问题Redis主从复制是异步的问题主节点宕机时数据可能未同步结果发票号重复方案一雪花算法雪花算法特点本地生成不依赖 Redis高性能无单点故障核心要求保证workerId 不重复方案二Redis MySQL 兜底流程Redis INCR 发号Redis 故障时降级 MySQL兜底措施数据库唯一索引重复重新生成方案三Redisson 锁思路加分布式锁再执行 INCR问题仍无法100% 防止主从切换丢数据推荐方案主方案雪花算法兜底数据库唯一索引Redis 分布式锁实现可重入锁的层次回答层次内容基础方案ThreadLocal 存本地计数器 Redis SET NX但状态可能不一致标准方案Redis Hash Lua 脚本用线程 ID 做 fieldvalue 存重入次数工业实践生产直接用 Redisson支持自动续期、公平锁、红锁等进阶思考考虑可重入锁的性能开销和复杂性明确适用场景Redis 分布式锁高频十问1Redis 分布式锁怎么实现加锁SET lock_key unique_id NX EX 30参数说明NX互斥只有不存在才设置EX过期时间防止宕机死锁unique_id标识锁归属防止误删解锁ifredis.call(get,KEYS[1])ARGV[1]thenreturnredis.call(del,KEYS[1])elsereturn0end2为什么不能用 SETNX EXPIRE 分开写因为两条命令不是原子操作若执行完 SETNX 服务宕机EXPIRE 没执行锁会永久存在导致死锁必须用SET key value NX EX一条原子命令完成。3为什么解锁要用 Lua 脚本因为get 判断 del 删除是两步操作不原子。极端场景判断后锁过期别人重新加锁当前线程误删别人锁Lua 保证判断删除原子执行。4为什么要存唯一 IDUUID/requestId用于标识锁持有者解锁时校验是不是自己加的锁防止删别人的锁5什么是看门狗WatchDogRedisson 内置后台续期线程。机制锁默认 30s 过期每 10s 检查一次业务未执行完自动续期 30s解决业务执行时间过长锁提前过期问题。6有看门狗还需要 Lua 解锁吗必须需要。原因看门狗只保证锁不过期不能保证判断 删除原子性GC、线程延迟等情况下仍可能误删。Lua 是安全底线。7什么是分布式锁可重入Redis 怎么实现同一个客户端/线程可多次加同一把锁。Redis 实现key 锁名 field 客户端ID 线程ID value 重入次数加锁是自己 → count 1不是自己 → 阻塞解锁count -1为 0 才真正删除锁8Redis 主从切换会有什么问题问题场景主节点加锁成功还没同步到从节点主节点宕机从节点升级为主结果锁丢失其他线程可再次加锁出现并发安全问题9主从锁丢失怎么解决方案 1Redlock 红锁多数节点加锁成功才算成功。缺点复杂性能差实践争议较大方案 2使用强一致组件例如ZooKeeperEtcd方案 3业务兜底例如幂等版本号唯一索引防止重复执行。10实现可靠 Redis 分布式锁注意事项加锁必须使用SET NX EX必须存唯一标识解锁必须 Lua 原子删除必须设置过期时间长业务使用看门狗续期finally 中保证释放锁高可用场景考虑主从锁丢失问题MySQL 和 Redis 一致性题目 8MySQL 和 Redis 一致性一、核心方案旁路缓存Cache Aside二、读流程查 Redis ↓ 命中直接返回 ↓ 未命中查 MySQL ↓ 写入 Redis三、写流程更新 MySQL ↓ 删除 Redis四、为什么删除缓存原因幂等避免并发覆盖避免双写不一致五、删除失败兜底方案MQ 异步重试Canal 监听 binlog 删除缓存多级缓存题目 7多级缓存一、架构本地缓存 → Redis → MySQL二、流程先查 Caffeine ↓ 未命中查 Redis ↓ 未命中查 MySQL三、特点优点极致性能缺点一致性复杂维护成本高Redis String 和 Zset 底层实现 - 面试高频题一、String 底层5个最常见问题Q1Redis String 底层用什么实现和 C 字符串有什么区别答案用SDSSimple Dynamic String简单动态字符串。对比项C 字符串SDS获取长度O(N) 遍历O(1) 读 len缓冲区安全不安全可能溢出安全自动扩容二进制安全不安全遇\0停止安全用 len 判断修改性能每次重分配内存预分配减少重分配Q2SDS 的扩容策略是什么答案if (新长度 1MB) {新容量 新长度 * 2; // 翻倍} else {新容量 新长度 1MB; // 线性增长}原因翻倍重分配次数从 O(N) 降到 O(log N)1MB 上限避免大字符串翻倍造成巨大浪费Q3String 的三种编码方式及使用条件答案编码条件内存布局int整数值可用 long 表示值直接存 ptr无额外分配embstr长度 ≤ 44 字节redisObject 和 SDS 连续分配1次 mallocraw长度 44 字节redisObject 和 SDS 分开分配2次 malloc44字节来源redisObject(16B) SDS头(3B) ‘\0’(1B) 20B对齐到64字节缓存行后剩44B。Q4什么是二进制安全SDS 如何实现答案二进制安全能存储任意数据图片、序列化对象、含 ‘\0’ 的数据。实现方式不依赖 ‘\0’ 判断结尾用 len 字段记录长度。sds s sdsnewlen(“ABC\0DEF”, 7); // 能完整存7个字节Q5SDS 的 buf 为什么还要以 ‘\0’ 结尾答案为了兼容 C 标准库函数如 printf、strcmp可直接使用无需复制。二、Zset 底层5个最常见问题Q1Zset 底层有几种实现什么时候切换答案编码条件特点ziplist元素数 ≤ 128 且 member ≤ 64 字节内存紧凑查找 O(N)skiplistdict超过任一阈值查找 O(log N)功能完整注意切换不可逆。Q2为什么 Zset 需要同时维护 dict 和 skiplist答案结构用途命令dictmember → score O(1) 查找ZSCOREskiplist按 score 排序范围操作ZRANGE、ZRANK关键两者通过指针共享member 和 score无数据冗余。Q3什么是跳表为什么用它而不是红黑树答案跳表多层有序链表上层是下层的快速通道查找 O(log N)。对比项跳表红黑树实现复杂度简单~500行复杂~2000行范围查询天然支持需额外实现并发友好相对容易困难Q4跳表的层数如何确定答案随机生成25% 概率升层。int level 1;while (random() 0.25 level 32) level;最大32 层2^32 ≈ 42亿元素。Q5ziplist 的连锁更新是什么答案插入 ≥254 字节的 entry 时后续 entry 的 prevlen 从 1B 扩展到 5B导致自身长度增加影响下一个形成连锁反应。实际影响触发条件苛刻生产环境极少遇到是 Redis 的权衡设计。三、速记卡片StringSDSO(1)长度、自动扩容、二进制安全、预分配编码int、embstr(≤44)、raw(44)扩容1MB翻倍1MB加1MBZset小数据ziplist≤128且≤64B→ 省内存大数据skiplistdict → 保性能跳表25%概率升层最大32层好的给你一个精简版30秒内说完适合面试时快速清晰地表态Redis的过期key清理采用惰性删除 定期删除两种策略。惰性删除访问key时检查是否过期过期就删。优点是省CPU缺点是可能积压过期key。定期删除每秒执行10次定时任务随机抽查一批key删除其中的过期key防止内存堆积。两者结合平衡CPU和内存。另外内存达到上限时会触发内存淘汰策略作为兜底但那是另一回事。好的帮你把内存淘汰策略的核心逻辑浓缩成一句话速记版内存淘汰策略4种核心算法算法全称淘汰逻辑LRULeast Recently Used淘汰最近最少使用的看时间LFULeast Frequently Used淘汰最不常使用的看频率Random随机随机淘汰TTLTime To Live淘汰剩余存活时间最短的只针对有过期时间的keyRedis 主从同步的核心流程用三句话概括就是第一次全量拷贝平时实时追随断线短时间内补差价。1. 第一次建立连接全量同步抓快照 补增量发 RDB 文件主节点Master在后台生成一份当前内存的RDB 镜像快照发给从节点Replica。从节点收到后清空自身加载这个 RDB。补同步期间的新数据在生成和传输 RDB 的过程中主节点新收到的写命令会存入内存缓冲区等 RDB 加载完后主节点把缓冲区里的命令发给从节点执行。2. 正常运行中长连接增量传播主从节点之间维持一个 TCP 长连接。主节点每收到一条写命令就会异步同步给从节点从节点照着执行保持数据实时一致。3. 网络短暂中断增量同步按进度断点续传主节点内部维护了一个固定大小的环形缓冲区repl_backlog_buffer一直记录着最新的写命令。网络恢复后从节点带上自己中断时的数据进度Offset向主节点发起重连进度还在缓冲区里主节点直接把缺失的那部分命令发过去断点续传。断网时间太长进度已被覆盖不得不重新触发一次完整的全量同步。

相关新闻

ChatGPT 出来的内容如何去除 #** 符号 结合 AI 导出鸭的应用分析

ChatGPT 出来的内容如何去除 #** 符号 结合 AI 导出鸭的应用分析

ChatGPT出来的内容如何去除#**符号 结合AI导出鸭的应用分析 一、项目核心痛点与市场需求 随着ChatGPT等生成式AI在办公、教育、科研、内容创作等领域全面普及,AI生成内容的二次处理问题逐渐成为行业普遍痛点。ChatGPT默认采用Markdown语法进行内容排版,输…

2026/8/5 22:59:39 阅读更多 →
DLSS Swapper完全指南:智能革命重新定义游戏性能优化

DLSS Swapper完全指南:智能革命重新定义游戏性能优化

DLSS Swapper完全指南:智能革命重新定义游戏性能优化 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 你是否曾经因为游戏更新导致DLSS版本不兼容而陷入性能困境?是否厌倦了手动备份、替换、验证…

2026/8/5 22:59:39 阅读更多 →
魔兽世界怀旧服DKT莱登冲分攻略:符文刃舞极限运用与WCL高分实战

魔兽世界怀旧服DKT莱登冲分攻略:符文刃舞极限运用与WCL高分实战

最近在魔兽世界怀旧服中,雷电王座副本的莱登战斗,对坦克职业,特别是死亡骑士(DK)提出了极高的要求。很多DKT(鲜血死亡骑士)朋友在尝试冲击WCL(Warcraft Logs)高分时&…

2026/8/5 22:58:38 阅读更多 →

最新新闻

STM32定时器中断:从原理到实战,掌握嵌入式实时控制核心

STM32定时器中断:从原理到实战,掌握嵌入式实时控制核心

1. 从“轮询”到“中断”:为什么定时器中断是嵌入式开发的基石如果你刚开始玩STM32,可能还在用HAL_Delay或者自己写个for循环来“数数”实现延时。这没问题,就像学走路先从爬开始。但当你需要让单片机同时“一心多用”——比如一边控制LED闪烁…

2026/8/5 23:47:01 阅读更多 →
【短期风电功率预测】近端梯度算法求解LASSO分位数回归-短期风电功率预测研究附Matlab代码

【短期风电功率预测】近端梯度算法求解LASSO分位数回归-短期风电功率预测研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室🍊个人信条:格物致知,完整Matlab代码及仿真咨询…

2026/8/5 23:47:01 阅读更多 →
Chrome 80+ Cookie加密机制解析与Python实战解密

Chrome 80+ Cookie加密机制解析与Python实战解密

1. 从一次数据迁移需求说起最近在做一个自动化工具,需要把A账号在Chrome浏览器里保存的登录状态,完整地“搬运”到B账号的Chrome里。听起来像是某种“黑科技”,其实核心需求很简单:用户不想在几十个网站上重新登录一遍。这个需求直…

2026/8/5 23:47:01 阅读更多 →
【语音增强】组稀疏信号去噪:非凸正则化,凸优化研究附Matlab代码

【语音增强】组稀疏信号去噪:非凸正则化,凸优化研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室🍊个人信条:格物致知,完整Matlab代码及仿真咨询…

2026/8/5 23:47:01 阅读更多 →
Ubuntu系统NVIDIA显卡驱动安装与配置全攻略

Ubuntu系统NVIDIA显卡驱动安装与配置全攻略

1. 项目概述:为什么在Ubuntu上装NVIDIA驱动是个“技术活”?如果你刚接触Linux,尤其是Ubuntu,想在它上面用上NVIDIA显卡,大概率会一头撞上驱动安装这堵墙。这不像在Windows上,去官网下载个.exe文件&#xff…

2026/8/5 23:47:01 阅读更多 →
Mysql:二级索引

Mysql:二级索引

二级索引也叫辅助索引、非聚簇索引,是建立在主键索引之外的索引。假设有一张用户表:CREATE TABLE users (id BIGINT PRIMARY KEY,name VARCHAR(50),age INT );如果创建:CREATE INDEX idx_name ON users(name);那么 idx_name 就是二级索引。二…

2026/8/5 23:46:00 阅读更多 →

日新闻

Java缓存框架:JetCache

Java缓存框架:JetCache

TOC 一、简介 JetCache 是一个 Java 缓存抽象框架,为不同的缓存解决方案提供了统一的使用方式。 它提供的注解比 Spring Cache 更加强大。 JetCache 的注解支持原生 TTL、两级缓存以及在分布式环境中的自动刷新功能,同时你也可以通过代码直接操作 Cach…

2026/8/5 0:00:43 阅读更多 →
AD 铺铜设置十字连接,过孔全连接,新版AD的简单设置

AD 铺铜设置十字连接,过孔全连接,新版AD的简单设置

需求:通孔焊盘 十字花;过孔 Via 实心直连;贴片焊盘按需设置 AD 测试版本AD24 很多工程师踩坑:全部统一十字,导致接地过孔阻抗高、大电流发热! 一、快捷键打开规则 PCB 界面按下:D R 展开…

2026/8/5 0:00:43 阅读更多 →
AI素描转换技术深度拆解(2024最新论文+工业级落地代码):从Stable Diffusion ControlNet到LoRA微调全链路解析

AI素描转换技术深度拆解(2024最新论文+工业级落地代码):从Stable Diffusion ControlNet到LoRA微调全链路解析

更多请点击: https://kaifayun.com 第一章:AI生成素描效果 AI生成素描效果是计算机视觉与风格迁移技术融合的典型应用,其核心在于将彩色照片或RGB图像转换为具有手绘质感、明暗对比强烈、边缘清晰的单色素描图像。该过程通常依赖于深度学习模…

2026/8/5 0:00:43 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/5 15:00:43 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/5 13:13:56 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/5 10:20:36 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/5 23:28:39 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/5 21:00:14 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/5 23:46:51 阅读更多 →