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

从字典扩容到高位进位加法:图解Redis SCAN命令的底层遍历原理

从字典扩容到高位进位加法图解Redis SCAN命令的底层遍历原理Redis的SCAN命令是开发者工具箱中不可或缺的利器尤其当面对海量键值对的遍历需求时。与简单粗暴的KEYS命令不同SCAN通过精妙的高位进位加法算法和渐进式处理策略在保证性能的同时避免了服务阻塞。本文将深入Redis字典结构的核心设计揭示SCAN命令如何优雅应对扩容缩容场景以及为何它能成为生产环境的首选遍历方案。1. Redis字典结构与遍历挑战Redis的键空间存储在一个全局字典中其底层实现采用经典的数组链表结构。这个字典的初始大小为4个槽位slot随着键值对的增加会自动扩容每次扩容将槽位数量翻倍4→8→16→32...。这种设计带来两个关键特性哈希冲突处理当不同键的哈希值映射到同一槽位时会形成链表结构快速定位通过哈希值与掩码mask的位运算直接定位槽位// Redis字典结构的简化表示 typedef struct dict { dictEntry **table; // 二维指针数组 unsigned long size; // 总槽位数2^n unsigned long sizemask; // 掩码size-1 unsigned long used; // 已使用槽位数 } dict;传统遍历方式面临的核心问题是在遍历过程中发生扩容/缩容会导致元素位置变化。假设我们正遍历一个8槽位的字典原始槽位存储元素示例扩容后位置16槽位0 (000)keyA, keyB0 (0000), 8 (1000)3 (011)keyC, keyD, keyE3 (0011), 11 (1011)5 (101)keyF5 (0101), 13 (1101)这种位置变化可能导致两个严重问题重复遍历扩容后部分元素会移动到新槽位可能被重复扫描遗漏风险缩容时多个槽位元素合并可能跳过某些未检查的元素2. 高位进位加法SCAN的遍历智慧SCAN命令采用高位进位加法Reverse Binary Iteration算法这是一种与常规二进制计数方向相反的遍历顺序。其核心优势在于无论字典如何扩容缩容都能保证元素不被重复或遗漏。2.1 常规遍历 vs 高位进位遍历以4槽位字典为例观察两种遍历顺序差异# 常规顺序 高位进位顺序 000 (0) 000 (0) 001 (1) 100 (4) 010 (2) 010 (2) 011 (3) 110 (6) 100 (4) 001 (1) 101 (5) 101 (5) 110 (6) 011 (3) 111 (7) 111 (7)高位进位加法的数学本质是每次迭代都在二进制表示的左侧加1进位向右传递。这种顺序具有以下关键特性扩容友好新槽位原槽位高位0/1保证扩容后遍历连续性缩容兼容去掉最高位后仍保持遍历进度2.2 扩容场景下的遍历保证假设当前字典从8槽位扩容到16槽位SCAN的遍历过程如下已遍历槽位000(0)→100(4)→010(2)→110(6)当前游标指向001(1)扩容后原001(1)的元素会分散到0001(1)和1001(9)根据高位进位顺序下一个遍历的将是0001(1)关键观察扩容后需要检查的新槽位1001其数值大于当前游标0001因此不会重复扫描已检查过的区域3. 渐进式rehash与SCAN实现Redis采用渐进式rehash策略来平滑处理字典扩容这会导致同时存在两个哈希表ht[0]和ht[1]。SCAN命令需要特殊处理这种状态def scan(dict, cursor): # 检查是否处于rehash状态 if dict.is_rehashing(): # 先扫描小表中的槽位 scan_small_table() # 再扫描大表中对应范围的槽位 scan_large_table() else: scan_normal_table() # 应用高位进位算法计算新游标 new_cursor reverse_binary_increment(cursor) return new_cursor, results实际处理中的几个关键细节双表扫描需要同时检查新旧两个哈希表游标转换根据rehash进度调整游标映射关系重复过滤客户端需要处理可能的重复结果4. 生产环境中的最佳实践虽然SCAN解决了KEYS的阻塞问题但使用时仍需注意以下要点4.1 COUNT参数调优COUNT参数只是建议值实际返回数量可能波动。建议测试不同COUNT值的效果COUNT值平均返回键数网络往返次数CPU负载10085-120较高低1000800-1500中等中50003000-6000低高4.2 客户端处理模式推荐以下客户端实现模式// Java示例基于Jedis的SCAN封装 public SetString safeScan(Jedis jedis, String pattern) { SetString keys new HashSet(); String cursor ScanParams.SCAN_POINTER_START; ScanParams params new ScanParams().match(pattern).count(500); do { ScanResultString result jedis.scan(cursor, params); keys.addAll(result.getResult()); cursor result.getCursor(); } while (!cursor.equals(ScanParams.SCAN_POINTER_START)); return keys; }4.3 特殊场景处理集群环境需要对每个节点单独执行SCAN大键扫描结合TYPE命令识别大对象模式优化prefix*比*suffix模式效率更高在百万级键值对的生产环境中合理使用SCAN可以将遍历操作对服务的影响控制在2%以下的性能波动而KEYS命令可能导致秒级阻塞。这也是为什么所有Redis生产规范都强制要求使用SCAN替代KEYS。

