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

分布式醫(yī)療掛號(hào)系統(tǒng)SpringCache與Redis為數(shù)據(jù)字典添加緩存

 更新時(shí)間:2022年04月25日 09:10:21   作者:Hudie.  
這篇文章主要為大家介紹了分布式醫(yī)療掛號(hào)系統(tǒng)SpringCache與Redis為數(shù)據(jù)字典添加緩存,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

一、SpringCache介紹

Spring Cache 是一個(gè)優(yōu)秀的緩存組件。自Spring 3.1起,提供了類似于@Transactional注解事務(wù)的注解Cache支持,且提供了Cache抽象,方便切換各種底層Cache(如:redis)

使用Spring Cache的好處:

  • 提供基本的Cache抽象,方便切換各種底層Cache。
  • 通過(guò)注解Cache可以實(shí)現(xiàn)類似于事務(wù)一樣,緩存邏輯透明的應(yīng)用到我們的業(yè)務(wù)代碼上,且只需要更少的代碼就可以完成。
  • 提供事務(wù)回滾時(shí)也自動(dòng)回滾緩存。
  • 支持比較復(fù)雜的緩存邏輯。

二、項(xiàng)目集成Spring Cache

1.添加緩存相關(guān)依賴

        <!-- redis -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <!-- spring2.X集成redis所需common-pool2-->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
            <version>2.6.0</version>
        </dependency>

2.添加redis配置類

@Configuration
@EnableCaching
public class RedisConfig {
    /**
     * 自定義key規(guī)則
     * @return
     */
    @Bean
    public KeyGenerator keyGenerator() {
        return new KeyGenerator() {
            @Override
            public Object generate(Object target, Method method, Object... params) {
                StringBuilder sb = new StringBuilder();
                sb.append(target.getClass().getName());
                sb.append(method.getName());
                for (Object obj : params) {
                    sb.append(obj.toString());
                }
                return sb.toString();
            }
        };
    }
    /**
     * 設(shè)置RedisTemplate規(guī)則
     * @param redisConnectionFactory
     * @return
     */
    @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        //解決查詢緩存轉(zhuǎn)換異常的問(wèn)題
        ObjectMapper om = new ObjectMapper();
        // 指定要序列化的域,field,get和set,以及修飾符范圍,ANY是都有包括private和public
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        // 指定序列化輸入的類型,類必須是非final修飾的,final修飾的類,比如String,Integer等會(huì)跑出異常
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        //序列號(hào)key value
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
    /**
     * 設(shè)置CacheManager緩存規(guī)則
     * @param factory
     * @return
     */
    @Bean
    public CacheManager cacheManager(RedisConnectionFactory factory) {
        RedisSerializer<String> redisSerializer = new StringRedisSerializer();
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        //解決查詢緩存轉(zhuǎn)換異常的問(wèn)題
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        // 配置序列化(解決亂碼的問(wèn)題),過(guò)期時(shí)間600秒
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofSeconds(600))
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
                .disableCachingNullValues();
        RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
                .cacheDefaults(config)
                .build();
        return cacheManager;
    }
}

3.添加redos配置

spring.redis.host=[主機(jī)地址]
spring.redis.port=6379
spring.redis.database= 0
spring.redis.timeout=1800000
spring.redis.lettuce.pool.max-active=20
spring.redis.lettuce.pool.max-wait=-1
#最大阻塞等待時(shí)間(負(fù)數(shù)表示沒(méi)限制)
spring.redis.lettuce.pool.max-idle=5
spring.redis.lettuce.pool.min-idle=0

三、數(shù)據(jù)字典配置Spring Cache

1.緩存@Cacheable

@Cacheable注解:根據(jù)方法對(duì)其返回結(jié)果進(jìn)行緩存,下次請(qǐng)求時(shí),如果緩存存在,則直接讀取緩存數(shù)據(jù)返回;如果緩存不存在,則執(zhí)行方法,并把返回的結(jié)果存入緩存中。一般用在查詢方法上。

