商城外卖家政商品列表为什么能抗住反复刷:查缓存查库回写一次拆解

简介: 本文详解DSMall商品列表缓存优化实践:通过「条件序列化生成唯一Key」避免漏参、收紧数据库查询条件保障数据安全、TTL+业务Tag实现精准失效。一整套方案将高频读请求从DB卸载至KV,显著降低数据库压力,适用于商城、外卖、家政等多场景列表缓存。(239字)

用户端最凶的流量,经常是商品/服务列表:商城 SKU、外卖菜品、上门家政服务项,按平台、店铺、分类、排序一刷就是一屏。
如果每次都打库,高峰时数据库连接和慢查询会先告警。
本文只拆 DSMall 商品列表这一条链路,看缓存具体卡在哪一步。


1. 场景:同一筛选会被问很多遍

列表请求通常带着一串条件,例如:

  • platform(mall 商城 / food 外卖 / house 上门家政 / kms)
  • store_id、分类、排序字段
  • limit 条数

同一运营位、同一店铺首页,短时间内条件几乎不变——典型读多写少。


2. 第一步:用「整包参数」生成 Key

不是手写 goods_list_mall_store_12_...(易漏参数),而是:

$cacheKey = sprintf(
    CacheKeyManager::GOODS_LIST_KEY,  // goods_list_%s
    md5(serialize($data))
);
$result = KvManager::cache()->get($cacheKey);

要点:

  • 模板前缀固定在 CacheKeyManager,方便全局搜索
  • serialize($data) 把当次查询条件整体纳入指纹
  • 换排序、换分类 = 换 Key,不会串数据

命中则直接返回,后面的 DAO 不再跑。


3. 第二步:未命中才查库,且条件收紧

只有 $result == null 时才组装查询,例如坚持:

  • 已上架
  • 系统审核通过
  • 未软删
  • 库存 > 0

再叠加请求里的 platform / store / 分类等。
排序也白名单化(销量、评分、时间、点击、最低价等),避免任意字段注入排序。

也就是说:缓存里存的是「已经适合给 C 端看的结果」,不是随便一张宽表 dump。


4. 第三步:回写时带 TTL 和 Tag

KvManager::cache()->set(
    $cacheKey,
    $result,
    3600,                           // 1 小时
    CacheKeyManager::GOODS_TAG      // tag = goods
);

两层含义:

  1. TTL:即使忘记手动失效,最迟一小时也会过期重建
  2. Tag:后台改商品分类、运营调整商品域时,可 clear(GOODS_TAG) 整组丢掉相关列表/分页缓存,而不用知道有哪些 md5 Key

分页接口同理,用 GOODS_PAGES_KEY + 同一 GOODS_TAG,和列表共用失效域。


5. 性能上到底赚在哪

无缓存 有列表缓存
每次筛选打库 + 关联查询 热点条件几乎只读缓存
连接数随 QPS 涨 回源次数被 TTL / 失效节奏压住
排序、分类重复计算 同指纹条件复用结果集

这不是「缓存万能」,而是:把最热、可变维度可枚举的读请求,从 DB 挪到 KV。

店铺列表、技师列表也是同一套路:STORE_LIST_KEY / TECHNICIAN_LIST_KEY + md5(serialize($data)) + 3600 + 对应 Tag。学会商品列表,其它列表几乎同构。


6. 使用时要注意的三点

  1. 条件必须进入 Key
    漏掉 platform 会导致商城列表串到外卖数据。用整包 serialize 就是为了降低漏拼概率。

  2. 写商品后要能失效
    只 set 不 clear,用户会在最长 TTL 内看到旧列表。分类、积分商品等后台写操作应对应 clear(*_TAG)。

  3. 开关
    CACHE_ENABLED=false 时 get/set 相当于旁路,便于本地调试;压测和生产再打开。


收束

商品列表抗刷,靠的不是单行「加 Redis」,而是:

条件指纹 Key → 收紧条件查库 → TTL + 业务 Tag 回写。

把这一条链路跑顺,本地生活 C 端(商城、外卖、上门家政)大半读流量就有了抓手。

相关文章
|
1月前
|
弹性计算 缓存 运维
阿里云服务器特惠价格:轻量38元起,2核4G仅199元,个人和企业首选
2026年阿里云入门级云服务器的活动参考,针对个人开发者与普通企业用户的主流需求,梳理了不同配置的高性价比选型方案。其中2核2G档位推出两大爆款:轻量应用服务器低至38元首年,适配个人博客、展示型官网等轻负载场景;经济型e实例2核2G仅99元/年,新老用户同享,可支撑中小型Web应用运行。2核4G档位中,通用算力型u1实例以199元/年的价格搭配5M固定带宽,成为企业级入门场景的高性价比首选。
|
7月前
|
存储 缓存 数据库
原理解读|PolarDB-X 列存索引、列存快照
列存快照是PolarDB-X基于列存索引提供的轻量级历史数据查询能力,无需数据搬运与额外存储,通过“钉住”版本链节点实现秒级AS OF TSO查询,适用于历史分析与误操作恢复,成本低、易用性强。(239字)
|
移动开发 监控 小程序
java家政平台源码,家政上门清洁系统源码,数据多端互通,可直接搭建使用
一款基于Java+SpringBoot+Vue+UniApp开发的家政上门系统,支持小程序、APP、H5、公众号多端互通。涵盖用户端、技工端与管理后台,支持多城市、服务分类、在线预约、微信支付、抢单派单、技能认证、钱包提现等功能,源码开源,可直接部署使用。
889 24
|
机器学习/深度学习 人工智能 搜索推荐
底层技术大揭秘!AI智能导购如何重塑购物体验
双十一期间,淘宝内测AI助手“淘宝问问”,基于阿里通义大模型,旨在提升用户在淘宝上的商品搜索和推荐效率。该助手通过品牌推荐、兴趣商品推荐和关联问题三大板块,提供个性化购物体验。其背后采用多智能体架构,包括规划助理和商品导购助理,通过对话历史和用户输入,实现精准商品推荐。此外,文章还介绍了如何快速部署此解决方案,并探讨了其对现代购物体验的影响。
|
开发框架 监控 .NET
【学习笔记】Verilog之三:行为建模方法
Verilog是一种硬件描述语言,用于模拟电子系统的结构和行为。行为建模是Verilog的一种方法,分为数据流行为建模和顺序行为建模。 数据流行为建模主要使用`assign`语句,它描述了电路的功能而不涉及具体结构。连续赋值语句(`assign`)用于给线网分配值,当右端表达式发生变化时,新值会立即赋给线网。此外,还有时延的概念,可以指定赋值或事件发生的延迟时间。
|
人工智能 搜索推荐
AI能力更加原子化,业务流程迈向“无感智能”
【1月更文挑战第7天】AI能力更加原子化,业务流程迈向“无感智能”
983 1
AI能力更加原子化,业务流程迈向“无感智能”
多重比较示例:Bonferroni校正法和Benjamini & Hochberg法
多重比较示例:Bonferroni校正法和Benjamini & Hochberg法
|
虚拟化
设备管理中的虚拟机vmware网卡异常
设备管理中的虚拟机vmware网卡异常
|
运维 Kubernetes 监控
避免业务中断,K8s节点故障排查攻略,速来围观!
避免业务中断,K8s节点故障排查攻略,速来围观!
806 0