封面图片来自:code 2048

为频繁请求接口配置redis缓存

  1. 需要用到的pom.xml依赖:
<!--   redis缓存依赖     -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

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

  1. 完成相应的配置CachingConfig.java:
/**
* 缓存配置类
*
*/
@Configuration
@EnableCaching
public class CachingConfig {
@Bean
public RedisCacheManager redisCacheManager(RedisConnectionFactory connectionFactory){
RedisCacheWriter redisCacheWriter = RedisCacheWriter.lockingRedisCacheWriter(connectionFactory);
RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig();
redisCacheConfiguration = redisCacheConfiguration.entryTtl(Duration.ofSeconds(30));
// redisCacheWriter + redisCacheConfiguration
RedisCacheManager redisCacheManager = new RedisCacheManager(redisCacheWriter, redisCacheConfiguration);
return redisCacheManager;
}
}
  1. 在对应controller接口使用的service层(继承接口)添加如下注解:
@Override
@Cacheable(value = "listAircraftForUser")
public PageInfo listAircraftForUser(AircraftListReq aircraftListReq) {
……
}

效果图:

初次请求:

30秒内再次请求:

深入学习

Spring Cache核心主要是@Cacheable@CacheEvict,区别在于:

  1. 使用@Cacheable标记的方法在执行后Spring Cache将缓存其返回结果
  2. 使用@CacheEvict标记的方法会在方法执行前或者执行后移除Spring Cache中的某些元素

@Cacheable

@Cacheable可以标记在一个方法上,也可以标记在一个类上。

当标记在一个方法上时表示该方法是支持缓存的,当标记在一个类上时则表示该类所有的方法都是支持缓存的。

对于一个支持缓存的方法,Spring会在其被调用后将其返回值缓存起来,以保证下次利用同样的参数来执行该方法时可以直接从缓存中获取结果,而不需要再次执行该方法。

Spring在缓存方法的返回值时是以键值对进行缓存的。

就是方法的返回结果,至于键Spring又支持两种策略,默认策略自定义策略,需要注意的是当一个支持缓存的方法在对象内部被调用时是不会触发缓存功能的。

@Cacheable可以指定三个属性,value、key和condition。

@Cacheable(cacheNames = {"emp","temp"}, key="#id", condition = "#id>0", unless = "#result==null")
public Employee findEmployeeById(Integer id){
System.out.println("查询编号为 "+id+" 的员工!");
return employeeMapper.findEmployeeById(id);
}

@Cacheable几个常用属性:

  • cacheNames/value
    缓存的名字,我们将我们的缓存数据交给缓存管理器CacheManager管理,因此我们需要指定我们缓存的名字,也就是放在哪个缓存中,这样Springboot在存取缓存中的数据时候才知道要在哪个缓存中去找。
  • key
    这是一个非常重要的属性,表示我们缓存数据的键,默认使用参数名作为缓存的键,值就是我们方法的返回结果。
    当然,key的写法还支持SPEL表达式,这里的表达式可以使用方法参数及它们对应的属性。使用方法参数时我们可以直接使用**“#参数名”、“#p参数index”、”#a参数index”“参数index” **表示参数列表中第几个参数。下面是几个使用参数作为key的示例
//使用#参数名方式指定
@Cacheable(value="users", key="#id")
public User find(Integer id) {
return null;
}
//使用#p参数index方式,0就表示参数列表中的第一次参数
@Cacheable(value="users", key="#p0")
public User find(Integer id) {
return null;
}
//参数是对象的时候,我们可以使用#对象.属性方法指定
@Cacheable(value="users", key="#user.id")
public User find(User user) {
return null;
}
//即使参数是对象,我们也能用a下标或者p下标方式获取到对应参数中对应的对象
@Cacheable(value="users", key="#a0.id")
public User find(User user) {
return null;
}

其他

@CachePut:每次都会把方法的返回值序列化之后set到redis中去(每次都会执行方法),即更新这个key对应的值

@CacheEvict:从redis中把这个key删除了

参考:

  1. https://blog.csdn.net/dl962454/article/details/106480438
  2. https://blog.csdn.net/weixin_43944305/article/details/106591718