根據(jù)id查詢子數(shù)據(jù)列表屬于查詢方法,添加@Cacheable注解表示方法執(zhí)行時(shí)對(duì)返回結(jié)果進(jìn)行緩存。

/**
     * 根據(jù)id查詢子數(shù)據(jù)列表
     * @param id
     * @return list
     */
    @Override
    @Cacheable(value = "dict",keyGenerator = "keyGenerator")
    public List<Dict> findChildData(Long id) {
        QueryWrapper<Dict> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("parent_id", id);
        List<Dict> dictList = baseMapper.selectList(queryWrapper);
        for (Dict dict : dictList) {
            // 得到每一條記錄的id值
            Long dictId = dict.getId();
            // 調(diào)用hasChildren方法判斷是否包含子節(jié)點(diǎn)
            boolean flag = this.hasChildren(dictId);
            // 為每條記錄設(shè)置hasChildren屬性
            dict.setHasChildren(flag);
        }
        return dictList;
    }

2.緩存@CachePut

@CachePut注解:使用該注解標(biāo)志的方法,每次都會(huì)執(zhí)行,并將結(jié)果存入指定的緩存中。其他方法可以直接從響應(yīng)的緩存中讀取緩存數(shù)據(jù),而不需要再去查詢數(shù)據(jù)庫(kù)。一般用在新增方法上。

3.緩存@CacheEvict

@CacheEvict注解:使用該注解標(biāo)志的方法,會(huì)清空指定的緩存。一般用在更新或者刪除方法上。

value:緩存名,必填,指定了緩存存放在哪塊命名空間。cacheNames 與 value 差不多,二選一即可。key 可選屬性,可以使用 SpEL 標(biāo)簽自定義緩存的key。allEntries:是否清空所有緩存,默認(rèn)為 false。若為true,則方法調(diào)用后將立即清空所有的緩存。beforeInvocation:是否在方法執(zhí)行前就清空,默認(rèn)為 false。若為true,則在方法執(zhí)行前就會(huì)清空緩存。

