SpringCache 緩存框架

Redis6總綱

http://www.lxweimin.com/p/901dc5a0c683

文檔

https://docs.spring.io/spring-framework/docs/current/reference/html/integration.html#cache

目錄

1、簡介
2、構(gòu)建項目
3、注解、表達式語法
4、自定義緩存、緩存穿透解決

簡介

1、概述

Spring 從 3.1開始定義了org.springframework.cache.Cache
和org.springframework.cache.CacheManager,接口來統(tǒng)一不同的緩存技術(shù);并支持使用JCache (JSR107)注解簡化我們開發(fā);

Cache接口為緩存的組件規(guī)范定義,包含緩存的各種操作集合;
Cache接口下 Spring 提供了各種xxxCache..的實現(xiàn)﹔如RedisCache.,hCacheCache, ,ConcurrentMapCache等;

每次調(diào)用需要緩存功能的方法時,Spring 會檢查檢查指定參數(shù)的指定的目標方法是否已經(jīng)被調(diào)用過;如果有就直接從緩存中獲取方法調(diào)用后的結(jié)果,如果沒有就調(diào)用方法并緩存結(jié)果后返回給用戶。下次調(diào)用直接從緩存中獲取。

使用Spring緩存抽象時我們需要關(guān)注以下兩點;
(1)確定方法需要被緩存以及他們的緩存策略.
(2)從緩存中讀取之前緩存存儲的數(shù)據(jù)

2、關(guān)系圖

image.png

二、構(gòu)建項目

1、引入坐標

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

2、寫配置

spring.cache.type=redis
spring.redis.host=101.34.181.131
spring.redis.port=6379

3、開啟緩存功能

@EnableCaching

三、注解

@Cacheable: (觸發(fā)將數(shù)據(jù)保存到緩存的操作 )
@CacheEvict: (觸發(fā)將數(shù)據(jù)從緩存刪除的操作)
@CachePut: (不影響方法執(zhí)行更新緩存)
@Caching: (組合以上多個操作)
@CacheConfig: (在同一個類共享緩存的配置)

1、@Cacheable

代表這個是可以緩存的(在 TestServerImpl)
    // 指定一個分區(qū)名字:比如用戶實體,在人類分區(qū)下(也可以指定多個,逗號隔開)
    // 表示當前方法返回的結(jié)果需要緩存,如果緩存中有,則不調(diào)用當前被注解聲明的方法。反之。(調(diào)式就知道了)
    @Cacheable(("Person"))
    @Override
    public List<User> getUsers() {
        // dao層數(shù)據(jù)。。。。
        List<User> userList = new ArrayList<> ();
        userList.add (new User("1","小白",18));
        userList.add (new User("2","小黑",17));
        userList.add (new User("3","小黑",17));

        return userList;
    }

2、@CacheEvict 清除緩存(失效模式)

    // 清空所有關(guān)聯(lián)的數(shù)據(jù)
    // 失效模式
    //@CacheEvict(value = "Person" ,key = "'getUsers'")// 清楚一個
//    @Caching(evict = {
//            @CacheEvict(value = "Person" ,key = "'getUsers'"),
//            @CacheEvict(value = "Person" ,key = "'getUsers2'")
//    })// 清楚多個
    @CacheEvict(value = "Person",allEntries = true)// 清除整個分區(qū)下的所有key
    @Override
    public List<User> deleteList() {
        return null;
    }

3、@CachePut 更新緩存(雙寫模式)

    // 更新緩存,雙寫模式
    @CachePut(value = "Person",key = "'getUsers'")
    @Override
    public List<User> updateList() {
        // dao層數(shù)據(jù)。。。。
        List<User> userList = new ArrayList<> ( );
        userList.add (new User ("1", "小白", 18));
        return userList;
    }

4、默認行為

(1)如果緩存中有key,方法不被調(diào)用(及時db和內(nèi)存的不一樣),反之
(2)key默認自動生成:Person::SimpleKey []
(3)緩存中value的值,使用 jdk序列化機制,將序列化后的數(shù)據(jù)存到redis
(4)默認時間 -1 表示永不失效(不符合規(guī)范,應(yīng)該有過期時間)

5、自定義緩存生成的 key

(1)指定生成的 key名字
(2)指定過期時間
(3)將數(shù)據(jù)保存為 JSON格式

6、表達式解決 自定義key

    // 分區(qū)名 value ,key名 方法名(表達式)
    @Cacheable(value = "Person",key = "#root.method.name")

7、配置文件設(shè)置過期時間(寫死的,會有雪崩問題)

 #毫秒單位
spring.cache.redis.time-to-live=360000

四、自定義配置

@EnableConfigurationProperties(CacheProperties.class)
@Configuration
@EnableCaching// 開啟緩存
public class MyCacheConfig {

//    @Autowired
//    CacheProperties cacheProperties;

    /**
     * 自定義 Redis配置文件
     *
     * @return
     */
    @Bean
    RedisCacheConfiguration redisCacheConfiguration(CacheProperties cacheProperties) {

        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig ( );
        //實例化key的序列化器對象
        RedisSerializer<String> redisSerializer = new StringRedisSerializer ( );
        //實例化value的序列化器對象
        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer =
                new Jackson2JsonRedisSerializer<> (Object.class);

        //覆蓋key的序列化方式
        config = config.serializeKeysWith (RedisSerializationContext.SerializationPair.
                fromSerializer (redisSerializer));
        //覆蓋value的序列化方式
        config = config.serializeValuesWith (RedisSerializationContext.SerializationPair.
                fromSerializer (jackson2JsonRedisSerializer));


         CacheProperties.Redis redisProperties = cacheProperties.getRedis ( );

         // 配置文件生效
        if (redisProperties.getTimeToLive ( ) != null) {
            Duration timeToLive = redisProperties.getTimeToLive ( );
            // 配置文件中設(shè)置的過期時間
            long seconds = timeToLive.getSeconds ( );
            config = config.entryTtl (redisProperties.getTimeToLive ( ));
        }
        if (redisProperties.getKeyPrefix ( ) != null) {
            config = config.prefixCacheNameWith (redisProperties.getKeyPrefix ( ));
        }
        if (!redisProperties.isCacheNullValues ( )) {
            config = config.disableCachingNullValues ( );
        }
        if (!redisProperties.isUseKeyPrefix ( )) {
            config = config.disableKeyPrefix ( );
        }
        return config;

    }
}

spring.cache.type=redis
spring.redis.host=101.34.181.131
spring.redis.port=6379

#毫秒單位
spring.cache.redis.time-to-live=360000
#緩存key加上前綴
spring.cache.redis.key-prefix=CACHE_
#開啟前綴
spring.cache.redis.use-key-prefix=true
#是否緩存控制(防止穿透問題)
spring.cache.redis.cache-null-values=true

五、SpringCache讀,寫不足和原理

1、

參考博客

https://blog.csdn.net/slslslyxz/article/details/105582954?spm=1001.2101.3001.6650.3&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-3.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-3.no_search_link

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,563評論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,694評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,672評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,965評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,690評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,019評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,013評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,188評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,718評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,438評論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,667評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,149評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,845評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,252評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,590評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,384評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,635評論 2 380

推薦閱讀更多精彩內(nèi)容