升鲜宝生鲜配送供应链管理系统--- 《多语言商品查询优化方案(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 不命中时自动回退数据库翻译表。
相关推荐
一抓掉一大把2 小时前
秒杀-StackExchangeRedisHelper连接单例
java·开发语言·jvm
JH30732 小时前
Redis 中被忽视的“键过期策略”与内存回收机制
数据库·redis·缓存
Microsoft Word2 小时前
Redis常见面试题
数据库·redis·缓存
bing.shao2 小时前
mongodb与redis在聊天场景中的选择
数据库·redis·mongodb
dudke2 小时前
c#实现redis的调用与基础类
数据库·redis·缓存
苦学编程的谢2 小时前
Redis_7_hash
数据库·redis·哈希算法
青山的青衫2 小时前
【JavaWeb】Tlias后台管理系统
java·web
许愿OvO2 小时前
MySQL-索引
数据库·mysql
-指短琴长-2 小时前
MySQL快速入门——基本查询(上)
android·数据库·mysql