升鲜宝生鲜配送供应链管理系统---PMS--商品品牌多语言存储与 Redis 缓存同步实现

升鲜宝生鲜配送供应链管理系统---PMS--商品品牌多语言存储与 Redis 缓存同步实现

商品品牌多语言存储与 Redis 缓存同步实现文档

本设计文档说明商品品牌(pms_brand)在支持多语言环境下的数据存储、翻译同步及 Redis 缓存方案,

涵盖数据结构、DTO、服务实现、Redis Key 结构与数据流示意。

一、DTO 设计

① RequestBrandDTO

@Data

public class RequestBrandDTO implements Serializable {

private Long id;

private String brandCode;

private String brandImage;

private String brandIndex;

private Integer sortCode;

private Integer isIcon;

private Integer iconSort;

private Integer enabled;

private List sysDynamicTranslationList = new ArrayList<>();

}

② RequestSysDynamicTranslationDTO

@Data

public class RequestSysDynamicTranslationDTO implements Serializable {

private String languageCode;

private String fieldName;

private String fieldValue;

}

二、Service 实现(新增 / 修改)

1️⃣ 新增品牌(Add)

@Transactional

@Override

public void addBrand(RequestBrandDTO req, Long userId) {

String defaultLang = redisTemplate.opsForValue().get("sys:lang:default");

String defaultName = req.getSysDynamicTranslationList().stream()

.filter(t -> defaultLang.equalsIgnoreCase(t.getLanguageCode()))

.map(RequestSysDynamicTranslationDTO::getFieldValue)

.findFirst()

.orElse("未命名品牌");

复制代码
PmsBrandEntity brand = new PmsBrandEntity();
brand.setBrandCode(req.getBrandCode());
brand.setBrandName(defaultName);
brand.setBrandImage(req.getBrandImage());
brand.setBrandIndex(req.getBrandIndex());
brand.setSortCode(req.getSortCode());
brand.setIsIcon(req.getIsIcon());
brand.setIconSort(req.getIconSort());
brand.setEnabled(req.getEnabled());
brand.setCreator(userId);
brand.setCreateDate(System.currentTimeMillis());
this.save(brand);

String brandKey = "pms:brand:" + brand.getId();
redisTemplate.opsForHash().putAll(brandKey, BeanUtil.beanToMap(brand));

for (RequestSysDynamicTranslationDTO t : req.getSysDynamicTranslationList()) {
    SysDynamicTranslationEntity entity = new SysDynamicTranslationEntity();
    entity.setEntityType("product_brand");
    entity.setEntityId(brand.getId());
    entity.setLanguageCode(t.getLanguageCode());
    entity.setFieldName(t.getFieldName());
    entity.setFieldValue(t.getFieldValue());
    entity.setCreator(userId);
    entity.setCreateDate(System.currentTimeMillis());
    translationDao.insert(entity);

    String i18nKey = "i18n:product_brand:" + brand.getId() + ":" + t.getLanguageCode();
    redisTemplate.opsForHash().put(i18nKey, t.getFieldName(), t.getFieldValue());
}

redisTemplate.opsForList().rightPush("pms:brand:list:enabled", String.valueOf(brand.getId()));

}

2️⃣ 修改品牌(Update)

@Transactional

@Override