相关文章:

从字典扩容到高位进位加法:图解Redis SCAN命令的底层遍历原理

从字典扩容到高位进位加法:图解Redis SCAN命令的底层遍历原理 Redis的SCAN命令是开发者工具箱中不可或缺的利器,尤其当面对海量键值对的遍历需求时。与简单粗暴的KEYS命令不同,SCAN通过精妙的高位进位加法算法和渐进式处理策略,在…...

避开这3个坑,你的夜间灯光数据(NPP/VIIRS)ANLI计算结果才准确

避开这3个坑,你的夜间灯光数据(NPP/VIIRS)ANLI计算结果才准确 深夜的城市灯光如同流动的星河,而NPP/VIIRS卫星捕捉的这些光点正成为区域经济研究的"新货币"。但当我第一次用ArcGIS计算昆明各区县的平均灯光指数&#x…...

【实战篇 / ZTNA】(7.0) ❀ 从零到一:FortiClient 7.0 企业级部署与策略配置全解析 ❀ FortiGate 防火墙

1. FortiClient 7.0 企业级部署前的关键规划 企业级部署FortiClient 7.0绝非简单的软件安装,而是涉及终端安全架构的整体升级。我在多个金融和制造业客户的实际部署中发现,前期规划不充分往往导致后期策略调整困难。首先需要明确的是,FortiCl…...

HEIF Utility终极指南:在Windows上免费打开和转换苹果HEIF照片的完整教程

HEIF Utility终极指南:在Windows上免费打开和转换苹果HEIF照片的完整教程 【免费下载链接】HEIF-Utility HEIF Utility - View/Convert Apple HEIF images on Windows. 项目地址: https://gitcode.com/gh_mirrors/he/HEIF-Utility 还在为iPhone拍摄的照片在W…...

2026年株洲老人小孩都能用专业床垫有哪些?

引言随着生活水平的提高,人们对床垫的要求也越来越高。特别是对于老人和小孩这两类特殊人群,选择一款合适的床垫尤为重要。本文将介绍几款适合老人和小孩使用的专业床垫,其中包括德国美得丽(Musterring)床垫。德国美得…...

如何快速入门ROS机器人仿真:WPR系列仿真工具完整指南

如何快速入门ROS机器人仿真:WPR系列仿真工具完整指南 【免费下载链接】wpr_simulation 项目地址: https://gitcode.com/gh_mirrors/wp/wpr_simulation 想要在虚拟环境中快速学习ROS机器人开发吗?wpr_simulation项目为你提供了一个完美的起点&…...

Kubernetes部署MeiliSearch:从概念到生产级实践指南

1. 项目概述:当MeiliSearch遇见Kubernetes 如果你正在寻找一个轻量级、高性能的开源搜索引擎,并且你的应用恰好运行在Kubernetes上,那么 meilisearch/meilisearch-kubernetes 这个项目就是你一直在等的“官方说明书”。简单来说&#xff0c…...

多智能体编排实战:从架构设计到生产部署的12周训练指南

