了解春靴中的Redis

cclgggtu  于 2022-10-08  发布在  Redis
关注(0)|答案(2)|浏览(144)

我有一个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的第一个缓存中的数据执行查询。

dbf7pr2w

dbf7pr2w1#

你的问题的答案

1.Redis避免调用DB,因为它会将您的响应存储在内存中。您甚至可以在控制器或服务中使用@cacheable。如果您在控制器中使用@cacheable,则您的请求甚至不会执行控制器方法(如果它已经被缓存)。
1.对于FindByName,Redis提供了一种很好的基于键的数据存储方式。请参阅链接Cache Keys。一旦您按名称请求,它将从DB获取数据,下次您使用相同的名称请求时,它将基于键从缓存中获取数据。回到你的问题,你不应该对你的缓存数据进行搜索,因为缓存的波动性很大,你不能信任来自缓存的数据。此外,搜索缓存数据可能会影响性能,您可能需要编写多行不需要的附加代码。

holgip5t

holgip5t2#

Spring Boot按应用或按服务管理缓存。当您使用服务或应用程序的多个示例时,您肯定会希望集中管理缓存。因为每服务缓存在这种情况下是不可用的,因为一个应用程序在自己的Spring Boot中缓存的内容在逻辑上不能被其他应用程序访问。

因此,雷迪斯出现在画面中。如果您使用Redis,则每个服务示例都会连接到相同的Redis缓存,得到相同的结果。

相关问题