最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springboot啟動(dòng)讀取數(shù)據(jù)字典緩存到redis實(shí)現(xiàn)方式

 更新時(shí)間:2026年03月12日 14:26:30   作者:Filwaod  
文章描述了如何通過(guò)增加數(shù)據(jù)字典表和使用Redis緩存來(lái)簡(jiǎn)化數(shù)據(jù)庫(kù)查詢返回值的轉(zhuǎn)換過(guò)程,并提供了一些代碼示例和配置說(shuō)明

因數(shù)據(jù)庫(kù)中存的都是數(shù)字(數(shù)據(jù)字典),但是又沒(méi)有數(shù)據(jù)字典表,只有后端知道是什么意思,查詢返回給前端時(shí),需要if-else進(jìn)行轉(zhuǎn)換成具體的值,很麻煩,現(xiàn)增加數(shù)據(jù)字典表,通過(guò)redis獲取,轉(zhuǎn)換成具體的值

1.建表

CREATE TABLE `data_dictionary`  (
  `id` bigint(20) NOT NULL COMMENT '主鍵id',
  `module` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '歸屬模塊',
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '字典名',
  `code` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '字典編碼',
  `value` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '字典取值',
  `order` int(3) NOT NULL DEFAULT -1 COMMENT '排序',
  `state` tinyint(1) NOT NULL DEFAULT -1 COMMENT '啟用狀態(tài) 0:停用 1:啟用',
  `create_time` datetime(0) NULL DEFAULT NULL COMMENT '創(chuàng)建時(shí)間',
  PRIMARY KEY (`id`)
)ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '數(shù)據(jù)字典表';

2.mybatisplus生成controller,service,mapper,do等

下面是用到的DO,VO

@Data
@TableName("data_dictionary")
@ApiModel(value="DataDictionaryDO對(duì)象", description="數(shù)據(jù)字典表")
public class DataDictionaryDO implements Serializable {

    private static final long serialVersionUID = 1L;

    @ApiModelProperty(value = "主鍵id")
    @TableId(value = "id", type = IdType.ASSIGN_ID)
    private Long id;

    @ApiModelProperty(value = "歸屬模塊")
    private String module;

    @ApiModelProperty(value = "字典名")
    private String name;

    @ApiModelProperty(value = "字典編碼")
    private String code;

    @ApiModelProperty(value = "字典取值")
    private String value;

    @ApiModelProperty(value = "排序")
    private Integer sort;

    @ApiModelProperty(value = "啟用狀態(tài) 0:停用 1:啟用")
    private Integer state;

    @ApiModelProperty(value = "創(chuàng)建時(shí)間")
    @TableField(value = "create_time", fill = FieldFill.INSERT)
    private Date createTime;

}

@Data
@ApiModel(value = "DateDictionaryVo對(duì)象", description = "數(shù)據(jù)字典Vo")
@ToString
public class DataDictionaryVo implements Serializable {

    private static final long serialVersionUID = 1L;

    @ApiModelProperty(value = "字典編碼")
    private String code;

    @ApiModelProperty(value = "字典取值")
    private String value;

    @ApiModelProperty(value = "redis key")
    private String key;

}

3.數(shù)據(jù)字典常量

/**
 * @description:數(shù)據(jù)字典常量
 */
public class DataDictionaryConstant {

    /**
     * redis中數(shù)據(jù)字典key
     */
    public static final String DATA_DICTIONARY_KEY = "dataDictionary";

    /**
     * 合同-執(zhí)行狀態(tài)
     */
    public static final String CONTRACT_STATUS = "contract:status";
}

4.redis配置

@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
        // 創(chuàng)建RedisTemplate對(duì)象
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        // 設(shè)置連接工廠
        template.setConnectionFactory(connectionFactory);
        // 創(chuàng)建JSON序列化工具
        GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
        // 設(shè)置Key的序列化
        template.setKeySerializer(RedisSerializer.string());
        template.setHashKeySerializer(RedisSerializer.string());
        // 設(shè)置Value的序列化
        template.setValueSerializer(jsonRedisSerializer);
        template.setHashValueSerializer(jsonRedisSerializer);
        // 返回
        return template;
    }
}

5.實(shí)現(xiàn)springboot啟動(dòng)查詢數(shù)據(jù)字典表

將數(shù)據(jù)緩存到redis中,使用@PostConstruct注解

