升鲜宝生鲜配送供应链管理系统--- 《多语言商品查询优化方案(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 不命中时自动回退数据库翻译表。
相关推荐
weixin_586061467 分钟前
Navicat导入Excel表格报错怎么跳过_忽略错误记录高级选项
jvm·数据库·python
2301_7735536219 分钟前
golang如何理解编译指示pragma_golang编译指示pragma策略
jvm·数据库·python
qq_3422958219 分钟前
c++字符串运算_连接、比较、输入输出等运算符重载应用
jvm·数据库·python
m0_7467523020 分钟前
如何生成ADDM报告_@addmrpt.sql自动数据库诊断监控工具
jvm·数据库·python
2301_8148098626 分钟前
如何快速查询SQL中的重复记录:GROUP BY与COUNT统计
jvm·数据库·python
m0_6845019826 分钟前
如何配置DG的备库延迟应用_DELAY参数实现在备库防范主库人为误操作逻辑错误
jvm·数据库·python
m0_5150984229 分钟前
Redis怎样强行终止陷入死循环的Lua脚本
jvm·数据库·python
2301_8176722630 分钟前
SQL中RIGHT JOIN真的很少用吗_数据完整性检查与反向关联分析
jvm·数据库·python
2501_9142459333 分钟前
mysql如何进行表空间传输恢复_mysql transport tablespace实战
jvm·数据库·python
qq_3300379935 分钟前
MongoDB的聚集索引怎么用_Clustered Collections的插入性能优化
jvm·数据库·python