如何利用Redis与Kafka异步解耦高并发击穿时的写回操作?

冬芳吖_9628

冬芳吖_9628

2026-09-04

302人浏览

原创

不能靠kafka单独解决缓存击穿写回竞争,因其不保证同一key仅被一个消费者处理,也无跨消费者互斥机制;必须结合redis原子锁(如setnx或lua脚本)实现并发控制,kafka仅作异步通知。

如何利用redis与kafka异步解耦高并发击穿时的写回操作?

直接结论:不能靠 Kafka 单独解决缓存击穿时的写回竞争,必须用 Redis 的原子操作(如 SETNX 或 Lua 脚本)先抢锁,再发消息触发异步重建;否则多个消费者会同时查库、重复写缓存,甚至写入脏数据。

为什么不能让 Kafka 消费者直接重建缓存?

Kafka 本身不保证“同一 key 只被一个消费者处理”,也不提供跨消费者互斥能力。哪怕你把 refresh_user_123 发到单分区 topic,只要 consumer group 有多个实例,就可能被不同 consumer 同时拉取——尤其在 rebalance 或消息重试时。

典型错误现象:

  • 日志里看到 3 个 consumer 几乎同时执行 SELECT * FROM user WHERE id = 123
  • Redis 中 user:123 被反复覆盖,version 字段来回跳变
  • 前端轮询拿到的结果忽新忽旧,状态不一致

正确做法:Redis 锁 + Kafka 异步通知组合

核心逻辑是“只让第一个穿透请求发消息,其余全部等结果”,把并发控制压在 Redis 层,Kafka 只做轻量通知。

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

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

下载

关键步骤:

  • 请求到达时,先用 SET user:123:lock "1" NX EX 30 尝试加锁;失败则轮询 GET user:123 直到非空或超时
  • 加锁成功者,立即发一条 refresh_user_123 到 Kafka,并设置 user:123:pending 标记(防止重复发)
  • Kafka 消费者收到后,查 DB 构建全量数据,用 SET user:123 "{json}" EX 3600 写入(不带 NX),再 DEL user:123:lock
  • 所有等待线程在锁释放后读到新缓存,无需再触发重建

容易被忽略的三个实操细节

很多项目按上述流程写了,仍出现击穿,问题往往卡在这几个地方:

  • SETNX 的过期时间必须显著长于 DB 查询 P99 耗时(比如查库 P99 是 800ms,锁至少设 5s),否则锁提前释放,第二个线程又进来了
  • 消息体里必须带时间戳或 version,消费者写缓存前要先 GET user:123:version 对比,旧版本直接丢弃——避免因消息乱序导致缓存倒退
  • Kafka 消费者必须开启 enable.auto.commit=false,并在 SET 成功后再手动 commitSync(),否则写缓存失败但 offset 已提交,这条消息就永久丢失了

真正难的不是发消息,而是让“锁的生命周期”“消息投递语义”“缓存写入原子性”三者严丝合缝对齐。少一环,防护就漏风。

相关文章

Kafka Eagle可视化工具
Kafka Eagle可视化工具

Kafka Eagle是一款结合了目前大数据Kafka监控工具的特点,重新研发的一块开源免费的Kafka集群优秀的监控工具。它可以非常方便的监控生产环境中的offset、lag变化、partition分布、owner等,有需要的小伙伴快来保存下载体验吧!

下载

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

相关专题

更多
kafka消费者组有什么作用
kafka消费者组有什么作用

kafka消费者组的作用:1、负载均衡;2、容错性;3、广播模式;4、灵活性;5、自动故障转移和领导者选举;6、动态扩展性;7、顺序保证;8、数据压缩;9、事务性支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.01.12

2206

5

kafka消费组的作用是什么
kafka消费组的作用是什么

kafka消费组的作用:1、负载均衡;2、容错性;3、灵活性;4、高可用性;5、扩展性;6、顺序保证;7、数据压缩;8、事务性支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

550

5

rabbitmq和kafka有什么区别
rabbitmq和kafka有什么区别

rabbitmq和kafka的区别:1、语言与平台;2、消息传递模型;3、可靠性;4、性能与吞吐量;5、集群与负载均衡;6、消费模型;7、用途与场景;8、社区与生态系统;9、监控与管理;10、其他特性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

524

5

Java 流式处理与 Apache Kafka 实战
Java 流式处理与 Apache Kafka 实战

本专题专注讲解 Java 在流式数据处理与消息队列系统中的应用,系统讲解 Apache Kafka 的基础概念、生产者与消费者模型、Kafka Streams 与 KSQL 流式处理框架、实时数据分析与监控,结合实际业务场景,帮助开发者构建 高吞吐量、低延迟的实时数据流管道,实现高效的数据流转与处理。

2026.02.04

570

32

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

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

2023.11.02

4089

19

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

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

2023.11.14

3575

11

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

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

2024.04.02

6352

6

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

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

2024.04.07

603

6

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

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

2024.04.07

716

6

热门下载

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

精品课程

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

共0课时 | 0人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.5万人学习