SpringBoot 系列 -- 整合 Redis 做缓存

本贴最后更新于 1727 天前,其中的信息可能已经事过景迁

一. 缓存的作用

当应用体积大了,用户量上去了,数据规模也越来越大之后,数据库查询操作将成为用户体验的瓶颈,这时使用缓存会是一个非常好的解决办法。Spring 开始从 3.1 开始就为我们提供了基于注解的缓存支持,通过注解方式低侵入地为我们的应用提供缓存支持。在 SpringBoot 中,更是以一系列自动配置的方式使我们能更加方便的使用缓存功能。

二. 几个重要的注解

名称 解释
@EnableCaching 开启缓存注解
@Cacheable 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存
@CachePut 保证方法被调用,又希望结果被缓存。
与 @Cacheable 区别在于是否每次都调用方法,常用于新增、更新
@CacheEvict 清空缓存

三. @Cacheeable/@CachePut/@CacheEvict 的几个常用参数

名称 解释 示例
value 缓存块的名称,必须指定一个 @Cacheable(value = " default ")
key 缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,
如果不指定,则缺省按照方法的所有参数进行组合
@Cacheable(value = " default ",key = " 'info' ")
@Cacheable(value = " default ",key = " #id ")
sync
(@Cacheable)
指示底层将缓存锁住,使只有一个线程可以进入计算,而其他线程堵塞,直到返回结果更新到缓存中。
可以避免缓存击穿
@Cacheable(value = " default ",sync = true)
allEntries
(@CacheEvict )
是否清空所有缓存内容,缺省为 false,如果指定为 true,则方法调用后将立即清空所有缓存 @CachEvict(value = ” default ”,allEntries = true)

四. 开始使用 -- 整合 Redis

注: 需先启动 Redis 服务器

1. 导入 Maven 包

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

2. 配置 application.yml

spring:
    redis:
      #指定Redis数据库索引,在redis-cli中使用select index切换数据库
      database: 0
      #Redis服务器地址
      host: 127.0.0.1
      #Redis连接端口,默认为 6379
      port: 6379
      #Redis连接密码,默认为空
      password:
      #连接超时时间
      timeout: 0
      #连接池
      pool:
        #最大连接数(使用负值表示没有限制)
        max-acive: 1000
        #最大阻塞等待时间
        max-wait: -1
        #最大空闲连接
        max-idle: 10
        #最小空闲连接
        min-idle: 2

3. 在启动类上开启缓存注解

@SpringBootApplication
@EnableCaching  // 开启缓存注解
public class AnimaApplication {

    public static void main(String[] args) {
        SpringApplication.run(AnimaApplication.class, args);
    }

}

4. 缓存 @Cacheable

@Cacheable 注解会先查询是否已经有缓存,有会使用缓存,没有则会执行方法并缓存。该注解还可预防缓存穿透。

    /**
     * key:可使用参数时,即 key#参数名,亦可直接使用字符串‘key’
     * sync:避免缓存击穿
     */
    @Cacheable(value = "default",key = " 'anima' + #page",sync = true)
    public ArrayList<animaInfo> getAnimaInfo(int page,int limit) {
        return animaInfoMapper.selectAnima(page,limit);
    }

注:@Cacheable 不支持设置缓存过期时间和自动更新

5. 更新 @CachePut

@CachePut 标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果,而是每次都会执行该方法,并将执行结果以键值对的形式存入指定的缓存中。

    @CachePut(value = "default",key = " 'anima' + #anima.id")
    public int save(Anima anima) {
        return animaInfoMapper.saveAnima(anima);
    }

6. 清除 @CacheEvict

allEntries 参数表示是否需要清除缓存中的所有元素。默认为 false,表示不需要。当指定了 allEntries 为 true 时,Spring Cache 将忽略指定的 key。有的时候我们需要 Cache 一下清除所有的元素。

    @CacheEvict(value = "default",allEntries = true)
    public int del(Anima anima) {
        return animaInfoMapper.delAnima(anima.id);
    }
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    941 引用 • 1458 回帖 • 150 关注
  • Redis

    Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。从 2010 年 3 月 15 日起,Redis 的开发工作由 VMware 主持。从 2013 年 5 月开始,Redis 的开发由 Pivotal 赞助。

    284 引用 • 247 回帖 • 175 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...