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

Redis模糊查询实战:从keys到scan的演进与避坑指南

1. Redis模糊查询的生死抉择keys命令的血泪教训那天凌晨三点我被急促的电话铃声惊醒。线上订单系统突然卡死监控大屏一片飘红。登录服务器后用redis-cli --latency检测发现Redis响应时间高达2000ms紧急排查后发现原来是一位新同事在后台脚本中使用了keys order_202305*这样的模糊查询试图统计当月订单量。这个看似无害的操作直接让整个Redis实例陷入瘫痪。为什么keys命令会成为生产环境的噩梦原因在于它的实现机制。Redis作为单线程服务keys命令会一次性遍历整个键空间复杂度是O(n)。当你的Redis中有1000万个key时这个命令可能需要几百毫秒才能返回结果。在这期间其他所有命令都必须排队等待——这就是我们常说的阻塞问题。我见过太多团队踩过这个坑。有个电商项目在促销期间用keys统计商品访问量直接导致支付接口超时损失惨重。这也是为什么Redis官方文档明确警告Dont use KEYS in your regular application code。很多DBA会直接禁用这个命令# redis.conf安全配置 rename-command keys 不过keys命令并非一无是处。在开发环境和小数据量场景下它确实简单好用。支持的通配符也足够灵活*匹配任意数量字符如user:*:profile?匹配单个字符如device:00?[]匹配指定范围的字符如log:[abc]2023但请记住生产环境使用keys就像在加油站抽烟可能暂时没事但迟早会引爆灾难。2. SCAN命令拯救Redis性能的超级英雄在经历了那次事故后我花了整周时间研究替代方案。Redis 2.8引入的SCAN命令成为了我的救命稻草。与keys不同SCAN采用增量式迭代的方式每次只返回少量数据通过游标控制遍历进度。这就像用吸管喝奶茶而不是直接端起杯子灌——虽然总量相同但对系统的冲击小得多。先看个典型用法# 第一次扫描cursor从0开始 127.0.0.1:6379 SCAN 0 MATCH user:* COUNT 100 1) 352 # 下次扫描的游标位置 2) 1) user:1001 2) user:1002 # 继续扫描 127.0.0.1:6379 SCAN 352 MATCH user:* COUNT 100 1) 0 # 返回0表示扫描结束 2) 1) user:1003 2) user:1005SCAN的四大核心优势非阻塞式每次只处理部分数据不会长时间占用线程可控吞吐通过COUNT参数调整每次返回数量注意这只是hint值状态无关服务端不保存遍历状态所有状态都在游标值中模式匹配支持与KEYS相同的通配符语法但SCAN也不是银弹它有这些特殊行为需要特别注意可能重复需要客户端做去重处理不保证完整遍历期间数据修改可能导致结果不完整COUNT不精确实际返回数量可能大于或小于COUNT值空结果不意味着结束必须检查游标是否为03. 深入SCAN原理从字典结构到高位进位加法为了真正掌握SCAN我们需要深入Redis的字典实现。Redis的所有key都存储在一个哈希表中这个表的结构类似Java的HashMap一维数组二维链表。SCAN的游标实际上就是数组的槽位索引。为什么SCAN的遍历顺序如此奇怪它采用了一种叫高位进位加法的算法。普通加法是从右往左进位而高位进位法是从左往右。比如从000到111的遍历顺序是000→100→010→110→001→101→011→111。这种看似反人类的顺序设计其实是为了解决扩容/缩容时的遍历难题。当哈希表从8扩容到16时原本在槽位010(2)的数据会分散到0010(2)和1010(10)采用高位进位法新槽位正好在遍历顺序上是相邻的通过这种设计无论字典如何扩容缩容SCAN都能保证不重复遍历已扫描的槽位不遗漏未扫描的槽位最终覆盖所有键空间渐进式rehash的挑战Redis在扩容时会同时存在新旧两个哈希表。SCAN需要同时扫描这两个表并将结果合并返回。这也是为什么在rehash期间SCAN可能会返回更多重复数据。4. 实战避坑指南从代码到配置的全方位防护经过多次踩坑我总结出这些黄金实践原则4.1 键名设计规范前缀明确业务:实体:ID的层级结构如order:paid:202305避免过度模糊user:1001:*比*:1001:*效率高100倍控制键长度过长的键名会占用更多内存和网络带宽4.2 SCAN最佳实践Java(Jedis)示例public SetString safeScan(Jedis jedis, String pattern) { SetString result new HashSet(); String cursor ScanParams.SCAN_POINTER_START; ScanParams params new ScanParams().match(pattern).count(500); do { ScanResultString scanResult jedis.scan(cursor, params); result.addAll(scanResult.getResult()); cursor scanResult.getCursor(); } while (!cursor.equals(ScanParams.SCAN_POINTER_START)); return result; }性能优化技巧合理设置COUNT通常200-1000之间需要根据数据规模测试调整管道化操作在需要处理大量key时结合pipeline减少网络往返客户端缓存对结果做本地缓存避免频繁扫描并行扫描对大集群可以分片并行执行SCAN4.3 生产环境加固禁用危险命令rename-command FLUSHALL rename-command KEYS 监控慢查询slowlog-log-slower-than 10000 # 记录超过10ms的命令 slowlog-max-len 128 # 保留128条慢日志设置超时timeout 30 # 客户端空闲30秒后断开连接4.4 特殊场景处理对于集合/哈希等复杂类型Redis提供了专用扫描命令# 扫描哈希表 HSCAN user:1001 profile 0 MATCH addr* # 扫描有序集合 ZSCAN products 0 MATCH iphone* # 扫描集合 SSCAN tags 0 MATCH java*在数据迁移场景中可以结合DUMPRESTORE命令实现安全的数据转移# 获取键的序列化值 DUMP user:1001 # 恢复键值 RESTORE user:1001 0 \x12\x34\x56...5. 决策树何时用KEYS何时用SCAN经过多年实践我形成了这样的决策流程是否生产环境是 → 必须用SCAN否 → 进入下一步判断数据量是否超过1万是 → 用SCAN否 → 可以考虑keys是否需要精确结果是 → 注意SCAN可能遗漏修改中的数据否 → SCAN更合适是否高频调用是 → 考虑用Redis原生索引或外部搜索引擎否 → 可以用SCAN对于监控类需求更好的方案是预先聚合数据。比如用HyperLogLog统计UV用Sorted Set维护热键而不是实时扫描。在最近的一个物联网项目中我们处理设备状态查询时采用了这样的架构设备上报 → 写入Redis → 异步聚合 → 生成预计算结果这样前端查询直接获取预计算结果完全避免了模糊查询的需求。

