搜索、缓存与索引
本文整理 DGJ2.0 商品搜索、物料缓存、Redis、Mongo、ES 和缓存刷新任务。排查“搜索不到”“列表数据旧”“库存/价格展示不一致”时按本文定位。
业务目标
- 区分哪些数据来自业务库,哪些来自缓存或索引。
- 知道商品、物料、价格、服务站库存相关缓存在哪里刷新。
- 避免只改数据库却忘记刷新缓存。
入口文件
- ES 服务:
application/Services/Cache/EsSer.php - 物料缓存:
application/Services/Materiels/* - 商品缓存任务:
application/controllers/tasks/GoodsCache.php - ES 缓存任务:
application/controllers/tasks/GoodsEsCache.php、UpdateEsGoodsInfo.php - 缓存管理:
application/controllers/inner/CacheManage.php - Redis key:
application/KzData/Enums/RedisKeys.php - Mongo 缓存:
application/Components/Cache/MongoCache.php
常见缓存类型
| 类型 | 用途 | 常见风险 | | --- | --- | --- | | Redis | 黑名单、仓库、服务站配置、部分业务缓存 | 旧 key 未删除、TTL 不一致 | | ES | 商品搜索、物料查询、帮助中心搜索 | 索引延迟、字段未同步 | | Mongo | 大对象/搜索类缓存 | 数据旧、集合口径不明 | | 本地文件/CI cache | 配置或临时缓存 | 发布后旧缓存残留 | | 业务表聚合 | 热销、最近采购、销售记录 | 异步任务延迟 |
商品搜索排查
- 查商品主数据:
t_bs_goods、t_bs_goods_ext。 - 查价格和可售限制:
t_bs_goods_purprice、销售限价、限购。 - 查服务站仓库/库存:
t_bs_goods_sto、t_scm_inventory_real_time。 - 查 ES/物料缓存是否包含该商品。
- 查缓存刷新任务是否执行。
物料缓存排查
物料缓存相关服务集中在:
MaterielCacheSer.phpMaterielCacheQuerySer.phpMaterielCacheQueryEsSer.phpMaterielCacheStationSer.phpMaterielCacheStationEsSer.phpMaterielFrontCacheSer.phpBuyLimitSkuCacheSer.phpHasPriceSkuCacheSer.php
服务站侧查询要特别注意:全局物料缓存和服务站物料缓存不是一个口径,是否有价格、是否限购、是否能售卖都会影响结果。
缓存刷新原则
- 商品基础数据变更后,刷新商品缓存和 ES。
- 价格变更后,刷新服务站物料价格相关缓存。
- 限购、套包、敏感词由商品中心消息同步后,要刷新对应缓存。
- 菜单/权限规则变更后,刷新 Redis 黑名单和规则缓存。
- 库存问题优先查业务库,缓存只解释“展示旧”的原因。
常用 rg 命令
rg -n "class .*Cache|MaterielCache|EsSer|MongoCache|RedisKeys" application/Services application/Components application/KzData
rg -n "GoodsCache|GoodsEsCache|UpdateEsGoodsInfo|GoodsCacheFlush" application/controllers/tasks
rg -n "itemcenter_item_price_enable|itemcenter_package_status_sync|sensitive_word" application/controllers/tasks application/KzData/Enums
rg -n "KzCache::getInstance|hGet|hSet|set\\(|del\\(" application/Services application/service application/controllers | head
改动风险和回归清单
- 商品搜索:关键字、品牌、分类、车型、服务站维度。
- 采购商品列表:可买、价格、库存、限购。
- 销售商品列表:可卖、售价、库存、客户价。
- 活动商品:活动价、库存、黑白名单、状态。
- 缓存刷新:立即刷新、异步任务刷新、失败重试。