美文网首页Persistence
Spring 缓存——@Cacheable

Spring 缓存——@Cacheable

作者: 东方一号蓝 | 来源:发表于2016-10-21 17:40 被阅读134次

    原创性声明:本文完全为笔者原创,请尊重笔者劳动力。转载务必注明原文地址。

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

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

    2. @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方法前先去缓存里看是否有相应的数据,有,则不会执行方法。没有,才执行。

    相关文章

      网友评论

      • 3e078c0cb593:有一点没明白,这里的value就是自己取得一个变量名字是吗?然后spring会把这个结果值保存在该变量对应的内存区域。也就是java虚拟机主动开辟一块内存。这么理解不知道对不对。
        3e078c0cb593:@东方一号蓝 谢谢:sparkling_heart:
        东方一号蓝:可以这么理解,他就是一个简单的局部变量而已

      本文标题:Spring 缓存——@Cacheable

      本文链接:https://www.haomeiwen.com/subject/xtrcuttx.html