相关文章:

Redis模糊查询实战:从keys到scan的演进与避坑指南

1. Redis模糊查询的生死抉择:keys命令的血泪教训 那天凌晨三点,我被急促的电话铃声惊醒。线上订单系统突然卡死,监控大屏一片飘红。登录服务器后用redis-cli --latency检测,发现Redis响应时间高达2000ms!紧急排查后发现…...

终极指南:如何用NPYViewer快速可视化NumPy数组数据

终极指南:如何用NPYViewer快速可视化NumPy数组数据 【免费下载链接】NPYViewer Load and view .npy files containing 2D and 1D NumPy arrays. 项目地址: https://gitcode.com/gh_mirrors/np/NPYViewer 还在为NumPy数组数据可视化而烦恼吗?面对二…...

AI工具搭建自动化视频生成输出审核

# AI工具搭建视频生成中的数据脱敏:一个Python开发者的实战笔记 做视频自动生成这件事,碰到的第一个坎往往不是技术选型,而是数据安全。特别是当视频里要展示真实用户数据的时候,总不能把用户的姓名、手机号、住址这些敏感信息直接…...

AI工具搭建自动化视频生成用户数据脱敏

# AI工具搭建视频生成中的数据脱敏:一个Python开发者的实战笔记 做视频自动生成这件事,碰到的第一个坎往往不是技术选型,而是数据安全。特别是当视频里要展示真实用户数据的时候,总不能把用户的姓名、手机号、住址这些敏感信息直接…...

AI工具搭建自动化视频生成GDPR

好的,我们直接切入正题。 1. 他到底是什么 很多人一听到“GDPR”,第一反应是欧洲那个让人头疼的数据隐私法规。别搞混了,这里说的“GDPR”是一个Python库的名字,全称是“General Data Protection Regulation … 哦不,开…...

AI工具搭建自动化视频生成生成日志审计

1,它是个啥 其实就是拿AI当黑盒,把视频生成这件事拆成按脚本跑的一连串动作,然后全程记下谁在什么时候调了哪个模型、输出了啥、花了多少秒、花了多少钱。做这件事的人,多半是公司里管产研的那几位,他们怕的不是AI干砸…...

从Prompt Gateway到Content SLA引擎:2026奇点大会上最受瞩目的5个开源组件,已集成至CNCF沙箱(限前500名开发者获取部署手册)