public void updateBrand(RequestBrandDTO req, Long userId) {

PmsBrandEntity brand = this.getById(req.getId());

if (brand == null) {

throw new RuntimeException("品牌不存在");

}

复制代码
String defaultLang = redisTemplate.opsForValue().get("sys:lang:default");
String defaultName = req.getSysDynamicTranslationList().stream()
    .filter(t -> defaultLang.equalsIgnoreCase(t.getLanguageCode()))
    .map(RequestSysDynamicTranslationDTO::getFieldValue)
    .findFirst()
    .orElse(brand.getBrandName());

brand.setBrandCode(req.getBrandCode());
brand.setBrandName(defaultName);
brand.setBrandImage(req.getBrandImage());
brand.setBrandIndex(req.getBrandIndex());
brand.setSortCode(req.getSortCode());
brand.setIsIcon(req.getIsIcon());
brand.setIconSort(req.getIconSort());
brand.setEnabled(req.getEnabled());
brand.setUpdater(userId);
brand.setUpdateDate(System.currentTimeMillis());
this.updateById(brand);

String brandKey = "pms:brand:" + brand.getId();
redisTemplate.delete(brandKey);
redisTemplate.opsForHash().putAll(brandKey, BeanUtil.beanToMap(brand));

for (RequestSysDynamicTranslationDTO t : req.getSysDynamicTranslationList()) {
    SysDynamicTranslationEntity exist = translationDao.findOne(
        "product_brand", brand.getId(), t.getLanguageCode(), t.getFieldName());
    if (exist == null) {
        SysDynamicTranslationEntity entity = new SysDynamicTranslationEntity();
        entity.setEntityType("product_brand");
        entity.setEntityId(brand.getId());
        entity.setLanguageCode(t.getLanguageCode());
        entity.setFieldName(t.getFieldName());
        entity.setFieldValue(t.getFieldValue());
        entity.setCreator(userId);
        entity.setCreateDate(System.currentTimeMillis());
        translationDao.insert(entity);
    } else {
        exist.setFieldValue(t.getFieldValue());
        exist.setUpdater(userId);
        exist.setUpdateDate(System.currentTimeMillis());
        translationDao.updateById(exist);
    }

    String i18nKey = "i18n:product_brand:" + brand.getId() + ":" + t.getLanguageCode();
    redisTemplate.opsForHash().put(i18nKey, t.getFieldName(), t.getFieldValue());
}

}

三、Redis Key 结构设计

1️⃣ pms:brand:{id} → 品牌主缓存(Hash)

2️⃣ pms:brand:list:enabled → 启用品牌ID列表(List)

3️⃣ i18n:product_brand:{id}:{lang} → 品牌多语言翻译缓存(Hash)

四、数据流说明

新增 / 修改品牌数据流:

前端 RequestBrandDTO → Controller → Service

→ 保存 pms_brand 主表(默认语言)

→ 保存 sys_dynamic_translation 多语言翻译

→ 写入 Redis:

  • pms:brand:
  • i18n:product_brand:{id}:{languageCode}
    → 返回结果

五、Redis 数据示例

pms:brand:1001

├─ id = 1001

├─ brand_code = COCA

├─ brand_name = 可口可乐

i18n:product_brand:1001:zh-CN

├─ brand_name = 可口可乐

i18n:product_brand:1001:en-US

├─ brand_name = Coca-Cola

i18n:product_brand:1001:ja-JP

├─ brand_name = コカ・コーラ

六、总结

该方案实现了商品品牌的国际化多语言同步逻辑,支持前端提交多语言内容,后端统一写入数据库与缓存。

实现要点:

  1. 默认语言写入品牌主表
  2. 所有语言写入 sys_dynamic_translation
  3. Redis 双层缓存结构(品牌主缓存 + 多语言缓存)
  4. 修改品牌自动刷新翻译与缓存
相关推荐
敖正炀1 分钟前
ArrayBlockingQueue深度解析
java
敖正炀1 分钟前
LinkedBlockingQueue详解
java
Lucifer三思而后行2 分钟前
中国移动 BCLinux 8.8 一键安装 Oracle 26ai
数据库·oracle
敖正炀3 分钟前
SynchronousQueue 详解
java
wuyikeer5 分钟前
Spring Boot 经典九设计模式全览
java·spring boot·设计模式
djjdjdjdjjdj5 分钟前
bootstrap如何修改警告框(Alert)的边框粗细
jvm·数据库·python
HalvmånEver7 分钟前
MySQL的数据类型(一)
数据库·mysql
努力努力再努力wz14 分钟前
【Linux网络系列】深入理解 I/O 多路复用:从 select 痛点到 poll 高并发服务器落地,基于 Poll、智能指针与非阻塞 I/O与线程池手写一个高性能 HTTP 服务器!(附源码)
java·linux·运维·服务器·c语言·c++·python
努力努力再努力wz16 分钟前
【Linux网络系列】万字硬核解析网络层核心:IP协议到IP 分片重组、NAT技术及 RIP/OSPF 动态路由全景
java·linux·运维·服务器·数据结构·c++·python
tjc1990100517 分钟前
golang如何使用t.Cleanup清理测试_golang t.Cleanup测试清理使用策略
jvm·数据库·python