代码实现角度

  SpringCache只需要在方法上面加上@Cacable @CacacheEvict就可以实现缓存,比较简单!
  Spring Data Redis需要修改原来的方法,加入逻辑才可以实现,相对复杂点!

存储方式角度

  Spring Cache缓存在应用内存中,应用停止,缓存丢失啦!
  Spring Data Redis缓存在Redis服务器,Redis可以持久化,缓存不会轻易丢失!

分布式角度

  Spirng Cache只支持单机应用缓存,不支持分布式
  SpringData Redis可以在分布式环境下使用

过期时间设置

  SpringCache不支持过期时间设置
  SpringDataRedis支持设置

结论:

  如果你的项目的缓存数据,不需要在分布环境下使用,且不需要持久化,可以使用SpringCache

  如果你的项目的缓存数据,需要分布式,或者需要持久态,都需要使用SpringDataRedis

SpringDataRedis 简介

  Spring-data-redis 是 spring 大家族的一部分,提供了在 srping 应用中通过简单的配置访问 redis 服务,对 reids 底层开发包(Jedis, JRedis, and RJC)进行了高度封装,$\color{red}{RedisTemplate 提供了 redis各种操作。}$

导入依赖

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

修改配置文件

修改 application.yml ,在 spring 节点下添加配置

1
2
3
4
5
spring
	redis:
		host: 192.168.2.2
		port: 6379
		database: 2 #设置存放在db2中(redis有0~15个db数据库)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
/**
* 根据 ID 查询实体
* @param id
* @return
*/
public User findById(String id) {
//先从 redis 查询出用户
User user = (User)redisTemplate.opsForValue().get("user_"+id);
//如果没有用户才从数据库查询
if(user==null){
user = userDao.findById(id).get();
//放入 redis 缓存
redisTemplate.opsForValue().set("user_"+id,user);
}
return user;
}

这样在查询的时候,就会自动将文章放入缓存

修改或删除后清除缓存

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
/**
* 修改
* @param user
*/
public void update(User user) {
redisTemplate.delete( "user_" + user.getId() );//删除缓存
userDao.save(user);
}

/**
* 删除
* @param id
*/
public void deleteById(String id) {
redisTemplate.delete( "user_" + id );//删除缓存
userDao.deleteById(id);
}

缓存过期处理

1
2
//放入 redis 缓存
redisTemplate.opsForValue().set("user_" + id, user,1, TimeUnit.DAYS);

SpringCache 简介

  Spring Cache 使用方法与 Spring 对事务管理的配置相似。Spring Cache 的核心就是对某个方法 进行缓存,其实质就是缓存该方法的返回结果,并把方法参数和结果用键值对的方式存放到 缓存中,当再次调用该方法使用相应的参数时,就会直接从缓存里面取出指定的结果进行返 回。
常用注解:
@Cacheable——-使用这个注解的方法在执行后会缓存其返回结果。
@CacheEvict——–使用这个注解的方法在其执行前或执行后移除SpringCache 中的某些元素。

在启动类上加注解

1
2
3
4
5
6
7
8
@SpringBootApplication
@EnableCaching
public class Application {
public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
	}

}

在方法上添加缓存注解

  这样当此方法第一次运行,在缓存中没有找到对应的 value 和 key,则将查询结果放入缓存。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
/**
* 根据 ID 查询实体
* @param id
* @return
*/
@Cacheable(value="user",key="#id")
public User findById(String id) {
returnUserDao.findById(id).get();
}

  当我们对数据进行删改的时候,需要更新缓存。其实更新缓存也就是清除缓存,因 为清除缓存后,用户再次调用查询方法无法提取缓存会重新查找数据库中的记录并放入 缓存。
在 userService 的 update、deleteById 方法上添加清除缓存的注解

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
/**
* 修改
* @param user
*/
@CacheEvict(value="user",key="#user.id")
public void update(User user) {
userDao.save(user);
}
/**
* 删除
* @param id
*/
@CacheEvict(value="user",key="#id")
public void deleteById(String id) {
userDao.deleteById(id);
}

开发总结

springdataredis

  1. 在pom.xml导入spring data redis的坐标
  2. 在application.yml添加redis配置
  3. 在项目使用RedisTemplate

springCache

  1. 在启动类开启SpringCache缓存功能
  2. 在需要缓存的方法使用缓存注解 @Cachable @CacheEvict