簡體   English   中英

Spring Boot:設計一個緩存定時數據的服務

[英]Spring Boot: Design a service that caches timed data

我正在使用 Spring Boot(使用 Java)開發一項服務,我有以下要求:該服務(在調用時)必須生成一個與我作為輸入傳遞給該服務的字符串關聯的定時 UUID 例如,如果我像這樣調用服務(使用 Http GET):

http://localhost:8080/myService?param=example

該服務返回一個 UUID,如 55bcbfce-8984-4f1d-8435-f9548baf8cb5。 事實上,我想實現一個緩存系統來存儲(在有限的時間內,比如 5 秒)這個 UUID 以及傳遞的字符串example

因此,存儲在應用程序中的“表”將是這樣的:

UUID 參數 期間
55bcbfce-8984-4f1d-8435-f9548baf8cb5 example 3秒
07ef2e6e-e6a1-45e7-b6a6-51dfab49f782 example2 2秒

像這樣,我通過將 UUID 作為輸入傳遞給它來調用第二個服務,如下所示:

http://localhost:8080/mySecondService?UUID=55bcbfce-8984-4f1d-8435-f9548baf8cb5

它可以返回給我(如果在正確的時間調用)與 UUID 55bcbfce-8984-4f1d-8435-f9548baf8cb5 關聯的param ,即example 如果時間到了,則第二個服務返回錯誤。

我的問題是:有沒有一種簡單的方法可以在不使用數據庫的情況下實現這一點,而只使用一個小型緩存系統(memory 將在兩個服務之間共享?),我對 Spring 引導和緩存都是新手。 並且以前從未使用過緩存。 在這種情況下我根本無法使用數據庫。

我想你有這樣的 DTO:

public record ResultDTO(String param, int seconds) {
}

您可以使用@Cacheable注釋通過配置CacheManager自動處理緩存。 您可以按照本教程進行操作。 最后,該方法將是這樣的:

@Cacheable("params")
public ResultDTO getByUUID(String UUID) {
    // your logic to retrieve the object
}

如果具有UUID輸入的元素不在緩存中,則執行getByUUID中的代碼。

您可以使用 memory 緩存實現。 緩存臨時存儲一些數據,通常具有在一段時間后自動刪除數據(過期)的功能。

這是cache2k的示例:

    Cache<String, String> cache =
      Cache2kBuilder.of(String.class, String.class)
        .entryCapacity(5000)
        .expireAfterWrite(5, TimeUnit.SECONDS)
        .build();

    String myService(String param) {
      String uuid = generateUuid();
      cache.put(uuid, param);
    }

    String mySecondService(String uuid) {
      String param = cache.get(uuid);
      if (param == null) {
          // error
      }
      return param;
    }

使用上面的代碼,過期不會在 5 秒后准確發生,但可能會延遲大約一秒,具體取決於系統活動。 如果您希望該項目的可見時間不超過 5 秒,請使用它而不是expireAfterWrite

  .expiryPolicy((key, value, startTime, currentEntry) ->
    Expiry.toSharpTime(startTime + TimeUnit.SECONDS.toMillis(5)))

確保條目容量足夠大,否則緩存會驅逐最近未使用的數據。

不要使用@Cacheable的 @Cacheable。它只適合mySecondService而不是緩存的數量。 所以不要混用不同的 API 概念。

該方法與其他緩存實現基本相同。

暫無
暫無

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

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