升鲜宝生鲜配送供应链管理系统--- 《多语言商品查询优化方案(Redis + 翻译表 + 模糊匹配)》

升鲜宝生鲜配送供应链管理系统--- 《多语言商品查询优化方案(Redis + 翻译表 + 模糊匹配)》

一、方案概述

本方案旨在实现商品模块的多语言查询与显示一体化。通过结合 Redis 缓存与数据库翻译表(sys_dynamic_translation),实现以下目标:

  1. 用户可根据当前语言环境进行多语言关键词搜索。
  2. 查询结果自动返回对应语言的名称与属性。
  3. 优先从 Redis 读取翻译缓存,无缓存则从数据库读取并写回 Redis。

二、查询流程图

用户输入 keyword="Salmon"

Redis hGetAll("i18n:pms_goods:en-US")

│ 命中 → [1001]

WHERE goods_id IN (1001)

数据库分页查询 pms_goods 表

结果 → 显示 goodsName=Salmon(Redis翻译值)

三、Redis Key 结构

模块 Redis Key 示例 结构 缓存字段

商品信息 i18n:pms_goods:{lang} Hash<goodsId, goodsName> goodsName, goodsMaterial

品牌信息 i18n:pms_brand:{lang} Hash<brandId, brandName> brandName

分类信息 i18n:pms_goods_category:{lang} Hash<categoryId, categoryName> categoryName

材质信息 i18n:pms_goods_material:{lang} Hash<materialId, materialName> materialName

单位信息 i18n:pms_goods_unit:{lang} Hash<unitId, unitName> unitName

规格信息 i18n:pms_goods_sku:{lang} Hash<skuId, skuName> skuName

四、多语言匹配代码模板

以下为多语言模糊查询模板代码示例:

String lang = LanguageContextHolder.getLanguage();

String keyword = query.getGoodsName();

if (StringUtils.isNotBlank(keyword)) {

List matchedIds = new ArrayList<>();

String redisKey = "i18n:pms_goods:" + lang;

Map<String, Object> allTranslations = redisUtils.hGetAll(redisKey);

复制代码
// ① 优先从 Redis 匹配
if (MapUtils.isNotEmpty(allTranslations)) {
    for (Map.Entry<String, Object> entry : allTranslations.entrySet()) {
        if (entry.getValue() != null && entry.getValue().toString().toLowerCase().contains(keyword.toLowerCase())) {
            matchedIds.add(Long.valueOf(entry.getKey()));
        }
    }
}

// ② Redis 无 → 查数据库
if (matchedIds.isEmpty()) {
    List<SysDynamicTranslationEntity> translations =
        sysDynamicTranslationService.selectSysDynamicTranslationListByFieldValueLike(
            "pms_goods", lang, "goodsName", keyword);
    if (CollectionUtils.isNotEmpty(translations)) {
        matchedIds = translations.stream().map(SysDynamicTranslationEntity::getEntityId).distinct().collect(Collectors.toList());
    }
}

// ③ 将匹配结果加入查询条件
if (CollectionUtils.isNotEmpty(matchedIds)) {
    query.getEntityIdList().addAll(matchedIds);
}

}

五、查询与显示一体化方案(伪代码)

// Step 1: 处理查询条件

List matchedIds = i18nMatchService.findEntityIdsByKeyword("pms_goods", "goodsName", query.getGoodsName(), lang);

if (!matchedIds.isEmpty()) {

query.getEntityIdList().addAll(matchedIds);

}

// Step 2: 执行分页查询

List goodsList = pmsGoodsDao.findPmsGoodsNewPage(query);

// Step 3: 国际化字段填充

for (RespPmsGoodsPageNewDTO dto : goodsList) {

dto.fillI18nFields(redisUtils, sysDynamicTranslationService);

}

// Step 4: 返回分页结果

return new PageData<>(goodsList, page.getTotal());

六、性能优化要点

  1. Redis 命中率高,查询性能提升 10~20 倍。
  2. 模糊匹配优先 Redis,避免频繁 SQL 查询。
  3. 缓存更新机制:新增/修改商品、品牌、分类时自动更新对应语言缓存。
  4. 支持所有模块(品牌、分类、材质、单位)通用复用。
  5. 降级策略:Redis 不命中时自动回退数据库翻译表。
相关推荐
NineData6 小时前
NineData 迁移评估功能正式上线
数据库·dba
怒放吧德德9 小时前
Netty 4.2 入门指南:从概念到第一个程序
java·后端·netty
雨中飘荡的记忆11 小时前
大流量下库存扣减的数据库瓶颈:Redis分片缓存解决方案
java·redis·后端
NineData12 小时前
数据库迁移总踩坑?用 NineData 迁移评估,提前识别所有兼容性风险
数据库·程序员·云计算
心之语歌13 小时前
基于注解+拦截器的API动态路由实现方案
java·后端
赵渝强老师14 小时前
【赵渝强老师】PostgreSQL中表的碎片
数据库·postgresql
华仔啊14 小时前
Stream 代码越写越难看?JDFrame 让 Java 逻辑回归优雅
java·后端
ray_liang14 小时前
用六边形架构与整洁架构对比是伪命题?
java·架构
Ray Liang16 小时前
用六边形架构与整洁架构对比是伪命题?
java·python·c#·架构设计
Java水解16 小时前
Java 中间件:Dubbo 服务降级(Mock 机制)
java·后端