基本环境搭建

  1. 导入数据库文件

    image-20200426210138694
  2. 创建JavaBean封装数据

    image-20200426210225693
  3. 整合Mybatis操作数据库

    1. 配置数据源

      1
      2
      3
      4
      5
      6
      7
      spring.datasource.url=jdbc:mysql://localhost:3306/spring_cache
      spring.datasource.username=root
      spring.datasource.password=abc123aa
      spring.datasource.data-username=com.mysql.jdbc.Driver

      #开启驼峰命名匹配规则
      mybatis.configuration.map-underscore-to-camel-case=true
    2. 使用注解版的Mybatis

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      @Mapper
      public interface EmployeeMapper {

      @Select("SELECT * FROM employee WHERE id = #{id}")
      public Employee getEmpById(Integer id);

      @Update("UPDATE employee SET lastName=#{lastName},email=#{email},gender=#{gender},d_id=#{dId} WHERE id = #{id}")
      public void updateEmp(Employee employee);

      @Delete("DELETE employee FROM WHERE id = #{id}")
      public void deleteEmpById(Integer id);

      @Insert("INSERT INTO employee(lastName,email,gender,d_id) VALUES(#{lastName},#{email},#{gender},#{dId})")
      public void insertEmp(Employee employee);
      }
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      @MapperScan("com.atguigu.cache.mapper")		//指定需要扫描的mapper接口所在的包
      @SpringBootApplication
      @EnableCaching //开启基于注解的Cache
      public class Springboot01CacheApplication {

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

      }

开启缓存

  1. 开启基于注解的缓存 @EnableCaching

  2. 标注缓存注解

    @Cacheable将方法的运行结果进行缓存,以后再要相同的数据,直接从缓存中取,不调用方法

    ​ 几个属性:

    cacheNames/value:指定缓存组件的名字

    key:缓存数据使用的key,默认是方法的参数值

    keyGenerator:key的生成器,可以自己指定key的生成器的组件id(key和keyGenerator二选一使用) cacheManager:指定缓存管理器

    condition:指定符合条件的情况下才缓存 condition = #id > 0

    unless:与condition相反

    sync:使用异步模式

    @CacheEvict缓存清楚

    ​ 几个属性:

    key:指定要清楚的数据

    allEntries = true:指定清楚缓存中的所有数据

    beforeInvocation:缓存的清楚是否在方法执行之前进行

    @CachePut

    ​ 既调用方法,又更新缓存数据(先调用方法,将方法的结果放入缓存中

    @CacheConfig:抽取缓存的公共配置(在类上标注)

    @CacheConfig(cacheNames = "emp")

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    @Service
    public class EmployeeService {

    @Autowired
    EmployeeMapper employeeMapper;

    /**
    * 将方法的运行结果进行缓存,以后再要相同的数据,直接从缓存中获取
    * @param id
    * @return
    */
    @Cacheable(value = "emp")
    public Employee getEmp(Integer id) {
    System.out.println("查询"+id+"号员工");
    return employeeMapper.getEmpById(id);
    }

    @CachePut(value = "emp",key = "#employee.id")
    public Employee updateEmp(Employee employee) {
    System.out.println("update emp~");
    employeeMapper.updateEmp(employee);
    return employee;
    }

    @CacheEvict(value = "emp",beforeInvocation = true)
    public void deleteEmp(Integer id) {
    System.out.println("delete emp");
    employeeMapper.deleteEmpById(id);
    }
    }

原理

  1. 自动配置类:CacheAutoConfiguration

  2. 缓存的配置类:

    image-20200426212644012
  3. 默认生效的类:org.springframework.boot.autoconfigure.cache.SimpleCacheConfiguration

……

整合Redis

1.安装Redis

  • 使用docker拉取redis镜像
image-20200428132204888

​ 在拉取镜像过程中,添加国内的阿里云镜像加速器可以提高拉取速度!

1
2
3
4
5
6
7
8
9
vim /etc/docker/daemon.json

# 添加如下字段
# {
# "registry-mirrors": ["https://9cpn8tt6.mirror.aliyuncs.com"]
# }

systemctl daemon-reload
systemctl restart docker
  • 启动redis

    1
    2
    3
    4
    5
    6
    docker run -d -p 6379:6379 --name myredis redis
    # -d:后台的方式启动
    # -p:暴露端口
    # 6379:6379:将虚拟机的6379映射到容器的6379端口
    # --name myredis:起别名myredis
    # redis:要运行的镜像

    查看运行状况:

image-20200428133048477

  • 使用 Redis Desktop Manger 建立连接
image-20200428133225557

2.引入redis的starter

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

使用redis时,在RedisAutoConfiguration中注入了两个非常重要的组件:

  • RedisTemplate
  • StringRedisTemplate
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
   @Bean
@ConditionalOnMissingBean(name = "redisTemplate")
public RedisTemplate<Object, Object> redisTemplate(
RedisConnectionFactory redisConnectionFactory)
throws UnknownHostException {
RedisTemplate<Object, Object> template = new RedisTemplate<Object, Object>();
template.setConnectionFactory(redisConnectionFactory);
return template;
}

@Bean
@ConditionalOnMissingBean(StringRedisTemplate.class)
public StringRedisTemplate stringRedisTemplate(
RedisConnectionFactory redisConnectionFactory)
throws UnknownHostException {
StringRedisTemplate template = new StringRedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}

}

redis常见五大数据类型:

​ String、List、Set、Hash、ZSet(有序集合)

1
2
3
4
5
6
7
8
@AutoWired
StringRedisTemplate stringRedisTemplate;

stringRedisTemplate.opsForValue(); //字符串
stringRedisTemplate.opsForList(); //列表
stringRedisTemplate.opsForSet(); //集合
stringRedisTemplate.opsForHash(); //散列
stringRedisTemplate.opsForZSet(); //有序集合

3.配置redis

1
spring.redis.host=192.168.5.129

4.测试缓存

  • 原理:
    1. 引入redis的starter,容器中保存的是 RedisCacheManager
    2. RedisCacheManager 帮我们创建 RedisCache 来作为缓存组件
    3. RedisCache 通过 redis 操纵缓存