SpringBoot2.0 基礎案例(13):基於Cache註解模式,管理Redis緩存

来源:https://www.cnblogs.com/cicada-smile/archive/2019/06/21/11067047.html
-Advertisement-
Play Games

一、Cache緩存簡介 從Spring3開始定義Cache和CacheManager介面來統一不同的緩存技術; Cache介面為緩存的組件規範定義,包含緩存的各種操作集合; Cache介面下Spring提供了各種緩存的實現; 如RedisCache,EhCacheCache ,ConcurrentM ...


本文源碼
GitHub地址:知了一笑
https://github.com/cicadasmile/spring-boot-base

一、Cache緩存簡介

從Spring3開始定義Cache和CacheManager介面來統一不同的緩存技術;
Cache介面為緩存的組件規範定義,包含緩存的各種操作集合;
Cache介面下Spring提供了各種緩存的實現;
如RedisCache,EhCacheCache ,ConcurrentMapCache等;

二、核心API

1、Cache緩存介面
定義緩存操作。實現有:RedisCache、EhCacheCache、ConcurrentMapCache等
2、CacheManager
緩存管理器,管理各種緩存(cache)組件
3、@Cacheable 主要針對方法配置,能夠根據方法的請求參數對其進行緩存

Cacheable 執行流程
1)方法運行之前,按照cacheNames指定的名字先去查詢Cache 緩存組件
2)第一次獲取緩存如果沒有Cache組件會自動創建
3)Cache中查找緩存的內容,使用一個key,預設就是方法的參數
4)key是按照某種策略生成的;預設是使用keyGenerator生成的,這裡使用自定義配置
5)沒有查到緩存就調用目標方法;
6)將目標方法返回的結果,放進緩存中

Cacheable 註解屬性
cacheNames/value:指定方法返回結果使用的緩存組件的名字,可以指定多個緩存
key:緩存數據使用的key
key/keyGenerator:key的生成器,可以自定義
cacheManager:指定緩存管理器
cacheResolver:指定緩存解析器
condition:指定符合條件的數據才緩存
unless:否定緩存;當unless指定的條件為true,方法的返回值就不會被緩存
sync:是否使用非同步模式

4、@CacheEvict
清除緩存

CacheEvict:緩存清除
key:指定要清除的數據
allEntries = true:指定清除這個緩存中所有的數據
beforeInvocation = false:方法之前執行清除緩存,出現異常不執行
beforeInvocation = true:代表清除緩存操作是在方法運行之前執行,無論方法是否出現異常,緩存都清除

5、@CachePut
保證方法被調用,又希望結果被緩存。
與@Cacheable區別在於是否每次都調用方法,常用於更新,寫入

CachePut:執行方法且緩存方法執行的結果
修改了資料庫的某個數據,同時更新緩存;
執行流程
 1)先調用目標方法
 2)然後將目標方法的結果緩存起來

6、@EnableCaching
開啟基於註解的緩存
7、keyGenerator
緩存數據時key生成策略
8、@CacheConfig
統一配置本類的緩存註解的屬性

三、與SpringBoot2.0整合

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、Cache緩存配置

import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.lang.reflect.Method;
@Configuration
public class CacheConfig {
    /**
     * 自定義 Cache 的 key 生成器
     */
    @Bean("oneKeyGenerator")
    public KeyGenerator getKeyGenerator (){
        return new KeyGenerator() {
            @Override
            public Object generate(Object obj, Method method, Object... objects) {
                return "KeyGenerator:"+method.getName();
            }
        } ;
    }
}

3、啟動類註解開啟Cache

@EnableCaching            // 開啟Cache 緩存註解
@SpringBootApplication
public class CacheApplication {
    public static void main(String[] args) {
        SpringApplication.run(CacheApplication.class,args) ;
    }
}

4、Cache註解使用代碼

1)封裝增刪改查介面

import com.boot.cache.entity.User;
public interface UserService {
    // 增、改、查、刪
    User addUser (User user) ;
    User updateUser (Integer id) ;
    User selectUser (Integer id) ;
    void deleteUser (Integer id);
}

2)Cache註解使用案例