更多请点击: https://intelliparadigm.com 第一章:AI原生内容生成平台:2026奇点智能技术大会AIGC系统搭建 在2026奇点智能技术大会上,主办方构建了一套面向多模态协同创作的AI原生内容生成平台(AIGC-OS)&a…...

3步解锁电脑隐藏性能:UXTU硬件调优实战指南

3步解锁电脑隐藏性能:UXTU硬件调优实战指南 【免费下载链接】Universal-x86-Tuning-Utility Unlock the full potential of your Intel/AMD based device. 项目地址: https://gitcode.com/gh_mirrors/un/Universal-x86-Tuning-Utility 还在为游戏卡顿而烦恼吗…...

从零搭建AI-ready数据管道:2026奇点大会现场复刻的3小时极速部署流水线(含LLM元数据自动标注模块)

更多请点击: https://intelliparadigm.com 第一章:AI原生数据管道搭建:2026奇点智能技术大会数据工程实践 在2026奇点智能技术大会上,核心数据平台团队首次全栈落地了真正意义上的AI原生数据管道(AI-Native Data Pipe…...

MockGPS虚拟定位终极指南:从零开始快速掌握位置模拟技巧

MockGPS虚拟定位终极指南:从零开始快速掌握位置模拟技巧 【免费下载链接】MockGPS Android application to fake GPS 项目地址: https://gitcode.com/gh_mirrors/mo/MockGPS MockGPS是一款专为Android设备设计的开源虚拟定位应用,能够帮助用户在不…...

视频去水印工具推荐:免费视频去水印怎么弄?2026实测手机电脑好用方法全汇总

视频去水印工具推荐:免费视频去水印怎么弄?2026实测手机电脑好用方法全汇总 视频水印这件事,很多人都遇到过。从平台保存的视频自带LOGO角标,转发来的内容带着别人账号的水印,或者AI生成的视频角落挂着一串平台标识——…...

2026年最佳同城小程序推荐榜单,助你高效解锁本地生活

本文围绕同城小程序的技术架构、功能覆盖及实际应用效果展开深度解析,系统梳理了当前市场上的主流工具如何助力用户高效解锁本地生活服务。通过对多项核心指标的横向测评与案例分析,重点探讨了同城小程序在资源匹配效率、数据安全机制及生态扩展性方面的…...

2026年小程序多少钱对比:精选5大权威推荐帮你选对平台

小程序开发方案的选择直接影响功能匹配度与成本效益,2026年主流服务商主要分为模板化与定制化两类路径。本文将从开发费用构成、五大平台核心方案及选择策略三方面展开分析,帮助您快速定位适合自身业务阶段与预算的选项。内容涵盖基础功能解析、价格对比…...

Go语言服务网格负载均衡策略