將數(shù)據(jù)字典導(dǎo)入網(wǎng)頁(yè)屬于更新方法,添加@CacheEvict注解,表示方法執(zhí)行時(shí)要清空緩存。

   /**
     * 導(dǎo)入數(shù)據(jù)字典到網(wǎng)頁(yè)
     * @param file
     */
    @Override
    @CacheEvict(value = "dict", allEntries=true)
    public void importDictData(MultipartFile file) {
        try {
            EasyExcel.read(file.getInputStream(), DictVo.class, new DictListener(baseMapper)).sheet().doRead();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

四、測(cè)試緩存是否添加成功

將項(xiàng)目重新啟動(dòng),單擊數(shù)據(jù)字典按鈕,此時(shí)頁(yè)面成功出現(xiàn)數(shù)據(jù)庫(kù)中的數(shù)據(jù)。打開(kāi)Redis客戶端,可以看到數(shù)據(jù)成功注入Redis中:

Redis中成功加入內(nèi)容

至此,使用SpringCache+Redis為數(shù)據(jù)字典添加緩存就演示完成了,更多關(guān)于分布式醫(yī)療掛號(hào)系統(tǒng)SpringCache Redis數(shù)據(jù)字典添加緩存的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 一文詳解Java的餓漢和懶漢設(shè)計(jì)模式

    一文詳解Java的餓漢和懶漢設(shè)計(jì)模式

    這篇文章主要為大家詳細(xì)介紹了Java設(shè)計(jì)模式中的的餓漢模式和懶漢模式,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Java有一定的幫助,需要的可以參考一下
    2022-12-12
  • Java接入支付寶授權(quán)第三方登錄的完整步驟

    Java接入支付寶授權(quán)第三方登錄的完整步驟

    不管是支付寶支付,還是微信支付,還是銀聯(lián)支付等,大部分的支付流程都是相似的,這篇文章主要給大家介紹了關(guān)于Java接入支付寶授權(quán)第三方登錄的相關(guān)資料,使用支付寶的沙盒環(huán)境示例,需要的朋友可以參考下
    2021-07-07
  • 解讀Java中char類型相加的問(wèn)題

    解讀Java中char類型相加的問(wèn)題

    這篇文章主要介紹了解讀Java中char類型相加的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • Java排序算法之冒泡排序的原理及優(yōu)化

    Java排序算法之冒泡排序的原理及優(yōu)化

    這篇文章主要介紹了Java排序算法之冒泡排序的原理及優(yōu)化,冒泡排序的思想很簡(jiǎn)單,遍歷數(shù)組,比較相鄰的兩個(gè)元素,順序錯(cuò)誤就把它們交換,直到整個(gè)數(shù)組排序完成,因?yàn)槊拷?jīng)過(guò)一趟排序,越小的元素會(huì)經(jīng)交換而慢慢“浮”到數(shù)列的頂端,因此叫做冒泡排序,需要的朋友可以參考下
    2023-11-11
  • JavaAgent實(shí)現(xiàn)http接口發(fā)布方式淺析

    JavaAgent實(shí)現(xiàn)http接口發(fā)布方式淺析

    這篇文章主要介紹了JavaAgent實(shí)現(xiàn)http接口發(fā)布方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2023-03-03
  • Gitlab CI-CD自動(dòng)化部署SpringBoot項(xiàng)目的方法步驟

    Gitlab CI-CD自動(dòng)化部署SpringBoot項(xiàng)目的方法步驟

    本文主要記錄如何通過(guò)Gitlab CI/CD自動(dòng)部署SpringBoot項(xiàng)目jar包。文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-07-07
  • Java舉例講解分治算法思想

    Java舉例講解分治算法思想

    分治算法的基本思想是將一個(gè)規(guī)模為N的問(wèn)題分解為K個(gè)規(guī)模較小的子問(wèn)題,這些子問(wèn)題相互獨(dú)立且與原問(wèn)題性質(zhì)相同。求出子問(wèn)題的解,就可得到原問(wèn)題的解,本篇文章我們就用分治算法來(lái)實(shí)現(xiàn)歸并排序快速排序以及二分搜索算法
    2022-04-04
  • java調(diào)用shell命令并獲取執(zhí)行結(jié)果的示例

    java調(diào)用shell命令并獲取執(zhí)行結(jié)果的示例

    今天小編就為大家分享一篇java調(diào)用shell命令并獲取執(zhí)行結(jié)果的示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • 用Java代碼實(shí)現(xiàn)棧數(shù)據(jù)結(jié)構(gòu)的基本方法歸納

    用Java代碼實(shí)現(xiàn)棧數(shù)據(jù)結(jié)構(gòu)的基本方法歸納

    這篇文章主要介紹了用Java代碼實(shí)現(xiàn)棧數(shù)據(jù)結(jié)構(gòu)的基本方法歸納,各種算法的實(shí)現(xiàn)也是ACM上經(jīng)常出現(xiàn)的題目,是計(jì)算機(jī)學(xué)習(xí)的基本功,需要的朋友可以參考下
    2015-08-08
  • SpringBoot封裝JDBC的實(shí)現(xiàn)步驟

    SpringBoot封裝JDBC的實(shí)現(xiàn)步驟

    本文主要介紹了SpringBoot封裝JDBC的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12

最新評(píng)論

马龙县| 富源县| 塘沽区| 蓬溪县| 都匀市| 三明市| 巢湖市| 克什克腾旗| 英吉沙县| 米脂县| 永和县| 太谷县| 马关县| 墨玉县| 来宾市| 三台县| 会东县| 阳西县| 梓潼县| 大丰市| 麦盖提县| 芦山县| 思茅市| 紫金县| 拜泉县| 阳曲县| 仙桃市| 林甸县| 武夷山市| 龙里县| 孟村| 察雅县| 安龙县| 黄平县| 高雄市| 禹城市| 南涧| 梧州市| 广州市| 垣曲县| 交口县|