springboot工程已经和方便的支持缓存cache的使用了,几个注解就可以搞定。注意,这些缓存注解是基于spring容器环境的。
本文主要实现了:使用spring的 cache缓存功能,和将缓存数据落地到redis中
// 放启动类上,开启缓存
@EnableCaching
// 放需要缓存的类上,统一设置缓存参数,简化配置@CachePut @Cacheable @CacheEvict
@CacheConfig:抽取类中的所有的公共配置
// 查询增加缓存
@Cacheable:作用于查询方法上,查询接口继续缓存。
// 删除缓存
@CacheEvict:清除缓存,适用于删除方法上。
// 修改缓存
@CachePut:调用方法,又更新缓存数据,适合用于修改方法上,修改数据内容后缓存。
pom.xml文件配置maven依赖
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-cacheartifactId>
dependency>
启动类上加 @EnableCaching启用缓存
/**
* @EnableCaching 开启springboot缓存
*/
@EnableCaching
@SpringBootApplication
public class SpaceAdminSystemApplication {
public static void main(String[] args) {
SpringApplication.run(SpaceAdminSystemApplication.class, args);
}
}
package space.godchen.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* cache 演示
* 一些缓存注解的属性说明
* cacheNames/value:用来指定缓存组件的名字
* key:缓存数据的key,同map的key。默认使用方法参数的值。
* keyCenerator:key的生成器,key和keyGenerator二选一使用 不可同时使用,一般在key=“”里直接自己指定key就可以了。
* condition: 符合指定的条件后才进行缓存操作
* unless: 符合指定的条件后不缓存,不符合时缓存。同condition相反,也可以通过返回接口进行判断。使用#result 获取方法返回结果。
* sync:是否使用异步模式。默认是方法执行完,以同步的方式将方法返回的结果存到缓存中。
*
* @author chenzhao
* @create 2022-08-24 15:57
* 类上设置后,相当于每个方法设置cacheNames
* @CacheConfig(cacheNames = "test_cache")
*/
@Slf4j
@RestController
@RequestMapping("/cache")
public class TestSpringCacheController {
/**
* 查询,增加缓存
*
* @param id
* @return
*/
@GetMapping("/getValueById/{id}")
@Cacheable(cacheNames = "test_cache", key = "#id")
public String getValueById(@PathVariable Integer id) {
String defaultValue = "默认的Value";
log.info("默认的Value:{}", defaultValue);
return defaultValue;
}
/**
* 修改,更新缓存
*
* @param id
* @param newValue
* @return
*/
@GetMapping("/putValueById/{id}/{newValue}")
@CachePut(cacheNames = "test_cache", key = "#id")
public String putValueById(@PathVariable Integer id, @PathVariable String newValue) {
log.info("ID:{},对应的Value值,更新为:{}", id, newValue);
return newValue;
}
/**
* 删除, 清除缓存
*
* @param id
* @return
*/
@GetMapping("/evictValueById/{id}")
@CacheEvict(cacheNames = "test_cache", key = "#id")
public String evictValueById(@PathVariable Integer id) {
log.info("删除ID:{}的缓存", id);
return "" + id;
}
}
springboot项目,使用spring cache 完成了。
下一步就是将缓存的数据,落地保存到redis中:
使用redis存放缓存数据
添加依赖
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-data-redisartifactId>
dependency>
启动本机redis,localhost:6379,
由于导入的maven依赖中,有redis的默认配置类,无需自己单独配置。
程序直接使用本机redis了。(此处redis未做详细配置,只要redis能用即可)
//spring-boot-starter-data-redis 包下的默认配置
package org.springframework.boot.autoconfigure.data.redis;
import java.time.Duration;
import java.util.List;
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties(
prefix = "spring.redis"
)
public class RedisProperties {
private int database = 0;
private String url;
private String host = "localhost";
private String username;
private String password;
private int port = 6379;
private boolean ssl;
private Duration timeout;
private Duration connectTimeout;
private String clientName;
private RedisProperties.ClientType clientType;
private RedisProperties.Sentinel sentinel;
private RedisProperties.Cluster cluster;
private final RedisProperties.Jedis jedis = new RedisProperties.Jedis();
private final RedisProperties.Lettuce lettuce = new RedisProperties.Lettuce();
...
}
哇塞,完成了,springboot对接redis缓存完成了。
此时,可以看到redis中的,key-value。 因为redis没有做系列化配置,此处value显示了乱码,忽略。
调用刚写的几个接口测试,就会发现缓存正常。
到这里,使用spring的 cache缓存功能,和将缓存数据落地到redis中,完成了