升鲜宝生鲜配送供应链管理系统--- 《多语言商品查询优化方案(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 不命中时自动回退数据库翻译表。
相关推荐
行者全栈架构师12 小时前
IDEA 中 Maven 项目的 15 个红色报错快速解决方法
java·后端
令人头秃的代码0_012 小时前
mac(m5)平台编译openjdk
java
用户3169353811831 天前
Java连接Redis
redis
倔强的石头_1 天前
《Kingbase护城河》——数据库存储空间全景探测与精细化瘦身实战
数据库
唐青枫1 天前
Java JDBC 实战指南:从 Connection 到事务和连接池
java
一个做软件开发的牛马1 天前
MyBatis-Plus 从零实战:完整搭建可运行 Demo,BaseMapper 零 SQL、Wrapper 条件构造、分页插件与代码生成器详解
java·后端
用户3721574261351 天前
Java 处理 PDF 图片:提取 PDF 中的图片,并压缩 PDF 图片体积
java
用户3721574261351 天前
Java 打印 Word 文档:从基础打印到高级设置
java
冬奇Lab2 天前
每日一个开源项目(第134篇):Zvec - 阿里开源的嵌入式向量数据库,向量搜索界的 SQLite
数据库·人工智能·llm
用户3521802454752 天前
当 Prompt 学会"热更新":Spring Boot × Nacos3 AI 实战
java·spring boot·ai编程