【发布时间】:2018-10-15 23:51:34
【问题描述】:
@Cacheable 注解如何通知数据库的变化。例如:如果我通过 @Cacheable 注释函数调用来缓存 CRUDRepository.findAll() 函数调用的结果,则结果存储在命名缓存中。然而,缓存会继续随着数据库的变化而更新。考虑下面的例子:
@Cacheable(value = "employee", key = "#id")
public Iterable<Employee> getAllEmployees(){
long startTime = System.currentTimeMillis();
Iterable<Employee> itr = employeeEntityRepository.findAll();
long stopTime = System.currentTimeMillis();
System.out.println("Time-->" + (stopTime - startTime));
return itr;
}
第一次调用这个方法需要 300 毫秒,第二次调用几乎不需要 5 毫秒,这意味着它缓存了结果集。很公平。但是现在,如果我直接在数据库中更新员工表中的记录并再次调用此方法,则会发生两件事:
- 此方法调用返回新记录。
- 该方法返回速度非常快。
这意味着缓存每次都从数据库中更新。如果结果集是从 Cache 返回的,这个 Sync 是如何工作的?
谢谢。
【问题讨论】:
-
您的代码中是否有
CachePut来更新数据库? -
没有。它甚至可以获取您通过 SQL 编辑器放入数据库的记录。
-
你的缓存什么时候过期或驱逐?
-
我发现了 Marged。问题出在钥匙上。如果我给出一个常数作为 Key(假设 100),则结果将被缓存,并且不会一次又一次地调用该方法。我想知道这种方法的可能 Key 是什么。
-
@Geek #id 来自哪里。我没有看到该方法的任何输入,它可以放置在哪里?另外,如果您找到解决方案,建议您回答自己的问题。
标签: java spring spring-boot caching