当在服务中更改时,Spring Cache将更新缓存的值

我有一个缓存的存储库方法,该方法返回宏。我在服务中使用该存储库,以获取宏并将键{username}替换为当前用户的名称。

例如,假设我有一个另存为Hi,{username}的宏。当用户Foo登录时,该服务将Hi,Foo替换为宏。

我面临的问题是缓存值正在使用替换后的宏进行更新。因此,用户Bar看到的是Hi,Foo而不是Hi,Bar,因为{username}键已经消失了。

我不希望在服务更改宏时替换缓存值。我想出了这些解决方案:

  • 创建MacroWrapper类并使用@Query("select new MacroWrapper(m) from Macro m where m.type = ?1");
  • 在替换用户名之前先克隆“宏”列表。

但是我想知道是否有一种更简单的方法?

存储库:

@Repository
@CacheConfig(cacheNames = "macros")
public interface MacroRepository extends JpaRepository<Macro,Long> {
  @Cacheable
  List<Macro> findByType(MacroType type);

  @CacheEvict(value = "macros",allEntries = true)
  <S extends Macro> save(S macro);
}

服务

@Service
public MacroService {
  @Autowired
  private MacroRepository repository;

  public List<Macro> getMacros(MacroType type,String username) {
    return repository.findByType(type).stream()
        .map(macro -> macro.setRemark(text.replace("{username}",username)))
        .collect(Collectors.toList());
  }
}
yuyunc1 回答:当在服务中更改时,Spring Cache将更新缓存的值

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/2564654.html

大家都在问