/**
 * @description:項(xiàng)目啟動(dòng)初始化數(shù)據(jù)字典到redis
 */
@Slf4j
@Component
public class InitConfig {

    @Autowired
    private DataDictionaryMapper  dataDictionaryMapper;
    @Autowired
    RedisTemplate<String, Object> redisTemplate;

    @PostConstruct
    public void initDataDictionary() {
        log.info("初始數(shù)據(jù)字典信息-開(kāi)始");
        if (Boolean.TRUE.equals(redisTemplate.hasKey(DATA_DICTIONARY_KEY))) {
            redisTemplate.delete(DATA_DICTIONARY_KEY);
        }
        List<DataDictionaryDO> dictionaryDOList = dataDictionaryMapper.selectList(null);
        Map<String, List<DataDictionaryVo>> dataMap = dictionaryDOList.stream().map(obj -> {
            DataDictionaryVo dataDictionaryVo = new DataDictionaryVo();
            dataDictionaryVo.setCode(obj.getCode());
            dataDictionaryVo.setValue(obj.getValue());
            dataDictionaryVo.setKey(obj.getModule() + ":" + obj.getName());
            return dataDictionaryVo;
        }).collect(Collectors.groupingBy(DataDictionaryVo::getKey));
        redisTemplate.opsForHash().putAll(DATA_DICTIONARY_KEY, dataMap);
        log.info("初始數(shù)據(jù)字典信息-結(jié)束");
    }
}

6.往表中插入幾條數(shù)據(jù)

再啟動(dòng)項(xiàng)目,看效果

7.redis中查看

可以看到redis在序列化對(duì)象時(shí),把類信息(@class)也序列化進(jìn)來(lái)了,這樣存的作用是反序列化時(shí)知道反序列化成什么對(duì)象,但是浪費(fèi)了內(nèi)存空間;不想存類信息的話,需要手動(dòng)序列化成字符串再存進(jìn)來(lái),獲取時(shí)再手動(dòng)反序列成對(duì)象,看你怎么選擇了

8.將獲取封裝成一個(gè)工具方法

方便調(diào)用

@Service
public class RedisService {
    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 緩存中查數(shù)據(jù)字典
     * @param key redis key
     * @param code  字典編碼
     * @return
     */
    public String getDataDictionary(String key, String code) {
        String value = null;
        if (Boolean.TRUE.equals(redisTemplate.hasKey(DATA_DICTIONARY_KEY))) {
            List<DataDictionaryVo> dataDictionary = (List<DataDictionaryVo>) redisTemplate
                .opsForHash().get(DATA_DICTIONARY_KEY, key);
            if (dataDictionary.size() > 0) {
                value = dataDictionary.stream().filter(obj -> code.equals(obj.getCode()))
                    .findFirst().get().getValue();
            }
        }
        return value != null ? value : "";
    }

}

為什么要這么寫(xiě)

Boolean.TRUE.equals(redisTemplate.hasKey(key))

而不是

redisTemplate.hasKey(DATA_DICTIONARY_KEY)

這是因?yàn)閕dea提示可能會(huì)出現(xiàn)空指針,然后查資料修改成上面的寫(xiě)法:http://m.fzitv.net/program/36014522y.htm

9.使用

