0

0

Redis如何拦截查询不存在的数据

P粉602998670

P粉602998670

发布时间:2026-03-15 11:29:32

|

841人浏览过

|

来源于php中文网

原创

用SET存带过期时间的空值(如"null" EX 600),避免不存或分步设过期;配合布隆过滤器拦截非法key;回源时加分布式锁或本地缓存合并请求;空值统一标识并监控突增。

redis如何拦截查询不存在的数据

Redis缓存穿透:空值怎么存才不被绕过

直接说结论:用 SET 存一个带过期时间的空值(比如 "null""{}"),而不是不存、也不用 EXPIRE 单独设——否则并发请求仍可能打穿缓存。

空值必须带过期时间,否则会永久占用内存;但也不能过短(比如 1 秒),否则高并发下刚过期就又被击穿。常见做法是设为正常缓存 TTL 的 1/3~1/2,比如业务数据缓存 30 分钟,空值就设 10 分钟。

  • SET key "null" EX 600 是安全写法;SET key "null" + EXPIRE key 600 在主从异步复制或命令重试时可能漏设过期,导致脏空值长期滞留
  • 客户端读到 "null" 要主动转成 null 或抛业务异常,不能原样返回给上层
  • 别用 ""(空字符串)代替 "null",某些序列化库(如 Jackson)对空串和 null 处理逻辑不同,容易埋坑

用布隆过滤器提前拦截非法 key

空值缓存只能防“存在但查无结果”的穿透,对“根本不存在的 key”(比如恶意构造的 user:9999999999)效果有限——这时候布隆过滤器(Bloom Filter)才是第一道防线。

它不存真实数据,只存 key 的指纹,空间小、查询快、支持亿级 key。但要注意:它有误判率(可能把不存在的 key 判为“可能存在”),所以只能用来快速拒绝,不能用来确认存在。

灵云AI开放平台
灵云AI开放平台

灵云AI开放平台

下载
  • 推荐用 Redis 官方模块 redisbloom,加载后可用 BF.ADD / BF.EXISTS;自己实现易出哈希冲突或扩容 bug
  • 初始化阶段要把所有合法 key 全量写入布隆过滤器,漏掉一个,那个 key 就永远被拦截(判为不存在)
  • 布隆过滤器不支持删 key,如果业务有 key 删除场景(如用户注销),得换用支持删除的变种(如 Cuckoo Filter),或者加一层本地缓存兜底

GET 返回 nil 时,别直接回源 DB

很多代码写成 “GET key → nil → 查 DB → 写缓存”,这在穿透场景下等于把压力原封不动导给数据库。关键不是“查没查 DB”,而是“有没有限流 / 熔断 / 合并请求”。

  • 用分布式锁(如 SET key lock_value NX EX 5)包裹回源逻辑,让同一 key 的多个并发请求中只有一个去查 DB,其余等待并复用结果
  • 锁过期时间必须明显短于 DB 查询耗时上限,否则可能死锁;建议设为 DB P99 耗时的 2 倍
  • 更稳妥的做法是加一层本地缓存(如 Caffeine),对同一个 key 的重复请求在进程内合并,避免反复打 Redis 锁

警惕 JSON 序列化导致的“假空值”

后端常把 DB 查询结果 JSON.stringify() 后塞进 Redis,但如果对象字段全为 null 或空数组,有些序列化配置会输出 {},而前端或下游服务把它当有效数据用了——实际是“伪命中”,本质还是穿透。

  • 存之前显式判断原始数据是否为空:比如 Java 里用 Objects.isNull(user) || user.getId() == null,而不是依赖 JSON 字符串内容
  • Redis 里统一用 "NULL"(全大写)或预定义占位符(如 "__MISSING__"),避免和业务正常返回的空对象混淆
  • 监控要单独埋点:统计 GET 返回 "NULL" 的频次,如果突增,说明上游数据写入异常或布隆过滤器没更新

真正麻烦的不是“怎么存空值”,而是“怎么确保所有写路径都走同一套空值判定逻辑”。不同接口、不同 SDK、不同运维脚本,只要有一处漏了,穿透就从那条缝里漏出来。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
什么是分布式
什么是分布式

分布式是一种计算和数据处理的方式,将计算任务或数据分散到多个计算机或节点中进行处理。本专题为大家提供分布式相关的文章、下载、课程内容,供大家免费下载体验。

412

2023.08.11

分布式和微服务的区别
分布式和微服务的区别

分布式和微服务的区别在定义和概念、设计思想、粒度和复杂性、服务边界和自治性、技术栈和部署方式等。本专题为大家提供分布式和微服务相关的文章、下载、课程内容,供大家免费下载体验。

251

2023.10.07

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

457

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

549

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

337

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

82

2025.09.10

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

254

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1111

2024.03.01

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

69

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号