柔性缓存那块儿,业务数据怎么搬到Redis里,再把缓存也放进redis去用
- 问答
- 2026-01-12 07:18:49
- 4
根据文章《58同城高性能移动端API网关架构实践》中的描述,他们处理业务数据到Redis的流程是这样的,他们并不是直接把数据库里的数据原封不动地扔进Redis就完事了,那样做的话,Redis就只是一个简单的缓存,谈不上“柔性”。
他们的核心思路是,把Redis当成一个构建“数据索引”的地方,而不是存储全部数据的地方,你可以想象一下,原来的方式是去图书馆找一本书,你需要把整本书的内容都背下来(相当于从数据库取出所有数据),而现在,你只需要去图书馆的索引卡片柜(Redis)里,根据书名或作者名(业务请求的关键参数)找到这本书的具体位置编号(比如书架号A-05),然后你再去对应的书架上拿书(相当于根据索引再去查询具体的数据源),这个“位置编号”就是他们在Redis里存放的东西,它很小,但能告诉你最终的数据在哪里。
具体怎么把业务数据“搬”进去呢?文章里提到了一个关键步骤叫“数据异构”,这个词听起来专业,但意思不难理解,就是说,后台有一个独立的系统(他们叫“数据异构队列”),这个系统会像一个小秘书一样,时刻盯着主数据库(比如MySQL)的变化,每当业务数据有更新,比如有新的商品上架,或者商品价格变了,这个小秘书就会立刻发现这个变动。
这个小秘书会根据变动的数据,开始它的工作:构建索引,它不会把整个商品的所有信息(如商品标题、详情描述、几十张图片链接、库存数量等)都塞进Redis,因为那样太占地方了,而且如果商品信息很复杂,存储和更新的成本都很高,相反,它会根据API网关将来会接收到的请求参数,来生成对应的索引键值对,最常见的请求是根据商品ID来查商品详情,小秘书就会在Redis里存一个键值对,键可能是“product_detail:12345”(12345是商品ID),值是什么呢?值不是完整的商品详情,而是一个“位置信息”,这个位置信息指向了另一个存储了完整商品详情的地方,比如一个更强大的分布式KV存储(如SSDB,它基于硬盘,容量大且成本低于Redis内存)的键,或者甚至是数据库里某条记录的ID。

这样一来,Redis里存放的“缓存”数据量就变得非常小,因为它只存了索引,这就是“柔性”的一个体现:对Redis的资源消耗小,抗风险能力强,即使某个热门商品的数据量巨大,但在Redis里也只是一个轻量级的索引条目,不会因为单个热点key就把Redis内存撑爆。
就是“再把缓存也放进Redis去用”的过程,这主要发生在API网关处理用户请求的时候,当用户的请求到达网关,网关会先去查询Redis,注意,这里它查询的是第一步构建好的“索引”,网关根据请求参数(比如商品ID=12345)生成一个Redis的key(如“product_detail:12345”),然后去Redis里取。
如果能取到这个索引(即缓存命中),网关就拿到了指向完整数据的“地址”,网关再根据这个地址,去下一个地方(比如SSDB或者数据库)获取完整的、详细的数据,网关把这些详细数据组装好,返回给用户。

如果Redis里没有这个索引(即缓存未命中),那说明可能这个数据是全新的,或者索引还没构建好,或者过期被清掉了,这时候,网关会转而直接去最终的数据源(比如数据库)查询完整的商品详情,查询到之后,它做两件事:第一,把详情数据返回给用户;第二,它可能会触发一个“异步重建”索引的过程,也就是说,网关不会停下来等待索引构建完成,那样会影响用户响应速度,而是告诉后台那个“小秘书”(数据异构系统):“喂,这个数据现在被请求了,但Redis里没索引,你去帮忙建一下。”然后小秘书会异步地去完成构建索引并存入Redis的工作,以备后续请求使用。
这种方式的另一个“柔性”体现在于,即使Redis完全宕机不可用了,整个系统也不会彻底瘫痪,API网关在发现Redis连接失败时,可以自动降级,直接跳过去查询最终的数据源(数据库等),虽然这样速度会慢一些,但保证了核心业务“商品详情查看”依然可用,只是性能有损耗,这就是一种柔性的故障应对策略。
这个流程的核心是:通过数据异构将业务数据在Redis中加工成轻量级的“索引”,API网关使用时先取索引,再根据索引取详细数据,这样做减少了Redis的压力和成本,并且通过索引降级机制保证了系统在缓存异常时的基本可用性。
(字数统计:约1100字)
本文由畅苗于2026-01-12发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:http://waw.haoid.cn/wenda/79175.html
