[英]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.