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

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

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

因數(shù)據(jù)庫中存的都是數(shù)字(數(shù)據(jù)字典),但是又沒有數(shù)據(jù)字典表,只有后端知道是什么意思,查詢返回給前端時,需要if-else進(jìn)行轉(zhuǎn)換成具體的值,很麻煩,現(xiàn)增加數(shù)據(jù)字典表,通過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)建時間',
  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對象", 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)建時間")
    @TableField(value = "create_time", fill = FieldFill.INSERT)
    private Date createTime;

}

@Data
@ApiModel(value = "DateDictionaryVo對象", 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對象
        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啟動查詢數(shù)據(jù)字典表

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

/**
 * @description:項(xià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ù)字典信息-開始");
        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ù)

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

7.redis中查看

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

8.將獲取封裝成一個工具方法

方便調(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 : "";
    }

}

為什么要這么寫

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

而不是

redisTemplate.hasKey(DATA_DICTIONARY_KEY)

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

9.使用

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

總結(jié)

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

相關(guān)文章

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

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

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

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

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

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

    文章詳細(xì)介紹了Java中的Map接口及其主要實(shí)現(xiàn)類,包括HashMap、LinkedHashMap、TreeMap、ConcurrentHashMap和Properties,涵蓋了Map的原理、核心方法、常見使用場景、遍歷方式以及注意事項(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ǒng)對圖片格式的兼容性需求不斷提升,下面小編就來和大家詳細(xì)介紹一下如何使用java實(shí)現(xiàn)PNG圖片格式轉(zhuǎn)為BMP圖片格式
    2025-06-06
  • Java設(shè)置千分位分隔符的兩種方法

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

    在 Java 中,有時候我們需要對數(shù)字進(jìn)行千分位分隔,以提升數(shù)字的可讀性,本文將介紹如何在 Java 中實(shí)現(xiàn)對數(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提供了四個核心組件:Channel、Buffer、Selector和SelectionKey,本文就來簡單講講這四大組件的使用吧
    2023-05-05
  • Java實(shí)現(xiàn)二叉樹的深度優(yōu)先遍歷和廣度優(yōu)先遍歷算法示例

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

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

    springBoot整合mybatisplus全過程

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

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

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

最新評論

贵溪市| 南木林县| 长治市| 南投市| 清镇市| 安康市| 香格里拉县| 车致| 海盐县| 信丰县| 西宁市| 简阳市| 东源县| 朔州市| 林州市| 前郭尔| 独山县| 无极县| 嵩明县| 盐亭县| 青浦区| 徐汇区| 台前县| 富平县| 乌兰察布市| 永嘉县| 衡东县| 永新县| 如东县| 靖州| 邵阳市| 阳泉市| 华宁县| 绥中县| 永平县| 南召县| 武功县| 类乌齐县| 石楼县| 洛隆县| 青冈县|