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

Mybatis-plus如何開啟二級緩存

 更新時間:2024年01月12日 17:01:34   作者:Csea_  
這篇文章主要介紹了Mybatis-plus如何開啟二級緩存問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

一、Ehcache、Redis比較

? ehcache是直接在jvm虛擬機中緩存,速度快,效率高;但是共享緩存麻煩,在分布式下顯得功能弱;

? redis是通過socket訪問到緩存服務(wù),效率比ehcache低,但是比訪問數(shù)據(jù)庫快;在處理分布式下共享緩存很方便,并且機制成熟。

? 單體應(yīng)用可以采用ehcache,在大型應(yīng)用場景下,分布式要求就采用redis。

補充:

ehcache也是有共享緩存的方案,但是是通過RMI或Jgroup多廣播方式進行廣播緩存和通知刷新,這樣緩存復(fù)雜,維護不方便,簡單緩存還是可以的,但是涉及恢復(fù)或數(shù)據(jù)量大的情況下,顯得功能弱,不適合。

二、Ehcache

1.簡介

? EhCache 是一個純Java的進程內(nèi)緩存框架,具有快速、精干等特點,是Hibernate中默認CacheProvider。

Ehcache是一種廣泛使用的開源Java分布式緩存。主要面向通用緩存,Java EE和輕量級容器。

它具有內(nèi)存和磁盤存儲,緩存加載器,緩存擴展,緩存異常處理程序,一個gzip緩存servlet過濾器,支持REST和SOAP api等特點。

? Spring 提供了對緩存功能的抽象:即允許綁定不同的緩存解決方案(如Ehcache),但本身不直接提供緩存功能的實現(xiàn)。它支持注解方式使用緩存,非常方便。

2.特點

  • 快速
  • 簡單
  • 多種緩存策略
  • 緩存數(shù)據(jù)有兩級:內(nèi)存和磁盤,因此無需擔心容量問題
  • 緩存數(shù)據(jù)會在虛擬機重啟的過程中寫入磁盤
  • 可以通過RMI、可插入API等方式進行分布式緩存
  • 具有緩存和緩存管理器的偵聽接口
  • 支持多緩存管理器實例,以及一個實例的多個緩存區(qū)域
  • 提供Hibernate的緩存實現(xiàn)

3.三大元素

  • CacheManager : 緩存管理器,可以通過單例或者多例的方式創(chuàng)建,也是Ehcache的入口類;
  • Cache : 每個CacheManager可以管理多個Cache,每個Cache可以采用hash的方式管理多個Element;
  • Element : 用于存放真正緩存內(nèi)容的。

4.集成

? 可以單獨使用,ehcache在第三方用的比較多,比如mybatis、shiro中,但是對于分布式架構(gòu)中,encache顯得不是特別強,不能多節(jié)點同步,通暢在這種情況下用redis。

5.示例

1.創(chuàng)建springboot項目,在配置文件中配置:mybatis-plus.cache-enabled = true

Mybatis-plus開啟緩存1

2.在啟動類上添加:@EnableCaching

Mybatis-plus開啟緩存2

3.在xml文件中添加標簽,并添加相應(yīng)的sql執(zhí)行語句

mybatis-plus版本必須低于2.0.9才可以使用二級緩存,否則MP自帶的一些方法就算配置了二級緩存也不起作用。

Mybatis-plus開啟緩存3

4.在Mapper、Service層添加相應(yīng)方法之后,在Service的方法上配置緩存,key應(yīng)該是不同的,不同id的對應(yīng)不同的數(shù)據(jù)。

Mybatis-plus開啟緩存4

  • ?? ①Cacheable:根據(jù)方法的請求參數(shù)對其結(jié)果進行緩存,多用于查詢
  • ? ②CachePut:執(zhí)行方法,并緩存結(jié)果
  • ? ③CacheEvict:清空緩存
  • ? ④Caching:能夠同時應(yīng)用多個緩存注解功能
  • ? ⑤CacheConfig:用于抽取緩存的公共配置(類級別)

5.我這里添加了3個接口用來做測試

? Mybatis-plus開啟緩存5

運行第一個接口時,控制臺輸出只有一次去打開數(shù)據(jù)庫去獲取數(shù)據(jù),其他幾次都是去緩存中獲取。

Mybatis-plus開啟緩存6

?同理第二個接口也是跟第一個接口一樣

Mybatis-plus開啟緩存7

當我執(zhí)行更新方法之后,控制臺會打印輸出:

Mybatis-plus開啟緩存8

?此時我們再去執(zhí)行第一個接口時,又會去打開數(shù)據(jù)庫取獲取數(shù)據(jù),并且數(shù)據(jù)更新了(key的關(guān)鍵作用就是指定那條數(shù)據(jù))

Mybatis-plus開啟緩存9

三、Redis

1.簡介

Redis 是完全開源免費的,遵守BSD協(xié)議,是一個高性能的key-value數(shù)據(jù)庫。

