以若依開源框架為例,探究redis緩存中的數據,如何在項目啟動時進行加載。
該緩存的加載涉及到兩張表:sys_dict_data
(字典數據) 和 sys_dict_type
(字典類型)
- 加載字典類型
SysDictType
@Service
public class SysDictTypeServiceImpl implements ISysDictTypeService{
/** * 項目啟動時,初始化字典到緩存 */
@PostConstruct
public void init()
{
loadingDictCache();
}
/** * 加載字典緩存數據 */
@Override
public void loadingDictCache()
{
List<SysDictType> dictTypeList = dictTypeMapper.selectDictTypeAll();
for (SysDictType dictType : dictTypeList)
{
List<SysDictData> dictDatas = dictDataMapper.selectDictDataByType(dictType.getDictType());
DictUtils.setDictCache(dictType.getDictType(), dictDatas);
}
}
}
可以看到,它是通過注解@PostConstruct
實現的自動加載數據,帶有該注解的方法會在依賴注入之后調用。
然后它調用dictTypeMapper.selectDictTypeAll()
查詢到所有的SysDictType
集合。
dictTypeMapper中的SQL語句
<sql id="selectDictTypeVo">
select dict_id, dict_name, dict_type, status, create_by, create_time, remark
from sys_dict_type
</sql>
<select id="selectDictTypeAll" resultMap="SysDictTypeResult">
<include refid="selectDictTypeVo"/>
</select>
查詢結果集:
接下來,它開始遍歷結果集,獲取dictType
屬性,再去dictDataMapper
查詢對應的SysDictData
。
- 加載字典數據
SysDictData
for (SysDictType dictType : dictTypeList){
List<SysDictData> dictDatas = dictDataMapper.selectDictDataByType(dictType.getDictType());
DictUtils.setDictCache(dictType.getDictType(), dictDatas);
}
dictDataMapper.selectDictDataByType 對應的SQL語句如下:
<sql id="selectDictDataVo">
select dict_code, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark
from sys_dict_data
</sql>
<select id="selectDictDataByType" parameterType="SysDictData" resultMap="SysDictDataResult">
<include refid="selectDictDataVo"/>
where status = '0' and dict_type = #{dictType} order by dict_sort asc
</select>
查詢結果集如下:
- 使用工具類封裝數據
DictUtils.setDictCache(dictType.getDictType(), dictDatas);
/** * 設置字典緩存 * @param key 參數鍵 * @param dictDatas 字典數據列表 */
public static void setDictCache(String key, List<SysDictData> dictDatas){
SpringUtils.getBean(RedisService.class).setCacheObject(getCacheKey(key), dictDatas);
}
/** * 設置cache key * @param configKey 參數鍵 * @return 緩存鍵key */
public static String getCacheKey(String configKey){
return Constants.SYS_DICT_KEY + configKey;
}
/** * 字典管理 cache key */
public static final String SYS_DICT_KEY = "sys_dict:";
在設置緩存時,通過getCacheKey(key)
方法對key進行了處理,在key的前面加上前綴 sys_dict:
這樣,在redis緩存中,會把以這個前綴開頭的所有key當初同一類數據。
閱讀上會比較直觀,比較美化。
以常用的狀態字典sys_normal_disable
為例,看下redis中的數據結構
SQL結果集如下:
redis中的數據結構如下:
[
{
"@type": "com.ruoyi.system.api.domain.SysDictData",
"createBy": "admin",
"createTime": 1632793600000,
"cssClass": "",
"default": true,
"dictCode": 6,
"dictLabel": "正常",
"dictSort": 1,
"dictType": "sys_normal_disable",
"dictValue": "0",
"isDefault": "Y",
"listClass": "primary",
"params": {
"@type": "java.util.HashMap"
},
"remark": "正常狀態",
"status": "0"
},
{
"@type": "com.ruoyi.system.api.domain.SysDictData",
"createBy": "admin",
"createTime": 1632793600000,
"cssClass": "",
"default": false,
"dictCode": 7,
"dictLabel": "停用",
"dictSort": 2,
"dictType": "sys_normal_disable",
"dictValue": "1",
"isDefault": "N",
"listClass": "danger",
"params": {
"@type": "java.util.HashMap"
},
"remark": "停用狀態",
"status": "0"
}
]
常用的屬性是dictLabel
,dictValue
和listClass
。
dictLabel 前台顯示字段
dictValue 后台存儲字段
listClass 前台的字段樣式