如何利用Redis结合内存网格技术实现零穿透的高性能架构?

大辰小哥_4878

大辰小哥_4878

2026-10-08

249人浏览

原创

缓存穿透本质是请求未在应用入口拦截导致高频查无数据,需分层防护:网关校验+限流、布隆过滤器(id可枚举场景)、空值缓存加随机ttl兜底。

如何利用redis结合内存网格技术实现零穿透的高性能架构?

做不到“零穿透”,但能压到接近业务可忽略的量级——关键不在堆技术,而在分层拦截和请求合法性前置。

缓存穿透的本质不是Redis问题,而是请求没被拦在应用入口

所谓“零穿透”,常被误解为让Redis自己扛住所有非法key。实际上,Redis对不存在的key只能返回nil,它不负责判断“这个key该不该存在”。真正该拦截的位置是:API网关、Spring Cloud Gateway、Nginx或Controller层的参数校验。

  • 恶意ID(如user:-1、product:999999999999)应在反序列化后立刻被@Min(1)或正则校验拒绝,不进缓存逻辑
  • 高频扫描类请求(如爬虫批量试key)应通过IP+路径限流(如Sentinel QPS=5),直接429返回
  • 布隆过滤器(BloomFilter)只适合“全量已知ID空间”的场景(如用户表主键范围确定),若ID来自外部不可控输入(如第三方OAuth ID),布隆过滤器反而成瓶颈和误判源

Redisson.getLock() 不是用来防穿透的,而是防击穿的

很多人把RLock套在get(key)外层,以为能挡穿透——这是典型误用。当key根本不存在时,get()直接返回null,锁根本不会触发;只有key存在但过期/未命中时,锁才起作用。

Redis Skill - 高性能缓存管理
Redis Skill - 高性能缓存管理

Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。

下载
  • 穿透场景:请求user:1008611,数据库无此记录 → redisTemplate.opsForValue().get("user:1008611") 返回null → 直接查DB → 锁没机会加
  • 击穿场景:热点keyproduct:123同时过期 → 多个线程都走到if (user == null)分支 → 此时RLock才生效,只放行一个线程查库
  • 正确用法:锁应加在“查库 + 写缓存”这一整段逻辑外,且必须配合tryLock(3, 2, TimeUnit.SECONDS)避免死等

空值缓存必须带随机偏移,否则会引发雪崩式续命

缓存空对象看似简单,但set(key, "", 60, TimeUnit.SECONDS)这种写法在高并发下极易导致“空值雪崩”:大量空key在同一秒过期,瞬间涌向DB。

  • 必须加随机偏移:比如基础TTL=60s,再叠加±10s扰动,实际过期时间落在50~70s之间
  • 空值内容不能是空字符串,而应是明确标识(如"NULL_V1"),便于后续灰度剔除或监控统计
  • 需配套清理机制:用redis-cli --scan --pattern "user:*" | grep NULL_V1定期抽样检查,防止空值堆积占用内存

内存网格(IMDG)如Redisson本身不解决穿透,但能降低拦截成本

Redisson的RMapCache或RLocalCachedMap本质是本地缓存+远程兜底,它对穿透的贡献在于:把部分“本该打到Redis的无效请求”,提前在JVM内拦截掉。

  • 例如配置localCacheOptions.entryExpireAfterWrite(10, TimeUnit.SECONDS),即使Redis里没key,本地Map也会记住“user:999999查过且为空”,10秒内不再发请求
  • 但注意:RLocalCachedMap的本地缓存默认不共享,多实例部署时各节点本地缓存独立,无法全局拦截——此时仍需布隆过滤器或网关层统一校验
  • 真正提升的是“重复无效请求”的响应速度,从RT 2ms(网络+Redis)降到0.05ms(纯内存),但首次穿透依然发生

穿透防控最硬的那道墙,永远在离用户最近的地方:网关做合法性校验、限流、WAF规则;中间件层做布隆过滤(仅限ID可枚举场景);应用层做空值+随机TTL兜底。把Redis当成最后一道缓冲,而不是第一道防线。

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

相关标签:

redis

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

相关专题

更多
常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.02

4329

19

内存数据库有哪些
内存数据库有哪些

内存数据库有Redis、Memcached、Apache Ignite、VoltDB、TimesTen、H2 Database、Aerospike、Oracle TimesTen In-Memory Database、SAP HANA和ache Cassandra。更多关于内存数据库相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.14

3835

11

mongodb和redis哪个读取速度快
mongodb和redis哪个读取速度快

redis 的读取速度比 mongodb 更快。原因包括:1. redis 使用简单的键值存储,而 mongodb 存储 json 格式的数据,需要解析和反序列化。2. redis 使用哈希表快速查找数据,而 mongodb 使用 b-tree 索引。因此,redis 在需要高性能读取操作的应用程序中是一个更好的选择。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.02

6972

6

redis怎么做缓存服务器
redis怎么做缓存服务器

redis 作为缓存服务器的答案:redis 是一款开源、高性能、分布式的键值存储,可作为缓存服务器使用。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

623

6

redis怎么解决数据一致性
redis怎么解决数据一致性

redis 提供了两种一致性模型,以维护副本数据一致性:强一致性 (sync) 确保写操作仅在复制到所有从节点后才完成;最终一致性 (async) 则在主节点上写操作后认为已完成,牺牲一致性换取性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

736

6

mysql和redis怎么保证双写一致性
mysql和redis怎么保证双写一致性

确保 mysql 和 redis 双写一致性的技术包括:1、事务性更新:同时更新 mysql 和 redis,保证一致性;2、主从复制:mysql 主服务器更改同步到 redis 从服务器;3、基于事件的更新:mysql 记录更改并发送到 redis等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

6642

6

redis缓存一般存些什么数据
redis缓存一般存些什么数据

redis缓存中存储的数据类型包括:字符串、哈希、列表、集合、有序集合、位图、地理空间数据和hyperloglog。这些数据类型适用于存储各种数据,从简单信息到复杂对象和地理位置。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

1160

6

redis的8种数据类型有哪些
redis的8种数据类型有哪些

redis 提供 8 种数据类型:字符串(文本、数字、二进制)、哈希(键值对)、列表(有序集合)、集合(无序唯一元素)、有序集合(按分数排序)、地理空间(地理位置)、hyperloglog(估计大数据基数)和位图(位序列存储)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

1036

6

redis主要作用有哪些
redis主要作用有哪些

redis 的主要作用包括:1. 缓存数据,提高访问速度;2. 充当消息队列,实现消息传递;3. 存储各种数据类型,如字符串、散列和集合;4. 管理会话信息,确保可靠性和可用性;5. 限制请求速率,防止服务器超载等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

5898

6

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpEnv手册
phpEnv手册

共0课时 | 0人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.5万人学习