我有一个Spring Boot应用程序,在该应用程序初始化时,我需要从一个表中获取数据。
我有一个包含以下代码的存储库:
@Repository
public interface Bookepository extends JpaRepository<Book, Integer> {
Proveedor findByName(String name);
@Cacheable("books")
List<Proveedor> findAll();
}
然后从我的服务中:
@Service
public class ServiceBooks {
public void findAll(){
booksRepo.findAll();
}
public void findByName(String name){
booksRepo.findByName(name);
}
}
然后我有一个实现CommandLineRunner的类:
@Component
public class AppRunner implements CommandLineRunner {
private final BookRepository bookRepository;
public AppRunner(BookRepository bookRepository) {
this.bookRepository = bookRepository;
}
@Override
public void run(String... args) throws Exception {
bookRepository.findAll());
}
}
因此,在这里,当应用程序初始化时,它会查询Books表并缓存结果。在应用程序内部,每次我调用find.all()时,缓存都在工作,并且我从缓存中获取数据。下面是我的两个问题:
1.关于Redis,我没有使用Redis,我正在做数据库缓存,没有任何问题。那么,Redis在什么地方适合这种方法呢?我不明白为什么每个人都在使用Redis,而缓存正在工作,而不需要其他库。
1.当我调用findByName(Name)时,有没有可能对我已经缓存的数据执行该查询?我知道我可以在该方法上有一个缓存,但每次我搜索特定的名字时,缓存都会保存数据。如果第一次搜索某个名称,它将进入数据库以查找该值。我不希望这样,我希望Spring使用我存放所有Books的第一个缓存中的数据执行查询。
2条答案
按热度按时间dbf7pr2w1#
你的问题的答案
1.Redis避免调用DB,因为它会将您的响应存储在内存中。您甚至可以在控制器或服务中使用@cacheable。如果您在控制器中使用@cacheable,则您的请求甚至不会执行控制器方法(如果它已经被缓存)。
1.对于FindByName,Redis提供了一种很好的基于键的数据存储方式。请参阅链接Cache Keys。一旦您按名称请求,它将从DB获取数据,下次您使用相同的名称请求时,它将基于键从缓存中获取数据。回到你的问题,不你不应该对你的缓存数据进行搜索,因为缓存的波动性很大,你不能信任来自缓存的数据。此外,搜索缓存数据可能会影响性能,您可能需要编写多行不需要的附加代码。
holgip5t2#
Spring Boot按应用或按服务管理缓存。当您使用服务或应用程序的多个示例时,您肯定会希望集中管理缓存。因为每服务缓存在这种情况下是不可用的,因为一个应用程序在自己的Spring Boot中缓存的内容在逻辑上不能被其他应用程序访问。
因此,雷迪斯出现在画面中。如果您使用Redis,则每个服务示例都会连接到相同的Redis缓存,得到相同的结果。