1. 项目概述与核心价值最近在探索如何系统性地掌握多智能体编排技术时,我遇到了一个名为“Shadow Dojo”的开源项目。这个名字很有意思,“道场”一词本身就意味着一个需要持续练习、精进技艺的地方。这个项目将自己定位为“训练场”,目标非常…...

TikTok评论抓取工具:3步轻松获取完整评论数据

TikTok评论抓取工具:3步轻松获取完整评论数据 【免费下载链接】TikTokCommentScraper 项目地址: https://gitcode.com/gh_mirrors/ti/TikTokCommentScraper 想要从TikTok视频中获取所有评论数据进行分析吗?TikTokCommentScraper是一款强大的开源…...

仅剩最后47份|Perplexity v2.3文档搜索增强协议白皮书(含Beta版Search Schema DSL规范)

更多请点击: https://intelliparadigm.com 第一章:Perplexity v2.3文档搜索增强协议概览 Perplexity v2.3 引入了全新的文档搜索增强协议(Document Search Augmentation Protocol, DSAP),旨在提升跨格式、多源文档的语…...

Pearcleaner终极指南:5步实现Mac应用彻底卸载,释放宝贵存储空间

Pearcleaner终极指南:5步实现Mac应用彻底卸载,释放宝贵存储空间 【免费下载链接】Pearcleaner A free, source-available and fair-code licensed mac app cleaner 项目地址: https://gitcode.com/gh_mirrors/pe/Pearcleaner 还在为Mac存储空间不…...

# 软考软件设计师·考前14天终极冲刺

📚 软考软件设计师考前14天终极冲刺📅 2026年5月9日 | 距考试仅剩14天(5月23-26日) 🎯 今日主题:终极冲刺策略 全模块速查 12大易混淆概念辨析 10道精准选择题一、⏰ 14天冲刺倒计时战略规划 &#x1f4…...

别再被格式拖垮论文!Paperxie 一键搞定 4000 + 高校毕业论文排版,省下三天改稿时间

paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能格式排版/文献综述/AI PPThttps://www.paperxie.cn/format/typesettinghttps://www.paperxie.cn/format/typesetting 当你终于写完毕业论文的最后一个字,以为能松口气,却发现格式排版才是真正的 “…...

量子优化算法与经典算法在Max-Cut问题中的性能对比

1. 量子优化算法与Max-Cut问题概述 Max-Cut问题是图论中一个经典的NP难组合优化问题,其目标是将给定无向图的顶点划分为两个互不相交的子集,使得连接这两个子集的边权重之和最大。这个问题在统计物理、电路设计和网络聚类等领域有广泛应用背景。随着量子…...

手把手教你解决Ubuntu 16.04虚拟机安装Matlab 2018a时的‘DVD2’挂载难题

深度解析Ubuntu虚拟机安装Matlab时的多镜像挂载技巧 在科研和工程领域,Matlab作为一款功能强大的数学计算软件,其安装过程却常常让Linux用户尤其是虚拟机使用者头疼不已。特别是当安装进行到一半,系统突然提示"请插入DVD2"时&…...

机场混凝土道面摊铺车辆行驶控制【附方案】

✨ 长期致力于履带式车辆、滑模摊铺、道面边界检测、轨迹规划、行驶控制器研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1)多模态道面边界检测与卡尔曼…...

从源码到桌面:手把手教你用Python搭建SimpleFOCStudio开发环境(Windows/Mac)

从源码到桌面:手把手教你用Python搭建SimpleFOCStudio开发环境(Windows/Mac) 在开源硬件和电机控制领域,SimpleFOCStudio已成为开发者调试无刷电机的利器。不同于直接下载可执行文件的"快餐式"使用,从源码构…...

智能合约钱包自动化交互:ca-agent-skills 技能库解析与实践

1. 项目概述与核心价值最近在梳理智能合约钱包(Smart Contract Wallet)的生态工具时,我注意到了 Portkey 团队开源的ca-agent-skills仓库。这个项目乍一看名字有点抽象,但深入研究后,我发现它解决了一个非常实际且关键…...

如何用QVina实现20倍分子对接加速:3步构建高效药物筛选平台