Go语言服务网格负载均衡策略 1. 负载均衡算法 package loadbalancetype LoadBalancer interface {Select([]string) string }type RoundRobin struct {index intmu sync.Mutex }func NewRoundRobin() *RoundRobin {return &RoundRobin{} }func (r *RoundRobin) Select(e…...

Go语言服务网格egress:外部服务访问

Go语言服务网格egress:外部服务访问 1. Egress代理 package egressimport ("net/http""net/url" )type EgressProxy struct {dialer *net.Dialertransport *http.Transport }func NewEgressProxy() *EgressProxy {return &EgressProxy{d…...

2025最权威的五大降AI率方案推荐榜单

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 在当今这个人工智能生成内容被广泛运用的时代,“降AI”已经成为内容创作者以及运…...

3分钟掌握Navicat重置脚本:让Mac版数据库工具无限试用

3分钟掌握Navicat重置脚本:让Mac版数据库工具无限试用 【免费下载链接】navicat_reset_mac navicat mac版无限重置试用期脚本 Navicat Mac Version Unlimited Trial Reset Script 项目地址: https://gitcode.com/gh_mirrors/na/navicat_reset_mac 还在为Navi…...

不只是安装!用Docker一键搞定OpenVSLAM开发环境,顺便聊聊它的Web查看器怎么用

从零构建OpenVSLAM容器化开发环境:Web可视化与高效调试实战 在视觉SLAM研究领域,环境配置往往是阻碍开发者快速上手的首要障碍。不同版本的依赖库冲突、系统环境差异导致的运行失败,这些问题消耗了研究者大量本该用于算法创新的宝贵时间。本…...

基于Simulink的异步电机恒压频比开环调速系统建模与性能分析

1. 异步电机恒压频比控制原理揭秘 我第一次接触恒压频比控制时,被这个专业名词吓到了,后来发现它的核心思想其实特别简单。想象一下开车时的油门踏板——踩得越深车速越快,但发动机的"力气"(扭矩)基本保持不…...

用Python和NumPy手搓一个光流可视化工具:从理解数组到生成动态箭头图

用Python和NumPy手搓光流可视化工具:从数组操作到动态运动解析 光流分析是计算机视觉中理解物体运动的核心技术之一。想象一下,当你观看一段足球比赛视频时,如何用代码让计算机"看到"球员的跑动轨迹?这就是光流技术要解…...

别再复制粘贴了!手把手教你用Simulink封装打造自己的‘傻瓜式’模块库

别再复制粘贴了!手把手教你用Simulink封装打造自己的‘傻瓜式’模块库 每次打开Simulink建模时,你是否总在重复搭建那些相似的PID控制器、滤波器或信号处理单元?当团队协作时,是否经常需要向同事解释某个复杂子系统的参数含义&…...

海思Hi3516 GPIO复用避坑指南:从Excel引脚复用表到实际配置的完整解析

海思Hi3516 GPIO复用配置实战:从寄存器解析到避坑全攻略 当你在调试Hi3516开发板时,是否遇到过这样的场景:明明按照手册配置了GPIO,硬件却毫无反应?或者发现某个复用引脚无法正常工作?这些问题往往源于对海…...

PyWxDump:微信数据解析技术的合规边界与技术挑战

PyWxDump:微信数据解析技术的合规边界与技术挑战 【免费下载链接】PyWxDump 删库 项目地址: https://gitcode.com/GitHub_Trending/py/PyWxDump PyWxDump是一个曾专注于微信数据解析的开源项目,它展示了在复杂软件生态中进行数据提取和分析的技术…...

OSEK-NM网络管理实战:从Alive/Ring/LimpHome报文解析到逻辑环故障排查

OSEK-NM网络管理实战:从Alive/Ring/LimpHome报文解析到逻辑环故障排查 当车载CAN总线上的某个ECU突然"失联",或者车辆熄火后某些模块仍在异常耗电时,背后往往隐藏着OSEK网络管理协议的运行异常。作为汽车电子领域的"神经系统检…...

5分钟解放双手:淘宝淘金币自动化脚本终极指南

5分钟解放双手:淘宝淘金币自动化脚本终极指南 【免费下载链接】taojinbi 淘宝淘金币自动执行脚本,包含蚂蚁森林收取能量,芭芭农场全任务,解放你的双手 项目地址: https://gitcode.com/gh_mirrors/ta/taojinbi 淘金币自动化…...

从零到一:我的循迹小车避坑指南与实战心得

1. 从零开始:循迹小车项目初体验 第一次接触循迹小车是在大学电子设计课上,看着学长们的小车能自动沿着黑线跑,觉得特别神奇。当时就暗下决心要自己做一辆,没想到这个决定让我开启了长达一个月的"痛苦并快乐着"的旅程。…...

5月中国AI独角兽融资热潮:DeepSeek领涨,月之暗面、阶跃星辰等估值重估!

5月中国AI产业一级市场热闹非凡这个5月,中国AI产业的一级市场热闹非凡。先是国产超级AI独角兽DeepSeek,正在推进成立以来的首次外部融资。最新消息显示,国家AI产业投资基金、腾讯等资方都已进入洽谈名单。一个月前,就有消息传出De…...

流式深度强化学习突破“流式壁垒”:“意图更新”算法性能比肩SAC,计算量仅1/140

一脚油门,开出了多大的坑传统梯度学习的步长规定参数每次移动多大,但对函数输出改变多少缺乏控制。就像驾车学习停车入库,教练规定每次「踩油门0.1秒」,但不同路况下车子前进距离差异大,有时差一厘米入库,有…...

一天2710亿Token!“爱马仕”反超“龙虾”,AI Agent进入真实用量竞争阶段

“爱马仕”登顶全球应用调用榜5月9日,Hermes Agent(昵称:爱马仕)登顶OpenRouter全球应用调用量榜首,首次超越OpenClaw(昵称:龙虾)。据OpenRouter应用Token消耗榜最新数据&#xff0c…...

算法定义空间 视频承载孪生

算法定义空间 视频承载孪生副标题:摒弃硬件依赖固有模式,形成数字孪生低成本高适配落地新形态数字孪生产业发展进程中,长期被硬件堆叠、外设绑定的固有路径裹挟,行业通用方案均以激光雷达、专业测绘设备、定位基站、定制终端为核心…...