记录springboot2.0整合Redis做缓存
2018-11-22 本文已影响134人
simperLv
这篇文章是在学习恒宇少年的第十六章:使用Redis作为SpringBoot项目数据缓存基础上,使用springboot2.0为基础写的。
这里就不介绍Redis的安装和启动了,大家可以参考恒宇少年的文章。
添加Redis依赖
首先在pom.xml加入我们需要的依赖(由于这里我更换了公司的setting.xml,所以显示找不到包)
<!-- springboot内部缓存支持 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<!-- 添加Redis缓存支持 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-redis</artifactId>
<version>1.4.3.RELEASE</version>
</dependency>
<!--spring2.0集成redis所需common-pool2-->
<!-- 必须加上,jedis依赖此 -->
<!-- spring boot 2.0 的操作手册有标注 大家可以去看看 地址是:https://docs.spring.io/spring-boot/docs/2.0.3.RELEASE/reference/htmlsingle/-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.5.0</version>
</dependency>
配置Redis数据库
然后去application.yml中配置redis,添加到我们本地项目中
#配置redis数据库连接
spring:
redis:
host: 127.0.0.1
port: 6379
password:
jedis:
pool:
max-active: 8
max-wait: -1
max-idle: 5
min-idle: 0
timeout: 2000
database: 0
配置CacheManager
要让springboot内置缓存框架使用redis作缓存,还需要添加一个配置类RedisConfiguration,@EnableCaching注解来开启我们的项目支持缓存,然后在配置类内添加方法cacheManager(),返回值使用redis缓存管理器.由于redis自动生成的key太复杂,这里重新定义下生成规则
@Configuration
@EnableCaching
public class RedisConfiguration extends CachingConfigurerSupport {
@Bean
public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory){
RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofHours(1));//失效时间
return RedisCacheManager
.builder(RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory))
.cacheDefaults(redisCacheConfiguration).build();
}
@Override
public KeyGenerator keyGenerator() {
// 设置自动key的生成规则,配置spring boot的注解,进行方法级别的缓存,使用:进行分割,可以很多显示出层级关系
// 这里其实就是new了一个KeyGenerator对象,只是这是lambda表达式的写法,我感觉很好用,大家感兴趣可以去了解下
return (target, method, params) -> {
StringBuilder sb = new StringBuilder();
sb.append(target.getClass().getName());
sb.append(":");
sb.append(method.getName());
for (Object obj : params) {
sb.append(":" + String.valueOf(obj));
}
String rsToUse = String.valueOf(sb);
System.out.println("调用Redis缓存Key : " + rsToUse);
return rsToUse;
};
}
}
建表测试
CREATE TABLE good_infos (
tg_id int(11) NOT NULL,
tg_title varchar(50) NULL,
tg_price decimal(8,2) NULL,
tg_unit varchar(20) NULL,
tg_order varchar(255) NULL,
tg_type_id int(11) NULL,
PRIMARY KEY(tg_id)
)
GO
实体类
@Entity
@Table(name = "good_infos")
public class GoodEntity implements Serializable {
@Id
@GeneratedValue
@Column(name = "tg_id")
private Long id;
@Column(name = "tg_title")
private String title;
@Column(name = "tg_price")
private double price;
@Column(name = "tg_unit")
private String unit;
@Column(name = "tg_order")
private int order;
然后创建对应的JPA
public interface GoodJPA extends JpaRepository<GoodEntity,Long>{
}
创建对应的service
@Service
@CacheConfig(cacheNames = "good")
public class GoodService {
@Autowired
private GoodJPA goodJPA;
@Cacheable
public List<GoodEntity> list(){
return goodJPA.findAll();
}
}
创建一个controller控制器来调用
@RestController
@RequestMapping("/query")
public class QueryController {
@Autowired
private GoodService goodService;
/**
* 查询商品列表
* @return
*/
@RequestMapping("/list")
public List<GoodEntity> list(){
return goodService.list();
}
}
测试一下
图10.png查看控制台
图10.png
此时打印了查询语句,然后再次访问这个网址,会发现不会打印查询语句了。说明redis启用成功。
我们再往表中添加一条数据后保存
图11.png
然后再访问http://localhost:8080/query/list,发现依然只有3条数据
图12.png
把reids里的缓存清空一下
图13.png
再次访问,刚刚添加的数据就出来了
图14.png
结语
这篇文章是记录自己在学习springboot2.0整合redis的过程,肯定有很多不足,欢迎大佬们留言。再次感谢恒宇少年
项目地址:https://github.com/simperLv/springboot2.0,因为我学习都用的这个工程,所以很乱(扎心....)