如何用QVina实现20倍分子对接加速:3步构建高效药物筛选平台 【免费下载链接】qvina Accurately speed up AutoDock Vina 项目地址: https://gitcode.com/gh_mirrors/qv/qvina 如果你正在进行大规模药物筛选或分子对接计算,等待时间过长可能成为研…...

Python异步Web框架SerpentStack:高性能API服务开发指南

1. 项目概述:SerpentStack,一个被低估的Python异步Web框架最近在GitHub上闲逛,又看到了一个名为“SerpentStack”的Python Web框架项目,作者是Benja-Pauls。说实话,第一眼看到这个名字,我差点把它归为又一个…...

Java 时间日期 API - SimpleDateFormat 创建、Java 日期时间 API 推荐

SimpleDateFormat 创建 1、构造方法 (1)基本介绍 默认构造方法,使用默认格式和默认区域设置 public SimpleDateFormat()使用指定格式和默认区域设置 public SimpleDateFormat(String pattern)使用指定格式和指定区域设置 public SimpleDateFo…...

Linux服务器挂载Google团队盘实战:从API申请到Rclone配置的完整避坑指南

Linux服务器高效挂载Google团队盘全流程指南:从API申请到稳定运行 在数据爆炸式增长的今天,云存储已成为企业IT架构中不可或缺的一环。Google团队盘以其大容量、高可靠性和便捷的协作特性,成为许多技术团队的首选存储方案。本文将带你深入探…...

终极免费方案:5步解锁Cursor Pro AI编程助手完整功能

终极免费方案:5步解锁Cursor Pro AI编程助手完整功能 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your tria…...

5分钟搞定:抖音无水印批量下载工具终极应用指南

5分钟搞定:抖音无水印批量下载工具终极应用指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support. 抖…...

别再让Excel卡死了!手把手教你安装Oracle Crystal Ball并管理加载项(附32/64位安装包)

高效管理Oracle Crystal Ball加载项:告别Excel卡顿的终极指南 你是否经历过这样的场景:刚安装完Oracle Crystal Ball准备大展身手,却发现Excel启动速度慢得像蜗牛爬行?作为一款强大的蒙特卡洛模拟工具,Crystal Ball确…...

AUTOSAR ECU资源模板:硬件描述与工程实践

1. AUTOSAR ECU资源模板的核心价值解析在汽车电子系统开发领域,AUTOSAR(汽车开放系统架构)已经成为行业公认的标准框架。作为这个框架中的关键组成部分,ECU资源模板在实现软硬件解耦方面发挥着不可替代的作用。这个模板本质上是一…...

零代码AI自动化测试:Midscene.js让每个人都能成为测试专家

零代码AI自动化测试:Midscene.js让每个人都能成为测试专家 【免费下载链接】midscene AI-powered, vision-driven UI automation for every platform. 项目地址: https://gitcode.com/GitHub_Trending/mid/midscene 你是否曾经为复杂的UI自动化测试感到头疼&…...

从个人会用AI到企业真正变强:收藏这份AI升级指南

文章指出,虽然员工开始使用AI工具提升个人效率,但企业整体能力并未因此增强。企业AI升级的关键在于将AI融入流程、业务、协作和组织,而非仅仅停留在工具使用层面。文章强调AI应进入企业运行结构,从个人动作转变为企业能力&#xf…...

收藏 | AI智能体红利期:小白也能抓住的500万人才缺口机遇!

本文揭示了AI智能体岗位的巨大市场需求,官方数据显示人才缺口达500万,供求比例1:10。大厂如腾讯、百度、阿里等纷纷加码招聘,应届生平均月薪高达17038元。普通人无需高深技术,通过外包服务、定制智能体、技能插件销售、内容科普等…...

用CC2530 DIY一个无线串口透传模块:基于Zigbee的无线数据收发实践

基于CC2530的Zigbee无线串口透传模块实战指南 在物联网和智能硬件开发领域,无线数据传输一直是核心需求之一。CC2530作为一款集成了Zigbee射频前端的经典芯片,其成本效益和成熟生态使其成为众多开发者的首选。本文将带您深入探索如何利用两块CC2530开发板…...