升鲜宝生鲜配送供应链管理系统--- 《多语言商品查询优化方案(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_404551245 小时前
自动化数据库理解:用 AI 与 LLM 自动推断表的用途与关系
数据库·人工智能·自动化
java1234_小锋5 小时前
【技术专题】Mysql8 数据库 - Mysql8 简介 & 安装以及配置
数据库·mysql
oradh5 小时前
Oracle固定执行计划的方法----SQL Profie(三)
数据库·sql·oracle
弹简特6 小时前
【Java项目-企悦抽】15-活动管理模块02-活动创建测试与活动列表实现
java·开发语言·springboot
斯内普吖6 小时前
(开源)水果蔬菜商城实战指南 基于 Java + SSM + Vue + MySQL
java·vue.js·mysql·开源
wang_shu_mo_ran6 小时前
Spring IoC和DI概念篇
java·后端·spring
测试学习test6 小时前
SPI读取W25Q64硬件驱动(HAL库)
数据库·stm32·嵌入式硬件·算法
小狼154546 小时前
拼多多订单数据导出 CSV 实战:接口分页、字段平铺与 5 个数据坑,多多开票助手
java·前端·javascript
Joe_Wang56 小时前
【从0到1学习JVM · 25】同样都要停顿所有线程,Parallel比Serial到底强在哪
java·jvm·学习·垃圾回收
wuminyu6 小时前
JVM虚拟线程的底层实现原理分析
java·linux·c语言·jvm·c++