美文网首页开发技巧
SpringCache 集成 Redis,这才是优雅的缓存解决方

SpringCache 集成 Redis,这才是优雅的缓存解决方

作者: 腾讯码农之家 | 来源:发表于2021-01-11 15:12 被阅读0次

    缓存可以说是加速服务响应速度的一种非常有效并且简单的方式。在缓存领域,有很多知名的框架,如EhCache 、Guava、HazelCast等。

    Redis作为key-value型数据库,由于他的这一特性,Redis也成为一种流行的数据缓存工具。

    在传统方式下对于缓存的处理代码是非常臃肿的。

    例如:我们要把一个查询函数加入缓存功能,大致需要三步。

    在函数执行前,我们需要先检查缓存中是否存在数据,如果存在则返回缓存数据

    如果不存在,就需要在数据库的数据查询出来。

    最后把数据存放在缓存中,当下次调用此函数时,就可以直接使用缓存数据,减轻了数据库压力。

    那么实现上面的三步需要多少代码呢?下面是一个示例:

    上图中的红色部分都是模板代码,真正与这个函数有关的代码却只占了1/5,对于所有需要实现缓存功能的函数,都需要加上臃肿的模板代码。可谓是一种极不优雅的解决方案。

    那么如何让臃肿的代码重回清新的当初呢?

    AOP不就是专门解决这种模板式代码的最佳方案吗,幸运的是我们不需要再自己实现切面了,SpringCache已经为我们提供好了切面,我们只需要进行简单的配置,就可以重回当初了,像下面这样:

    只需要加一个注解就可以了,对于原来的代码连改都不需要改,是不是已经跃跃欲试了?

    对于配置SpringCache只需要三步:

    第一步:加入相关依赖:

    第二步:配置SpringCache,Redis连接等信息

    applicationContext-redis.xml

    redis.properties文件:

    第三步,编写Cache接口实现类

    Spring 对于缓存只是提供了抽象的接口,并且通过接口来调用功能,没有具体的实现类,所以需要我们自己实现具体的操作。

    在上面配置中可知,每个实现类都会注入一个redisTemplate实例,我们就可以通过redisTemplate来操作redis

    在配置过程中曾经出现过两次错误:

    Xxxx.ClassNotFoundException 最后发现是jar下载不完整,把maven本地仓库的对应jar包文件夹删除完从新下载就好了

    Xxxx.MethodNotFoundException 这种情况是版本不对,换成第一步中的版本就可以了

    SpringCache中常见注解的使用:

    「@Cacheable注解」

    最常用的注解,会把被注解方法的返回值缓存。工作原理是:首先在缓存中查找,如果没有执行方法并缓存结果,然后返回数据。此注解的缓存名必须指定,和cacheManager中的caches中的某一个Cache的name值相对应。可以使用value或cacheNames指定。

    如果没有指定key属性,spring会使用默认的主键生成器产生主键。也可以自定义主键,在key中可以使用SpEL表达式。如下:

    可以使用condition属性,来给缓存添加条件,如下:

    「@CachePut注解」

    先执行方法,然后将返回值放回缓存。可以用作缓存的更新。

    「@CacheEvict注解」

    该注解负责从缓存中显式移除数据,通常缓存数据都有有效期,当过期时数据也会被移除。

    此注解多了两个属性:

    allEntries是否移除所有缓存条目。

    beforeInvocation:在方法调用前还是调用后完成移除操作。true/false

    相关文章

      网友评论

        本文标题:SpringCache 集成 Redis,这才是优雅的缓存解决方

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