簡體   English   中英

Spring緩存如何工作?

[英]How Spring Caching works?

@Cacheable 注釋如何通知數據庫中的更改。 例如:如果我通過@Cacheable 注釋函數調用來緩存 CRUDRepository.findAll() 函數調用的結果,則結果存儲在命名緩存中。 然而,緩存會繼續隨着數據庫的變化而更新。 考慮下面的例子:

@Cacheable(value = "employee", key = "#id")
public Iterable<Employee> getAllEmployees(){                 
    long startTime = System.currentTimeMillis();
    Iterable<Employee>  itr = employeeEntityRepository.findAll();
    long stopTime = System.currentTimeMillis();
    System.out.println("Time-->" + (stopTime - startTime));
    return itr;
}

當這個方法第一次被調用時,它需要 300 毫秒,第二次它幾乎不需要 5 毫秒,這意味着它緩存了結果集。 很公平。 但是現在,如果我直接在數據庫中更新員工表中的記錄並再次調用此方法,則會發生兩件事:

  1. 此方法調用返回新記錄。
  2. 該方法返回非常快。

這意味着緩存每次都從數據庫更新。 如果結果集從 Cache 返回,此 Sync 如何工作?

謝謝。

主要問題是:緩存每次都從數據庫更新。 如果結果集從緩存返回,此同步如何工作?

根據 spring 文檔 (5.3.7) 當我們需要緩存調用結果時使用 @Cacheable 注釋。

在上述場景中,將應用緩存行為,檢查是否已經為給定參數調用了該方法。

您的示例中使用了以下屬性。 他們的描述如下:

  1. value : 這個緩存名稱,在上面的例子中是“員工”
  2. Key :這是 SpEl,Spring 表達式語言,用於動態計算密鑰。

理想情況下,您應該在 getAllEmployees() 方法中使用“id”作為方法參數。 但是這個方法似乎返回了所有員工,所以在這種情況下使用似乎不正確。

SpEl 表達式為 "#id" = 自定義密鑰生成器

默認情況下它是 "" = 所有方法參數都被視為關鍵。

如果在計算出的鍵的緩存中沒有找到值,則將調用目標方法並將返回值存儲在關聯的緩存中。

我遇到的場景是@Cacheable注解的方法

    @Cacheable(value= myConstant,key="#accountId")
public Integer getAccountNumber( Integer accountId){. 
// an API call is made here..}

因此,緩存不是從 DB 更新的,而是從下一次調用(API 調用)更新的,第一次調用該方法時,結果存儲在緩存中。 第二次調用該方法時,會返回緩存的結果,並且不會發生該方法中的 API 調用。

我已經提到: https : //docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/cache/annotation/Cacheable.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM