系统字典
系统字典模块,提供字典通用部分能力。3.0 中字典缓存升级为 本地缓存 → Redis → 数据库 的多级链路,并新增 DictDataLoader 回源通道。
工具方法
getLabel(根据类型和值获取标签)
java
String label = DictUtils.getLabel("user_status", "1");- 参数:dictTypeCode - 字典类型编码,value - 字典值
- 返回值:String 字典标签
- 说明:根据字典类型和value获取对应的label,未匹配到返回null
getValue(根据类型和标签获取值)
java
String value = DictUtils.getValue("user_status", "启用");- 参数:dictTypeCode - 字典类型编码,label - 字典标签
- 返回值:String 字典值
- 说明:根据字典类型和label获取对应的value,未匹配到返回null
getDictData(根据类型获取字典集合)
java
List<DictDataModel> list = DictUtils.getDictData("user_status");- 参数:dictTypeCode - 字典类型编码
- 返回值:List<DictDataModel> 字典数据集合
- 说明:优先取本地缓存(Caffeine),未命中再取Redis,仍无数据时经
DictDataLoader回源查库并重建缓存;查库也无数据时以空列表写入本地负缓存,避免无数据字典每次回源
resetCacheDict(根据类型重新缓存字典集合)
java
int count = DictUtils.resetCacheDict("user_status");- 参数:dictTypeCode - 字典类型编码
- 返回值:int 查询到的数据条数
- 说明:重新加载指定字典类型的数据并刷新缓存(刷新前广播本地缓存失效),字典数据变更后可调用此方法主动刷新
resetCacheDict(批量根据类型重新缓存字典集合)
java
int count = DictUtils.resetCacheDict(Arrays.asList("user_status", "gender"));- 参数:dictTypeCodeList - 字典类型编码集合
- 返回值:int 查询到的数据总条数
- 说明:批量重新加载字典数据并刷新对应缓存
回源通道
DictDataLoader 为字典缓存回源通道接口,接口属于字典域(消费者),回源查询实现由持有 sys_dict_data 表的服务提供
public interface DictDataLoader {
/**
* 按字典类型编码批量查询生效字典数据
*/
List<DictDataModel> queryByDictTypeCode(List<String> dictTypeCodeList);
}- 本仓中由
lihua-system的DictDataLoaderImpl提供持表实现,@ComponentScan自动注册为DictUtils的回源通道 - 当前服务未注册回源通道时,
getDictData/resetCacheDict会显式抛出异常,不会把「无通道」伪装成「查无数据」
缓存链路
getDictData先查本地缓存(Caffeine),命中直接返回- 本地未命中查 Redis,空集合按未命中处理(防新部署场景 Redis 未预热时被空结果阻断回源)
- 均未命中时经
DictDataLoader查库重建 Redis 缓存,并回填本地缓存 - 字典数据管理侧变更时调用
resetCacheDict刷新,同时经发布订阅广播invalidate_local_cache,让所有实例的本地缓存同步失效