Redis 與其他 key - value 緩存產(chǎn)品有以下三個特點

  • Redis支持數(shù)據(jù)的持久化,可以將內(nèi)存中的數(shù)據(jù)保存在磁盤中,重啟的時候可以再次加載進行使用。
  • Redis不僅僅支持簡單的key-value類型的數(shù)據(jù),同時還提供list,set,zset,hash等數(shù)據(jù)結(jié)構(gòu)的存儲。
  • Redis支持數(shù)據(jù)的備份,即master-slave模式的數(shù)據(jù)備份。

2.優(yōu)勢

  • 性能極高 – Redis能讀的速度是110000次/s,寫的速度是81000次/s 。
  • 豐富的數(shù)據(jù)類型 – Redis支持二進制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數(shù)據(jù)類型操作。
  • 原子 – Redis的所有操作都是原子性的,意思就是要么成功執(zhí)行要么失敗完全不執(zhí)行。單個操作是原子性的。多個操作也支持事務(wù),即原子性,通過MULTI和EXEC指令包起來。
  • 豐富的特性 – Redis還支持 publish/subscribe, 通知, key 過期等等特性。

3.示例

1.引入依賴、配置

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

Mybatis-plus開啟緩存10

2.在啟動類上添加注解:@EnableCaching

3.添加RedisConfig

package com.springboot.cache.config;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import java.time.Duration;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

/**
 * @author Csea
 * @title
 * @date 2019/11/26 14:51
 */
@EnableCaching
@Configuration
public class RedisConfig extends CachingConfigurerSupport {
    @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);

        // 使用Jackson2JsonRedisSerialize 替換默認序列化
        @SuppressWarnings("rawtypes")
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);

        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);

        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);

        // 設(shè)置value的序列化規(guī)則和 key的序列化規(guī)則
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }

    //緩存管理器
    @Bean
    public CacheManager cacheManager(RedisConnectionFactory lettuceConnectionFactory) {
        RedisCacheConfiguration defaultCacheConfig = RedisCacheConfiguration.defaultCacheConfig();
        // 設(shè)置緩存管理器管理的緩存的默認過期時間
        defaultCacheConfig = defaultCacheConfig.entryTtl(Duration.ofMinutes(60))
                // 不緩存空值
                .disableCachingNullValues();

        Set<String> cacheNames = new HashSet<>();
        cacheNames.add("my-redis-cache1");

        // 對每個緩存空間應(yīng)用不同的配置
        Map<String, RedisCacheConfiguration> configMap = new HashMap<>();
        configMap.put("my-redis-cache1", defaultCacheConfig.entryTtl(Duration.ofMinutes(50)));

        RedisCacheManager cacheManager = RedisCacheManager.builder(lettuceConnectionFactory)
                .cacheDefaults(defaultCacheConfig)
                .initialCacheNames(cacheNames)
                .withInitialCacheConfigurations(configMap)
                .build();
        return cacheManager;
    }
}

3.Mapper.xml添加執(zhí)行Sql

Mybatis-plus開啟緩存11

4.在service層配置Cache

Mybatis-plus開啟緩存12

5.controller調(diào)試

Mybatis-plus開啟緩存13

第一次請求時候,因為redis一開始沒有數(shù)據(jù),所以會從數(shù)據(jù)庫中獲取數(shù)據(jù)并寫入到redis中,之后就一直會從緩存中獲取數(shù)據(jù)

Mybatis-plus開啟緩存14

當執(zhí)行了更新操作之后就會去清空redis對應(yīng)key的數(shù)據(jù)

Mybatis-plus開啟緩存15

在此執(zhí)行獲取數(shù)據(jù)時,就會再去數(shù)據(jù)庫中獲取數(shù)據(jù)并存入到redis中

4.補充

緩存注解:

@Cacheable、@CacheEvict、@CachePut、@Caching、@CacheConfig

  • allEntries屬性:boolean類型,表示是否需要清除緩存中的所有元素,默認false,當為true時,Spring Cache將忽略指定的key,這樣就可以清除所有的元素緩存。
  • beforeInvocation屬性:boolean類型,默認false,當為true時,Spring會在調(diào)用該方法之前清除緩存中的指定元素。表示的是 是否在方法執(zhí)行之前就清空緩存,在默認情況下,如果方法執(zhí)行會拋出異常,就不會清空緩存。
  • condition屬性:參數(shù)的條件,根據(jù)設(shè)置的條件返回true、false,true時才會去緩存數(shù)據(jù)。
  • unless屬性:結(jié)果條件,根據(jù)結(jié)果預(yù)先設(shè)置的條件判斷true、false,true時才存入緩存。

? ①key的策略:

key屬性是用來指定Spring緩存方法的返回結(jié)果時對應(yīng)的key的。該屬性支持SpringEL表達式。當我們沒有指定該屬性時,Spring將使用默認策略生成key。

自定義策略是指我們可以通過Spring的EL表達式來指定我們的key。

這里的EL表達式可以使用方法參數(shù)及它們對應(yīng)的屬性。

使用方法參數(shù)時我們可以直接使用“#參數(shù)名”或者“#p參數(shù)index”。

