【源碼解讀】Spring Boot中redis緩存如何在項目初次啟動時加載


以若依開源框架為例,探究redis緩存中的數據,如何在項目啟動時進行加載。

在這里插入圖片描述
該緩存的加載涉及到兩張表:sys_dict_data(字典數據) 和 sys_dict_type(字典類型)

  1. 加載字典類型 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

  1. 加載字典數據 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>

查詢結果集如下:
在這里插入圖片描述

  1. 使用工具類封裝數據
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"
  }
]

常用的屬性是dictLabeldictValuelistClass

dictLabel 前台顯示字段
dictValue 后台存儲字段
listClass 前台的字段樣式


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM