spring-boot - Spring缓存EhCache | 数据不会从缓存中更新和删除
问题描述
我开始学习 Spring Cache 抽象。为此,我使用 Spring boot、Spring Data Jpa、EhCache 提供程序。
我的 ehcache.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ehcache>
<ehcache>
<diskStore path="java.io.tmpdir"/>
<defaultCache maxElementsInMemory="100"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true">
</defaultCache>
<cache name="teams"
maxElementsInMemory="500"
eternal="true"
timeToIdleSeconds="0"
timeToLiveSeconds="100"
overflowToDisk="false">
</cache>
我的服务:
@CacheConfig(cacheNames = "teams")
@Service
public class TeamService {
@Autowired
private TeamRepository teamRepository;
@Cacheable
public Team findById(long id) {
return teamRepository.findById(id).get();
}
@Cacheable
public List<Team> findAll() {
return teamRepository.findAll();
}
@CachePut
public Team save(Team team) {
return teamRepository.save(team);
}
@CacheEvict
public void delete(long id) {
teamRepository.deleteById(id);
}
}
我的控制器:
@RestController
public class TeamController {
@Autowired
private TeamService teamService;
@GetMapping("/teams")
public List<Team> getAll() {
return teamService.findAll();
}
@GetMapping("/team/{id}")
public Team getById(@PathVariable long id) {
return teamService.findById(id);
}
@DeleteMapping("/team/{id}")
public void delete(@PathVariable long id) {
teamService.delete(id);
}
@PostMapping("/team")
public Team save(@RequestBody Team team) {
return teamService.save(team);
}
}
我正在向我的控制器执行请求...
当我执行控制器的 getAll() 方法时,数据被正确缓存,然后下次不执行对数据库的查询。然后我使用控制器的相应方法更新和删除数据库中的数据,这些服务方法分别标记为@CachePut 和@CacheEvict,并且必须刷新缓存。然后我再次执行上述 getAll() 方法并获得与第一次相同的响应,但我希望在执行删除和更新请求后刷新它。
我做错了什么或如何获得预期的结果?
解决方案
当您将 @Cachable 注释放在方法上时,所有条目都将保留在缓存中,默认情况下添加一个名称,然后第一个 cachable 与第二个 cachable 不同,因此如果您想正常工作,您需要添加一个您想要的名称,例如例子:
@Cachable("teams")
@Cachable("teams")
@CachePut("teams")
@CacheEvict(value="teams", allEntries=true)
您可以在此链接中获取更多信息:https ://www.baeldung.com/spring-cache-tutorial
也许最好的解决方案是:
@Cachable("team")
@Cachable("teams")
@Caching(put = {
@CachePut(value="team"),
@CachePut(value="teams") })
@Caching(evict = {
@CacheEvict(value="team", allEntries=true),
@CacheEvict(value="teams", allEntries=true) })
推荐阅读
- mysql - MySQL的B+树上是否存储空值?
- javascript - Uncaught (in promise) ReferenceError: dispatch is not defined
- java - 无法在 Retrofit 2 中上传图片
- sqlite - 退出(n)sqlite会话的正确方法是什么?
- css - 有没有办法让自定义 CSS 按钮在背景中透明?
- php - 根据登录的帐户使用网站 cookie
- javascript - 每当用户单击标签时,我想 concole.log 记录 h2 标签的文本,当单击另一个 h2 标签时,它应该显示该 h2 标签的文本
- python - 删除s3文件也会删除文件夹python代码
- azure - 使用 Azure AD B2C 中的自定义策略在注册期间验证和验证用户输入数据
- javascript - EJS 使用 d3 图表获取的 json 数据