@Cacheable(value="Place",key="#placeId")
PlaceInfoEntity getPlaceId(Integer placeId);

@Cacheable(value="Place",key="#p0")
PlaceInfoEntity getPlaceId(Integer placeId);

@Cacheable(value="Place",key="#p0", condition = "#placeId >0",unless = "#result.placeName!=nullValidator")
PlaceInfoEntity getPlaceId(Integer placeId);

@CacheEvict(value="Place",key = "#placeInfoEntity.placeId")
boolean updatePlace(PlaceInfoEntity placeInfoEntity);

@CacheEvict(value="Place",key = "#p0.placeId")
boolean updatePlace(PlaceInfoEntity placeInfoEntity);

@CacheEvict(value="Place",key = "#p0.placeId" condition = "#placeInfoEntity.placeId > 0", unless = "#result.code != 0")
boolean updatePlace(PlaceInfoEntity placeInfoEntity);

②root對象的使用:

屬性名稱描述示例
methodName當前方法名#root.methodName
method當前方法#root.method.name
target當前被調(diào)用的對象#root.target
targetClass當前被調(diào)用的對象的Class#root.targetClass
args當前方法參數(shù)組成的數(shù)組#root.args[0]
caches當前被調(diào)用的方法使用的Cache#root.caches[0].name

總結(jié)

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

相關(guān)文章

  • Java8實現(xiàn)Stream流的合并的方法展示

    Java8實現(xiàn)Stream流的合并的方法展示

    本文介紹了Java8中Stream流的合并方法,包括concat()、flatMap()和reduce()三種方法。其中,concat()方法可以將兩個Stream流合并成一個,flatMap()方法可以將一個Stream流中的元素映射成多個Stream流并合并成一個,reduce()方法可以將Stream流中的元素逐個合并成一個結(jié)果
    2023-05-05
  • java數(shù)據(jù)庫連接池和數(shù)據(jù)庫連接示例

    java數(shù)據(jù)庫連接池和數(shù)據(jù)庫連接示例

    這篇文章主要介紹了java數(shù)據(jù)庫連接池和數(shù)據(jù)庫連接示例,需要的朋友可以參考下
    2014-05-05
  • Java編寫緩存工具類的示例代碼

    Java編寫緩存工具類的示例代碼

    這篇文章主要為大家詳細介紹了如何基于Java編寫一個緩存工具類,文中的示例代碼講解詳細,具有一定的參考價值,感興趣的小伙伴可以了解一下
    2023-07-07
  • SpringBoot集成Hadoop對HDFS的文件操作方法

    SpringBoot集成Hadoop對HDFS的文件操作方法

    這篇文章主要介紹了SpringBoot集成Hadoop對HDFS的文件操作方法,本文給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2024-07-07
  • MyBtais的一級緩存和二級緩存原理、使用場景解析

    MyBtais的一級緩存和二級緩存原理、使用場景解析

    文章總結(jié)了MyBatis的一級緩存和二級緩存的工作原理、使用場景和優(yōu)缺點,文章還提供了一級緩存和二級緩存的對比表,并總結(jié)了緩存的使用建議,感興趣的朋友跟隨小編一起看看吧
    2025-12-12
  • Java繼承構(gòu)造器使用過程解析

    Java繼承構(gòu)造器使用過程解析

    這篇文章主要介紹了Java繼承構(gòu)造器使用過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-12-12
  • mybatis 如何利用resultMap復(fù)雜類型list映射

    mybatis 如何利用resultMap復(fù)雜類型list映射

    這篇文章主要介紹了mybatis 如何利用resultMap復(fù)雜類型list映射的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Idea之沒有網(wǎng)絡(luò)的情況下創(chuàng)建SpringBoot項目的方法實現(xiàn)

    Idea之沒有網(wǎng)絡(luò)的情況下創(chuàng)建SpringBoot項目的方法實現(xiàn)

    本文主要介紹了Idea之沒有網(wǎng)絡(luò)的情況下創(chuàng)建SpringBoot項目的方法實現(xiàn),文中通過圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-09-09
  • Java位運算知識點詳解

    Java位運算知識點詳解

    這篇文章給大家分享了關(guān)于Java位運算的相關(guān)知識點內(nèi)容,有興趣的朋友們可以學習參考下。
    2018-09-09
  • Java中閉包簡單代碼示例

    Java中閉包簡單代碼示例

    這篇文章主要介紹了Java中閉包簡單代碼示例,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01

最新評論

文化| 大石桥市| 蓝田县| 台东县| 堆龙德庆县| 阿图什市| 临夏市| 凤台县| 南江县| 长春市| 安化县| 华宁县| 海盐县| 章丘市| 丰城市| 马山县| 拉孜县| 独山县| 灵石县| 固安县| 内乡县| 柘城县| 平原县| 广饶县| 大庆市| 河间市| 丽水市| 呼和浩特市| 靖宇县| 栾城县| 民乐县| 高雄县| 金华市| 鄂托克前旗| 大化| 开远市| 饶平县| 宝应县| 无极县| 商洛市| 临湘市|