import com.boot.cache.entity.User;
import com.boot.cache.service.UserService;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl implements UserService {
    // 使用自定義的key生成策略
    // 緩存結果key:addUser::KeyGenerator:addUser
    @CachePut(value = "addUser",keyGenerator="oneKeyGenerator")
    @Override
    public User addUser(User user) {
        return user ;
    }
    // 緩存結果key:updateUser::2
    @CachePut(value = "updateUser",key = "#result.id")
    @Override
    public User updateUser(Integer id) {
        User user = new User() ;
        user.setId(id);
        user.setName("smile");
        return user;
    }
    // 緩存結果key: selectUser::3
    @Cacheable(cacheNames = "selectUser",key = "#id")
    @Override
    public User selectUser(Integer id) {
        User user = new User() ;
        user.setId(id);
        user.setName("cicadaSmile");
        return user;
    }
    // 刪除指定key: selectUser::3
    @CacheEvict(value = "selectUser",key = "#id",beforeInvocation = true)
    @Override
    public void deleteUser(Integer id) {

    }
}

5、測試代碼塊

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = CacheApplication.class)
public class CacheTest {
    @Resource
    private UserService userService ;
    // 分別測試:增、改、查、刪,四個方法
    @Test
    public void testAdd (){
        User user = new User() ;
        user.setId(1);
        user.setName("cicada");
        userService.addUser(user) ;
    }
    @Test
    public void testUpdate (){
        userService.updateUser(2) ;
    }
    @Test
    public void testSelect (){
        userService.selectUser(3) ;
    }
    @Test
    public void testDelete (){
        userService.deleteUser(3) ;
    }
}

四、源代碼地址

GitHub地址:知了一笑
https://github.com/cicadasmile/spring-boot-base
碼雲地址:知了一笑
https://gitee.com/cicadasmile/spring-boot-base



您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 為什麼要使用Supervisord 17年第一次寫Go項目的時候,用Go開發項目倒沒沒費多大勁,很快就開發完成了。到了在測試環境部署的時候,由於不知道有 Supervisord 這個軟體,著實花了些功夫。總不能跟開發環境一樣,直接執行編譯生成的二進位文件吧,即使 後臺執行了,萬一它掛了,沒人知道,即 ...
  • 1.首先先安裝python3,安裝完成python3後自然就有了pip 2.然後使用pip install scapy 安裝scapy,如果提示升級pip就先升級pip,升級完pip後再使用這個命令安裝scapy 3.安裝完之後如果再cmd下能敲scapy,但是提示報錯,去這個網站下載源碼https ...
  • "上一篇" 中我們初步體驗了google benchmark的使用,在本文中我們將更進一步深入瞭解google benchmark的常用方法。 本文索引 向測試用例傳遞參數 簡化多個類似測試用例的生成 使用參數生成器 向測試用例傳遞參數 之前我們的測試用例都只接受一個 類型的參數,如果我們需要給測試 ...
  • 這個月經歷了好多事,一忙就把更新的事給忘了 但是絕對沒有偷懶,格鬥游戲進展神速 8號給我媽下葬回來就研究結婚的事, 因為種種原因,今年先不舉辦婚禮了,其它的照常,後天就去拍婚紗照 媳婦現在還在一邊組裝她買的非常麻煩的禮糖盒子...至少要150人份的 格鬥游戲進展 1:增加2P,並且實現了兩個人換位置 ...
  • 一、冒泡排序介紹 冒泡排序(英語:Bubble Sort)是一種簡單的排序演算法。它重覆地遍歷要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。遍曆數列的工作是重覆地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢“浮”到數列的頂端 ...
  • python,flask, ...
  • 在Python中,有這兩個概念容易讓人混淆。第一個是可迭代對象(Iterable),第二個是迭代器(Iterator),第三個是生成器(Generator),這裡暫且不談生成器。 可迭代對象 列表、元組、字元串、字典等都是可迭代對象,可以使用for迴圈遍歷出所有元素的都可以稱為可迭代對象(Itera ...
  • 嵌套 ? 一系列字典存儲在列表or列表作為值存儲在字典or字典中套字典 1. 字典列表 這樣手動一個一個輸入太費勁,讓其自動生成多個: 但此時生成的數量是很多了,可都具有一樣的特征,怎麼辦呢? 通過切片修改部分外星人的特征,就可生成具有不同特征的外星人。 2. 在字典中存儲列表 多個鍵值對時: 運行 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...