不使用 @CachePut 更新缓存

Posted

技术标签:

【中文标题】不使用 @CachePut 更新缓存【英文标题】:Cache is not updated using @CachePut 【发布时间】:2021-02-14 19:34:39 【问题描述】:

我正在研究二级 Hazelcast 缓存。缓存使用 findAll 方法工作得非常好,但是当我尝试更新现有数据或添加新数据并再次尝试使用它提供的 findAll 方法收集所有数据时旧记录没有更新一个。在这里我附上了我的代码。重点是当我尝试使用 findById 方法获取数据时,它会为我提供来自缓存本身的更新数据。我不想使用@CacheEvit。

@Override
@CachePut(cacheNames = "cache",key="#profileDTO.id")
public ProfileDTO save(ProfileDTO profileDTO) 
    log.debug("Request to save Profile : ", profileDTO);
    
    Profile profile = profileMapper.toEntity(profileDTO);
    profile = profileRepository.save(profile);
    return profileMapper.toDto(profile);


/**
 * Get all the profiles.
 *
 * @return the list of entities.
 */
@Override
@Cacheable(cacheNames = "cache")
public List<ProfileDTO> findAll() 
    log.debug("Request to get all Profiles");
    return profileRepository.findAll().stream()
        .map(profileMapper::toDto)
        .collect(Collectors.toCollection(LinkedList::new));

/**
 * Get one profile by id.
 *
 * @param id the id of the entity.
 * @return the entity.
 */
@Override
@Transactional(readOnly = true)
@Cacheable(cacheNames =  "cache" ,key = "#id")
public Optional<ProfileDTO> findOne(Long id) 
    log.debug("Request to get Profile : ", id);
    return profileRepository.findById(id)
        .map(profileMapper::toDto);

【问题讨论】:

【参考方案1】:

你没有提供完整的来源,但恐怕你把两个不同的东西混为一谈了。

一方面,有 Spring Cache。您可以使用 @Cacheable 注释对其进行配置。 Spring Cache 仅添加单个元素,而不是集合(参见相关的 GitHub issue 关闭并拒绝)。

另一方面,可以通过 Spring Boot 的application.properties(或 YAML)配置 Hibernate 二级缓存。这是一个正确配置的sample project。它允许在存储库返回的集合中缓存实体。

这两个缓存是正交的。

我建议你从等式中删除 Spring Cache,只使用 Hibernate 的二级缓存。

【讨论】:

github.com/janu2024/… ----- 这里我附上了我的完整代码。 您是否阅读了我的回答并做出了我建议的更改? Hibernate 的二级缓存属性已经设置为 true 能否请您使用我的附加代码指导我 我不明白为什么你的application.propertiesconfig 下而不是直接在src/main.resources 下。此外,您忘记提交 pom.xml 文件。 我已经提交了其中所有丢失的文件,它是一个 jhipster 项目,因此 application.properties 文件作为其结构位于 config 文件夹中。

以上是关于不使用 @CachePut 更新缓存的主要内容,如果未能解决你的问题,请参考以下文章

Spring缓存注解@Cache,@CachePut , @CacheEvict,@CacheConfig使用

Spring缓存注解@Cacheable@CacheEvict@CachePut使用

Spring Boot缓存注解@Cacheable@CacheEvict@CachePut使用

详解Spring缓存注解@Cacheable,@CachePut , @CacheEvict使用

Springboot集成Redis详细教程(缓存注解使用@Cacheable,@CacheEvict,@CachePut)

Spring Cache