升鲜宝高性能多语言解决方案(二)---升鲜宝生鲜配送供应链管理系统
升鲜宝高性能多语言解决方案(二)---升鲜宝生鲜配送供应链管理系统
- 设计目标
热路径不查通用动态翻译表
UI 文案、消息模板、业务主数据三路分流
Redis 只做共享缓存,本地缓存承接高频请求
修改翻译时精准失效,不做模糊删除 - 对齐现有升鲜宝数据库
现有语言基础: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.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,超热点快照表 - 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
用法:维护组/范围/语言的版本号 - 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 │
└─────────────────────────────────────────────────────────────────┘
- 运行时策略
6.1 消息模板
系统启动全量加载
后台修改后发 Redis PubSub:topic:i18n:msg:refresh
各节点收到后刷新本地 Map
6.2 UI 静态资源
按页面整包取,不逐 key 取
更新后只提升版本号,不删所有 key
6.3 业务主数据
热点实体:主表 + i18n 子表
超热点:读模型快照表,如goods_lang_snapshot
sys_dynamic_translation不进热路径 - 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
不建议菜单翻译、字典翻译、消息翻译共用一张万能表

浙公网安备 33010602011771号