//使用
String value = redisService.getDataDictionary(CONTRACT_STATUS, "0");
System.out.println(value);

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • redis.clients.jedis.exceptions.JedisMovedDataException異常解決

    redis.clients.jedis.exceptions.JedisMovedDataException異常解決

    redis.clients.jedis.exceptions.JedisMovedDataException?異常是在使用?Jedis?客戶端與?Redis?集群進(jìn)行交互時(shí)發(fā)生的,下面就來(lái)介紹一下解決方法,感興趣的可以了解一下
    2024-05-05
  • Java8中新特性O(shè)ptional、接口中默認(rèn)方法和靜態(tài)方法詳解

    Java8中新特性O(shè)ptional、接口中默認(rèn)方法和靜態(tài)方法詳解

    Java 8 已經(jīng)發(fā)布很久了,很多報(bào)道表明Java 8 是一次重大的版本升級(jí)。下面這篇文章主要給大家介紹了關(guān)于Java8中新特性O(shè)ptional、接口中默認(rèn)方法和靜態(tài)方法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。
    2017-12-12
  • Java Map 原理、實(shí)現(xiàn)與使用場(chǎng)景分析

    Java Map 原理、實(shí)現(xiàn)與使用場(chǎng)景分析

    文章詳細(xì)介紹了Java中的Map接口及其主要實(shí)現(xiàn)類,包括HashMap、LinkedHashMap、TreeMap、ConcurrentHashMap和Properties,涵蓋了Map的原理、核心方法、常見(jiàn)使用場(chǎng)景、遍歷方式以及注意事項(xiàng),感興趣的朋友跟隨小編一起看看吧
    2025-12-12
  • java實(shí)現(xiàn)圖片格式轉(zhuǎn)換(PNG轉(zhuǎn)BMP)

    java實(shí)現(xiàn)圖片格式轉(zhuǎn)換(PNG轉(zhuǎn)BMP)

    隨著各類圖像格式廣泛應(yīng)用,不同平臺(tái)與系統(tǒng)對(duì)圖片格式的兼容性需求不斷提升,下面小編就來(lái)和大家詳細(xì)介紹一下如何使用java實(shí)現(xiàn)PNG圖片格式轉(zhuǎn)為BMP圖片格式
    2025-06-06
  • Java設(shè)置千分位分隔符的兩種方法

    Java設(shè)置千分位分隔符的兩種方法

    在 Java 中,有時(shí)候我們需要對(duì)數(shù)字進(jìn)行千分位分隔,以提升數(shù)字的可讀性,本文將介紹如何在 Java 中實(shí)現(xiàn)對(duì)數(shù)字設(shè)置千分位分隔符的方法,需要的朋友可以參考下
    2024-10-10
  • Java 同步鎖(synchronized)詳解及實(shí)例

    Java 同步鎖(synchronized)詳解及實(shí)例

    這篇文章主要介紹了Java 同步鎖(synchronized)詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • Java?NIO中四大核心組件的使用詳解

    Java?NIO中四大核心組件的使用詳解

    Java?NIO(New?IO)是Java?1.4版本中引入的一套全新的IO處理機(jī)制,而NIO提供了四個(gè)核心組件:Channel、Buffer、Selector和SelectionKey,本文就來(lái)簡(jiǎn)單講講這四大組件的使用吧
    2023-05-05
  • Java實(shí)現(xiàn)二叉樹(shù)的深度優(yōu)先遍歷和廣度優(yōu)先遍歷算法示例

    Java實(shí)現(xiàn)二叉樹(shù)的深度優(yōu)先遍歷和廣度優(yōu)先遍歷算法示例

    這篇文章主要介紹了Java實(shí)現(xiàn)二叉樹(shù)的深度優(yōu)先遍歷和廣度優(yōu)先遍歷算法,結(jié)合實(shí)例形式詳細(xì)分析了二叉樹(shù)的定義、深度優(yōu)先遍歷與廣度優(yōu)先遍歷算法原理與相關(guān)操作實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2018-04-04
  • springBoot整合mybatisplus全過(guò)程

    springBoot整合mybatisplus全過(guò)程

    MyBatisPlus簡(jiǎn)介及開(kāi)發(fā)步驟,介紹其簡(jiǎn)化開(kāi)發(fā)、高度可定制及強(qiáng)大的代碼生成器等特點(diǎn),適合數(shù)據(jù)庫(kù)操作場(chǎng)景優(yōu)化
    2026-05-05
  • Java中CountDownLatch工具類詳細(xì)解析

    Java中CountDownLatch工具類詳細(xì)解析

    這篇文章主要介紹了Java中CountDownLatch工具類詳細(xì)解析,創(chuàng)建CountDownLatch對(duì)象時(shí),會(huì)傳入一個(gè)count數(shù)值,該對(duì)象每次調(diào)用countDown()方法會(huì)使count?--?,就是count每次減1,需要的朋友可以參考下
    2023-11-11

最新評(píng)論

牟定县| 遵化市| 和龙市| 鲜城| 得荣县| 汝南县| 岳池县| 阳新县| 青川县| 新宁县| 嵊州市| 手游| 腾冲县| 衡阳县| 滨州市| 建阳市| 乡宁县| 新巴尔虎右旗| 东乌珠穆沁旗| 竹山县| 宜宾县| 吕梁市| 家居| 平山县| 长春市| 徐水县| 中阳县| 屏东县| 桐城市| 久治县| 西丰县| 阆中市| 临高县| 江北区| 石屏县| 宁夏| 石屏县| 鹤壁市| 绩溪县| 化州市| 将乐县|