怎样利用本地内存缓存减轻Redis穿透压力_Caffeine与Redis两级架构

秋枫酱_1162

秋枫酱_1162

2026-06-20

606人浏览

原创

caffeine 本身不能防止缓存穿透,因其对不存在的 key 无感知且不拦截请求;真正防线是布隆过滤器、空值缓存等前置策略,caffeine 仅作为二级缓存加速已确认存在的热点数据。

怎样利用本地内存缓存减轻redis穿透压力_caffeine与redis两级架构

本地缓存(Caffeine)不能单独“防止”穿透,但能显著降低 Redis 层被无效请求击穿的概率——关键在于它必须和布隆过滤器、空值缓存等策略配合使用,否则只是把压力从 Redis 转移到了本地内存和数据库。

为什么 Caffeine 本身不防穿透

Caffeine 是纯内存、进程内缓存,对“不存在的 key”完全无感知:它既不会拦截非法请求,也不会主动拒绝查询。如果一个恶意请求查 user:999999999(根本不存在),Caffeine 查不到就直接往下走,照样打到 Redis → 再打到数据库。它只在“存在且热点”的数据上起加速作用。

  • 穿透请求不会命中 Caffeine,所以它不参与拦截逻辑
  • 若错误地把所有缓存未命中都 fallback 到数据库,Caffeine 反而会放大穿透风险(比如多个实例各自加载失败再各自重试)
  • Caffeine 的 maximumSize 和 expireAfterWrite 对穿透零防护能力

Caffeine + Redis 多级结构中真正的穿透防线在哪

穿透防御必须前置,Caffeine 在这个架构里是“第二道缓冲”,不是第一道闸机。真正承担拦截任务的是:

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

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

下载
  • BloomFilter:部署在网关或服务入口,用位数组快速判断 product:12345 是否可能存在于全量 ID 集合中;误判率可控(如 0.1%),但绝不会漏判
  • Redis SET 或 HyperLogLog 预热集合:用于校验合法 ID 范围(适合 ID 规则明确的场景,如自增主键)
  • 空值缓存:Redis 中对 user:999999999 返回 null 后,仍写入 cache:user:999999999 → "NULL" 并设 TTL=30s,避免重复穿透

只有这些前置策略生效后,Caffeine 才能安心做它的本职工作:把那些“已确认存在、且高频访问”的数据(如 user:1001)稳稳接住,减少 Redis 查询频次。

Caffeine 的正确接入姿势:不雪上加霜,只锦上添花

在穿透防护链路中,Caffeine 的价值是“降低有效请求的延迟”,而非“过滤无效请求”。配置和使用时需注意:

  • 禁用 refreshAfterWrite:它会在后台异步 reload,若数据不存在,reload 会反复触发数据库查询
  • 设置短过期(如 expireAfterWrite(5, TimeUnit.SECONDS)):避免本地缓存长期保留陈旧空值或错误状态
  • 不开启 recordStats() 生产环境:统计开销在高并发下明显,穿透场景下更易成为瓶颈
  • 与 Redis 缓存 key 保持语义一致:比如 Redis 存 user:1001,Caffeine 也用相同 key,避免双写不一致导致本地缓存“永远不更新”

容易被忽略的协同细节

两级缓存不是简单叠加,失效同步才是难点:

  • 当数据库更新 user:1001,必须同步 invalidate 所有节点的 Caffeine 缓存 —— 不能只删 Redis;否则其他节点还在用旧本地值
  • 推荐用 Redis Pub/Sub 发布 cache:evict:user:1001 消息,各节点监听后调用 caffeineCache.invalidate("user:1001")
  • 布隆过滤器的容量要预留余量:若商品总数 1 亿,ScalableBloomFilter 初始容量设为 1.2 亿,否则扩容时误判率飙升
  • 空值缓存的 TTL 必须远小于正常数据 TTL(如 30s vs 2h),否则攻击者可批量刷空值占满 Redis 内存

相关专题

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

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

2023.11.02

4349

19

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

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

2023.11.14

3855

11

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

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

2024.04.02

7052

6

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

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

2024.04.07

623

6

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

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

2024.04.07

756

6

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

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

2024.04.07

6762

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

5978

6

热门下载

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

精品课程

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

共0课时 | 0人学习