【问题标题】:Spring boot cache a fieldSpring Boot 缓存一个字段
【发布时间】:2021-11-30 02:04:03
【问题描述】:

我有一个 Spring Boot 应用程序,我需要在缓存中存储一​​个地图。可以通过调用 REST API 来更新此地图。

我可以声明一个服务字段并将其与缓存一起使用吗?

pom:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-cache</artifactId>
    </dependency>

控制者:

@PostMapping("updateMap")
@ResponseBody
public ResponseEntity uploadMap(@RequestBody Map<String, Object> data) {
    mapService.updateMap(data);   
    return ResponseEntity.ok();
}

服务

// Is it possible to annotate it with @Cachable?    
private Map<String, Object> cachedMap;     



 public void updateMap(Map<String, Object> data) {
       //update cachedMap by data
    }

public Object getFromMap(String key) {
       //get object from map by key
    }

【问题讨论】:

    标签: java spring-boot caching


    【解决方案1】:

    Cacheable 是针对方法、接口和类的注解。它并非针对您打算使用的字段。

    在您的服务中,您可以创建一个getMap 方法并向其添加@Cacheable 注释。所以每次调用这个方法(在服务之外由于Spring代理,除了第一次地图不存在缓存)返回的地图对象将是缓存的。 p>

    @Cacheable("map")
    public Map<String, Object> getMap() {
        // initialize your Map
        cachedMap = new HashMap<>();
        cachedMap.put("somekey", "aString");
        return cachedMap;
    }
    

    如果您希望每次“更新”地图时都像在控制器中那样更新缓存,请更改您的public void updateMap(Map&lt;String, Object&gt; data)

    @CachePut(value = "map")
    public Map<String, Object> updateMap(Map<String, Object> data) {
        cachedMap.putAll(data);
        return cachedMap;
    }
    

    @CachePut 无论如何都会运行该方法的代码并将返回的结果添加到缓存中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-13
      • 2020-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-07
      • 2018-12-16
      • 1970-01-01
      相关资源
      最近更新 更多