升鲜宝高性能多语言解决方案(二)---升鲜宝生鲜配送供应链管理系统

升鲜宝高性能多语言解决方案(二)---升鲜宝生鲜配送供应链管理系统

  1. 设计目标
    热路径不查通用动态翻译表
    UI 文案、消息模板、业务主数据三路分流
    Redis 只做共享缓存,本地缓存承接高频请求
    修改翻译时精准失效,不做模糊删除
  2. 对齐现有升鲜宝数据库
    现有语言基础:sys_m_language
    现有静态文案:sys_static_translation
    现有动态翻译:sys_dynamic_translation
    现有业务 i18n:pms_goods_i18n
    现有 RBAC:sys_user / sys_role / sys_menu / sys_role_menu / sys_role_user
  3. 三层多语言分流
    3.1 UI 静态资源层
    表:sys_i18n_ui_resource + sys_i18n_ui_resource_item
    用途:菜单名、按钮名、Label、Placeholder、标题
    读取模式:按页面整包加载
    缓存:Caffeine + Redis Hash
    3.2 消息模板层
    表:sys_message_template + sys_message_template_i18n
    用途:异常提示、成功提示、审核提示
    读取模式:启动预热到 JVM Map
    缓存:仅本地缓存 + 版本广播刷新
    3.3 业务主数据层
    表:业务主表 + *_i18n
    典型:pms_goods + pms_goods_i18n
    用途:商品名、分类名、仓库名、通知标题、字典标签
    读取模式:热点 join,超热点快照表
  4. Redis Key 设计
    4.1 UI 静态资源
    i18n:ui:ver:{platform}:{lang}:{module}:{page} => 版本号
    i18n:ui:data:{platform}:{lang}:{module}:{page}:v{ver} => Hash/JSON
    示例:
    i18n:ui:ver:web:zh_CN:crm:customer_list
    i18n:ui:data:web:zh_CN:crm:customer_list:v12
    4.2 消息模板
    i18n:msg:ver:{lang} => 版本号
    i18n:msg:data:{lang}:v{ver} => Hash(messageCode -> template)
    示例:
    i18n:msg:ver:zh_CN
    i18n:msg:data:zh_CN:v7
    4.3 菜单树
    rbac:menu:ver:{roleId}:{platform}:{lang} => 版本号
    rbac:menu:data:{roleId}:{platform}:{lang}:v{ver} => JSON tree
    示例:
    rbac:menu:ver:1001:web:zh_CN
    rbac:menu:data:1001:web:zh_CN:v19
    4.4 字典标签
    i18n:dict:ver:{dictType}:{lang} => 版本号
    i18n:dict:data:{dictType}:{lang}:v{ver} => List/Hash
    示例:
    i18n:dict:ver:order_status:en_US
    i18n:dict:data:order_status:en_US:v5
    4.5 商品详情
    goods:detail:{goodsId}:{lang} => JSON
    4.6 商品列表页读模型
    goods:list:{scene}:{lang}:{pageNo}:{pageSize}:{hashFilter} => JSON
    4.7 缓存版本统一表
    DB 表:sys_i18n_cache_version
    用法:维护组/范围/语言的版本号
  5. Java 缓存架构图
                    ┌──────────────────────────┐
                    │  前端 / App / 管理后台   │
                    └────────────┬─────────────┘
                                 │ languageCode
                                 ▼
                    ┌──────────────────────────┐
                    │ LocaleContextFilter       │
                    │ 1. header/query/user设置  │
                    │ 2. 放入 ThreadLocal       │
                    └────────────┬─────────────┘
                                 │
          ┌──────────────────────┼──────────────────────┐
          ▼                      ▼                      ▼
┌─────────────────┐   ┌──────────────────┐   ┌────────────────────┐
│ UiI18nService   │   │ MessageI18nSvc   │   │ BizI18nQuerySvc    │
│ 页面整包文案     │   │ 消息模板解析      │   │ 业务主数据翻译      │
└───────┬─────────┘   └─────────┬────────┘   └──────────┬─────────┘
        │                       │                       │
        ▼                       ▼                       ▼
┌─────────────────┐   ┌──────────────────┐   ┌────────────────────┐
│ Caffeine L1     │   │ JVM Map L1       │   │ Caffeine L1        │
│ key=page bundle │   │ key=lang+msgCode │   │ key=goods/menu/etc │
└───────┬─────────┘   └─────────┬────────┘   └──────────┬─────────┘
        │ miss                  │ miss/refresh          │ miss
        ▼                       ▼                       ▼
┌─────────────────┐   ┌──────────────────┐   ┌────────────────────┐
│ Redis L2        │   │ Redis Version    │   │ Redis L2 / Snapshot│
│ Hash/JSON       │   │ / PubSub         │   │ JSON / read model  │
└───────┬─────────┘   └─────────┬────────┘   └──────────┬─────────┘
        │ miss                  │ reload trigger        │ miss
        ▼                       ▼                       ▼
┌─────────────────────────────────────────────────────────────────┐
│ MySQL                                                          │
│ sys_i18n_ui_resource(_item) / sys_message_template(_i18n)      │
│ sys_menu_i18n / sys_dict_*_i18n / sys_notice_i18n / *_i18n     │
└─────────────────────────────────────────────────────────────────┘
  1. 运行时策略
    6.1 消息模板
    系统启动全量加载
    后台修改后发 Redis PubSub: topic:i18n:msg:refresh
    各节点收到后刷新本地 Map
    6.2 UI 静态资源
    按页面整包取,不逐 key 取
    更新后只提升版本号,不删所有 key
    6.3 业务主数据
    热点实体:主表 + i18n 子表
    超热点:读模型快照表,如 goods_lang_snapshot
    sys_dynamic_translation 不进热路径
  2. SQL 查询建议
    7.1 商品列表
SELECT
  g.id,
  COALESCE(gi.goods_name, g.goods_name) AS goods_name
FROM pms_goods g
LEFT JOIN pms_goods_i18n gi
  ON gi.goods_id = g.id
 AND gi.language = #{lang}
WHERE g.del_flag = 0;

7.2 菜单树
先查角色拥有菜单 ID
再查 sys_menu
再查 sys_menu_i18n
组装树后缓存整棵树
8. 回退规则
当前语言
系统默认语言
主表默认值
code/key 本身
9. 不建议的做法
不建议每个标签运行时逐条查库
不建议把所有翻译都塞进 sys_dynamic_translation
不建议修改后 Redis 模糊删除全量 key
不建议菜单翻译、字典翻译、消息翻译共用一张万能表

posted @ 2026-04-16 09:41  升鲜宝生鲜供应链系统  阅读(5)  评论(0)    收藏  举报