2017-08-30 131 views
1

我使用@Cacheable註釋緩存我的方法的結果緩存空值。出於性能原因,我想緩存null和從方法返回的非空值。春季啓動可緩存 -

但這裏的問題是春天緩存非空值,但由於某些原因不緩存爲空。

這裏是我的代碼:

@Cacheable(
      cacheManager = "promoCacheManager", 
      value = "promos:campaign", 
      key = "'promos:campaign:'.concat(#currencyId)" 
    ) 
    public PromosDto getPromosByCurrency(Integer currencyId) { 

... 

我已經嘗試每一件事情。即使我設置

unless = "#result != null || #result == null"

但是這並沒有很好的幫助。 任何指針?

回答

2

檢查您的高速緩存管理器的設置。

例如:RedisCacheManager有一個重載構造函數,您可以在其中指定cacheNullValues;這在默認情況下是錯誤的 - 嘗試將其設置爲true。

https://docs.spring.io/spring-data/redis/docs/current/api/org/springframework/data/redis/cache/RedisCacheManager.html#RedisCacheManager-org.springframework.data.redis.core.RedisOperations-java.util.Collection-boolean-

還要記住:

注意當啓用cacheNullValues請務必RedisOperations使用的RedisSerializer能夠序列化NullValue屬性的。

2

爲什麼不回Optional<PromosDto>安全地包裹空。這應該緩存罰款然後,根據https://docs.spring.io/spring/docs/4.3.10.RELEASE/spring-framework-reference/htmlsingle/#cache-annotations-cacheable-condition

+0

不是爲我工作。還是一樣。只有在可選內部的對象不爲空時它纔會緩存。 – Tariq

+0

您的緩存提供程序是否支持緩存空值? – Richard

+0

是的,我正在使用Redis緩存。所以它確實支持空值 – Tariq