使用 Spring Boot Cache 结合 JPA,缓存用 Redis,下面是一个非常简单的查增服务代码,但是测试发现,只有那些在第一次触发 findAll()前就被写入缓存的记录会被返回,即使此时查看后台数据库已经添加了很多新的记录,然后每次都会命中缓存,就只有最初那条记录。
@Service@CacheConfig(cacheNames = "todoService")public class TodoServiceImpl implements TodoService { private final TodoRepository todoRepository; @Autowired public TodoServiceImpl(TodoRepository todoRepository) { this.todoRepository = todoRepository; } @Override @Cacheable(value= "allTodoCache", unless= "#result.size() == 0") public List<Todo> getAllTodos() { return todoRepository.findAll(); } @Override @CachePut(value= "allTodoCache", key= "#todo.id") public Todo save(Todo todo) { return this.todoRepository.save(todo); }}
查看 Redis 发现,虽然使用@CachePut
更新了缓存,但是最初那条记录allTodoCache::SimpleKey []
里面的 ArrayList 并没有更新,而是直接另外加了新的记录,但似乎 JPA 的 findAll()只会查看这条记录里的数组。
[ "java.util.ArrayList", [ { "@class": "com.domain.Todo", "id": 1, "content": "First Record" } ]]
所以想问下正确地在 JPA 存储新记录时更新 Redis 使得 findAll()能获取全部最新记录的方法是什么?
联系客服