Java缓存优化

发布时间:2024年01月13日

缓存优化

环境配置

  • 配置yml文件中的redis
  • maven导入redis

缓存菜品数据

  • 先从redis获取数据,如果有直接返回;没有的话从数据库中找,把数据放入到redis中。
  • 更新菜品数据时(或者数据库中的数据变化时),需要清理缓存数据。

Spring Cache

  1. 在启动类中添加 @EnableCaching 注解,以开启缓存注解功能。这样可以在应用程序中使用缓存相关的注解。

  2. @Cacheable 会在方法执行前先检查缓存中是否有数据,如果有,则直接返回缓存中的数据;如果没有,则执行方法,并将方法返回值放入缓存中。

  3. @CachePut 可以将方法的返回值放入缓存中。该注解通常用于更新缓存数据的场景。

  4. @CacheEvict 可以从缓存中删除一条或多条数据。可以在需要删除缓存数据的方法上添加该注解,并指定要删除的缓存数据的键。

其它

在Spring缓存注解中,key是一个SpEL(Spring表达式语言)表达式,你可以使用#root#result在SpEL表达式中获取上下文数据。

  • #root:这是根对象,可以通过它访问到方法的各种元信息,如方法的名称(#root.methodName),方法的参数数组(#root.args)等。
  • #result:这是方法的返回结果,只能在@CachePut@CacheEvict(当beforeInvocation设为false)注解中使用。
@Cacheable(value = "books", key = "#root.methodName")
public Book findBookByIsbn(String isbn) {
    return book;
}

在这个例子中,缓存的键将会是findBookByIsbn,也就是方法的名称。

@CachePut(value = "books", key = "#isbn", condition = "#result!=null")
public Book updateBook(String isbn, Book updatedBook) {
    return updatedBook;
}

@CachePut

@CachePut是Spring框架中的一个注解,它可以用来更新缓存数据。该注解用在方法上,能确保方法被执行后,其结果会被存储在缓存中。
如果缓存中已存在相应的数据,那么@CachePut会使用新的结果更新缓存。

key 代表的是传递进来的对象,返回值作为缓存的value值

    @CachePut(value = "books", key = "#book.id")
    public Book updateBook(Book book) {
        return updatedBook;
    }

在这个示例中,@CachePut注解被用在updateBook方法上。当这个方法被调用时,它首先会更新数据库中的一本书的信息,然后将更新后的Book对象作为返回值。
@CachePut注解确保了这个更新后的Book对象会被存储在名为"books"的缓存中。缓存中的键是Book对象的id属性,值则是返回值updatedBook

使用@CachePut可以保证缓存中的数据始终与数据库中的数据保持一致。它在以下情况下非常有用:

  • 当你更改了数据库中的一条数据,并且想要立即在缓存中反映这个更改时。
  • 当你想在执行某个方法后,总是将结果存储在缓存中时。

@CacheEvict

@CacheEvict 是 Spring 框架中的一个注解,它的主要作用是在指定的缓存中删除条目,以保证缓存中的数据与数据库中的数据保持一致。

    @CacheEvict(value = "books", key = "#isbn")
    public void deleteBookByIsbn(String isbn) {
    }

在这个例子中,@CacheEvict 注解被用在 deleteBookByIsbn 方法上。当这个方法被调用的时候,它会删除数据库中的一条记录,同时也会从 “books” 这个缓存中删除相应的缓存项。

有些时候,你可能想要一次性清空整个缓存,这时候你可以使用 @CacheEvict 注解的 allEntries 属性:

    @CacheEvict(value = "books", allEntries = true)
    public void reloadAllBooks() {
    }

在这个例子中,reloadAllBooks 方法会清空 “books” 这个缓存中的所有缓存项。
需要注意的是,@CacheEvict 只会在方法成功执行后删除缓存。如果方法执行过程中抛出了异常,缓存则不会被清空或删除。

@Cacheable

@Cacheable 是 Spring 缓存注解中的一个,它用于表示某个方法的结果是可以缓存的。
当一个使用了 @Cacheable 注解的方法被调用时,Spring 会首先检查缓存中是否已经存在该方法的返回结果,如果存在,则直接返回缓存中的结果,否则,执行方法并将结果存入缓存中。

    @Cacheable(value = "books", key = "#isbn")
    public Book findBookByIsbn(String isbn) {
        return book;
    }

@Cacheable 的主要属性有:

  • value:用于指定缓存的名称。
  • key:用于指定缓存的键,可用于从方法的参数或其他可用数据中生成键。
  • condition:用于指定一个 SpEL 表达式,这个表达式用于决定是否应该缓存方法的结果。只有当表达式的值为 true 时,才会缓存结果。

需要注意的是,@Cacheable 只在方法第一次调用时执行实际的方法体,并将结果存入缓存,后续的调用直接从缓存中获取结果,不再执行实际的方法体。
如果方法的结果会因为外部因素(如数据库中的数据改变了)而改变,那么,这种改变不会反映到缓存的结果中。

当然,下面是一个使用 @Cacheable 注解的例子,其中包含了 condition 属性。condition 属性允许我们根据特定条件来决定是否缓存方法的结果。

    @Cacheable(value = "books", key = "#isbn", condition = "#isbn.length() == 13")
    public Book findBookByIsbn(String isbn) {
        return book;
    }

    @Cacheable(value = "books", key = "#isbn", condition = "#result == null")
    public Book findBookByIsbn(String isbn) {
        return book;
    }

所以,unlesscondition 两个属性有明显的使用场景差异:

  • condition 属性的 SpEL 表达式是在方法执行前评估的,适用于基于方法参数决定是否应用缓存的场景。
  • unless 属性的 SpEL 表达式是在方法执行后评估的,适用于基于方法返回结果决定是否应用缓存的场景。
文章来源:https://blog.csdn.net/weixin_61281255/article/details/135574136
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。