Spring 缓存——@Cacheable

@Cacheable 是一个既可以应用于方法级别,也可用于类级别的注解。自spring3.1开始就通过它实现了缓存管理。

@Cacheable能干什么?
为了通俗易懂的理解,举个栗子:
一个方法,getBooksByUsernameAndLanguage(String username, int language),显然,是一个获取数据库里所有我的英文书对象的方法,返回应该是一个列表。如果这个函数的返回值很大,而且会在页面上被经常调用,那么每一次调用都要重新连接数据库并返回一个数据量庞大的list,可能页面响应和资源占用会比较大。而我们希望的是,第一次调用这个方法时,返回的数据能被放到服务器端的缓存里,以便于后面要调用这个方法时,能直接从缓存里取到,这样就不用再查数据库占用资源了。而@Cacheable的作用就是这个。

@Cacheable怎么用?
举个栗子(我就喜欢直接上代码,简单粗暴):

@Cacheable(value = "CACHE_BOOK",key = "#username", condition = "#language = 1")
public List<Book> getBooksByUsernameAndLanguage(String username, int language) {
    
    
     // balabalabala...里面的代码不重要
     return bookList;
}

看code,@Cacheable注解只有三个属性。

value : 必须要的。就是个自己取的名字,通过它指明了第一次调用这个方法时返回的bookList将被存在内存的哪里。

key : 可选。要使用SpEL表达式,这里与参数username对应,当传入的username值变了的话就不去取缓存里的数据了,而是执行getBooksByUsernameAndLanguage方法。(这是必须的,因为username变了,返回值也就变了,缓存里的数据不符合了,因此这个选项很重要)。spring默认用方法的签名来当做key。

condition:方法返回的结果bookList,要不要缓存起来?condition就添加了一个限定条件。这个例子中,只有传入的语言代码是1,返回的bookList才会被缓存起来,如果给language传了别的值,那么bookList是不会缓存起来的。
下次再遇到页面刷新后数据还不更新的问题时,记得看看是不是@Cacheable搞的鬼。

补充: 事实上,第二次调用方法时,spring会在执行getBooksByUsernameAndLanguage方法前先去缓存里看是否有相应的数据,有,则不会执行方法。没有,才执行。

参考:Spring 缓存——@Cacheable
本地缓存解决方案-Caffeine Cache
spring cache 学习 —— @Cacheable 使用详解

猜你喜欢

转载自blog.csdn.net/qq_33697094/article/details/109336375