欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

一、SpringCache介紹

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

使用Spring Cache的好處:

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

二、項目集成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)換異常的問題
        ObjectMapper om = new ObjectMapper();
        // 指定要序列化的域,field,get和set,以及修飾符范圍,ANY是都有包括private和public
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        // 指定序列化輸入的類型,類必須是非final修飾的,final修飾的類,比如String,Integer等會跑出異常
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        //序列號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)換異常的問題
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        // 配置序列化(解決亂碼的問題),過期時間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=[主機地址]
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
#最大阻塞等待時間(負(fù)數(shù)表示沒限制)
spring.redis.lettuce.pool.max-idle=5
spring.redis.lettuce.pool.min-idle=0

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

1.緩存@Cacheable

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

根據(jù)id查詢子數(shù)據(jù)列表屬于查詢方法,添加@Cacheable注解表示方法執(zhí)行時對返回結(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é)點
            boolean flag = this.hasChildren(dictId);
            // 為每條記錄設(shè)置hasChildren屬性
            dict.setHasChildren(flag);
        }
        return dictList;
    }

2.緩存@CachePut

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

3.緩存@CacheEvict

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

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

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

   /**
     * 導(dǎo)入數(shù)據(jù)字典到網(wǎng)頁
     * @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();
        }
    }

四、測試緩存是否添加成功

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

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

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

相關(guān)文章

  • java使用歸并刪除法刪除二叉樹中節(jié)點的方法

    java使用歸并刪除法刪除二叉樹中節(jié)點的方法

    這篇文章主要介紹了java使用歸并刪除法刪除二叉樹中節(jié)點的方法,實例分析了java二叉樹算法的相關(guān)操作技巧,需要的朋友可以參考下
    2015-05-05
  • SpringBoot?集成短信和郵件的配置示例詳解

    SpringBoot?集成短信和郵件的配置示例詳解

    這篇文章主要介紹了SpringBoot?集成短信和郵件的相關(guān)知識,項目中使用lombok插件和swagger依賴,無相關(guān)依賴的請自行修改,本文通過實例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-04-04
  • Spring?Boot使用Hibernate-Validator校驗參數(shù)時的長度校驗方法詳解

    Spring?Boot使用Hibernate-Validator校驗參數(shù)時的長度校驗方法詳解

    這篇文章主要給大家介紹了關(guān)于Spring?Boot使用Hibernate-Validator校驗參數(shù)時的長度校驗方法的相關(guān)資料,在Spring Boot中可以使用Spring Boot Validation來對參數(shù)名稱進(jìn)行校驗,需要的朋友可以參考下
    2023-08-08
  • Java多線程Atomic包操作原子變量與原子類詳解

    Java多線程Atomic包操作原子變量與原子類詳解

    這篇文章主要介紹了Java多線程Atomic包操作原子變量與原子類詳解,簡單介紹了Atomic,同時涉及java.util.concurrent中的原子變量,Atomic類的作用等相關(guān)內(nèi)容,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • Spring的@Scope注解詳細(xì)解析

    Spring的@Scope注解詳細(xì)解析

    這篇文章主要介紹了Spring的@Scope注解詳細(xì)解析,@Scope注解主要作用是調(diào)節(jié)Ioc容器中的作用域,springboot?程序啟動時會對classpath路徑下的包中的類進(jìn)行掃描,將類解析成BeanDefinition,需要的朋友可以參考下
    2023-11-11
  • Spring Boot 中的 SockJS原理及使用方法

    Spring Boot 中的 SockJS原理及使用方法

    SockJS 的主要作用是提供一種 WebSocket 的兼容性解決方案,使得不支持 WebSocket 的瀏覽器也可以使用 WebSocket,本文介紹了Spring Boot中的SockJS,包括SockJS的原理,使用方法和示例代碼,感興趣的朋友跟隨小編一起看看吧
    2023-07-07
  • java開發(fā)之讀寫txt文件操作的實現(xiàn)

    java開發(fā)之讀寫txt文件操作的實現(xiàn)

    本篇文章介紹了,java開發(fā)之讀寫txt文件操作的實現(xiàn)。需要的朋友參考下
    2013-05-05
  • Java集合之Map接口與實現(xiàn)類詳解

    Java集合之Map接口與實現(xiàn)類詳解

    這篇文章主要為大家詳細(xì)介紹了Java集合中的Map接口與實現(xiàn)類,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Java有一定的幫助,感興趣的可以了解一下
    2022-12-12
  • JAVA實現(xiàn)讀取txt文件內(nèi)容的方法

    JAVA實現(xiàn)讀取txt文件內(nèi)容的方法

    本篇文章主要介紹了JAVA實現(xiàn)讀取txt文件內(nèi)容的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • servlet Cookie使用方法詳解(六)

    servlet Cookie使用方法詳解(六)

    這篇文章主要為大家詳細(xì)介紹了servlet Cookie的使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-09-09

最新評論