学习目标:
1.数据库连接池druid
2.整合redis,非注解式开发(推荐)
3.整合redis,注解式开发
一、数据库连接池druid
1.druid学习地址
https://github.com/alibaba/druid/tree/master/druid-spring-boot-starter
2.配置文件(springboot04模块)
2.1pom.xml
添加配置,不要最新的,进过测试SQL监控失效
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
2.2application.yml
mybatis:
mapper-locations: classpath:mappers/*.xml
type-aliases-package: com.hjl.springboot04.entity
logging:
level:
com.hjl.springboot04: debug
server:
port: 8080
servlet:
context-path: /springboot04
spring:
application:
name: springboot04
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
name: defaultDataSource
url: jdbc:mysql://localhost:3306/vue?useUnicode=true&characterEncoding=UTF-8
username: root
password: root
type: com.alibaba.druid.pool.DruidDataSource
druid:
#2.连接池配置
#初始化连接池的连接数量 大小,最小,最大
initial-size: 5
min-idle: 5
max-active: 20
#配置获取连接等待超时的时间
max-wait: 60000
#配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
time-between-eviction-runs-millis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
min-evictable-idle-time-millis: 30000
validation-query: SELECT 1 FROM DUAL
test-while-idle: true
test-on-borrow: true
test-on-return: false
# 是否缓存preparedStatement,也就是PSCache 官方建议MySQL下建议关闭 个人建议如果想用SQL防火墙 建议打开
pool-prepared-statements: true
max-pool-prepared-statement-per-connection-size: 20
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
filter:
stat:
merge-sql: true
slow-sql-millis: 5000
#3.基础监控配置
web-stat-filter:
enabled: true
url-pattern: /*
#设置不统计哪些URL
exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
session-stat-enable: true
session-stat-max-count: 100
stat-view-servlet:
enabled: true
url-pattern: /druid/*
reset-enable: true
#设置监控页面的登录名和密码
login-username: admin
login-password: admin
allow: 127.0.0.1
#deny: 192.168.1.100
freemarker:
cache: false
charset: utf-8
expose-request-attributes: true
expose-session-attributes: true
suffix: .ftl
template-loader-path: classpath:/templates/
resources:
static-locations: classpath:/static/**
pagehelper:
reasonable: true
supportMethodsArguments: true
page-size-zero: true
helper-dialect: mysql
http://localhost:8080/springboot04/clz/list
http://localhost:8080/springboot04/druid/
密码:admin admin
添加数据,就可以在监控平台看见
二、整合redis,非注解式开发
在SpringBoot项目的pom文件中,其驱动包的命名规则:
1.SpringBoot主动集成别人:spring-boot-starter-xxxx spring-boot-starter-wed
2.别人集成spriingboot:xxxx-spring-boot-starter mybatis-spring-boot-starter1.
1. 添加redis依赖于pom文件中
(不用添加版本,是与springboot一致的,因为springboot主redis)
<!--redis驱动包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2.application.yml中添加配置
redis:
host: 127.0.0.1
password: 123465
port: 6379
database: 1
3.redis
双击运行,安装好的运行结果如下:
与本地redis连接测试
4.新建config包,添加RedisConfig.java
package com.hjl.springboot04.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
//@Configuration 代表当前类为配置类,等价于redusconfig.xml
@Configuration
public class RedisConfig {
//@Bean 当前方法返回对象,会当成是spring组件
@Bean
public RedisTemplate<String,Object> getRedisTemplate(RedisConnectionFactory connectionFactory){
RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
//redisTemplate.afterPropertiesSet();
redisTemplate.setConnectionFactory(connectionFactory);
return redisTemplate;
}
}
5.biz层ClazzBizImpl.java
@Autowired
private RedisTemplate<String,Object> redisTemplate;
修改listPager方法
@Override
public List<Clazz> listPager(Clazz clazz, PageBean pageBean) {
List<Clazz> clzs = clazzMapper.listPager(clazz);
redisTemplate.opsForValue().set("clz:1",clzs.get(0));
redisTemplate.opsForValue().set("clzs",clzs);
// redisTemplate.opsForHash().entries()
return clzs;
}
先在缓存中查,如果没有,那就再数据库中查询到之后,存储到缓存中去
6. 重启项目
http://localhost:8080/spboot04/clz/list
三、整合redis,注解式开发
1.修改RedisConfig.java的内容
package com.hjl.springboot04.config;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import java.time.Duration;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
@EnableCaching
@Configuration
public class RedisConfig {
private final int defaultExpireTime = 600;
private final int userCacheExpireTime = 60;
private final String userCacheName = "test";
@Bean
public RedisTemplate<String,Object> getRedisTemplate(RedisConnectionFactory connectionFactory){
RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
//redisTemplate.afterPropertiesSet();
redisTemplate.setConnectionFactory(connectionFactory);
return redisTemplate;
}
@Bean
public RedisCacheManager redis(RedisConnectionFactory connectionFactory){
RedisCacheConfiguration defaultCacheConfig = RedisCacheConfiguration.defaultCacheConfig();
// 设置缓存管理器管理的缓存的默认过期时间
defaultCacheConfig = defaultCacheConfig.entryTtl(Duration.ofSeconds(defaultExpireTime))
// 设置 key为string序列化
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
// 设置value为json序列化
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()))
// 不缓存空值
.disableCachingNullValues();
Set<String> cacheNames = new HashSet<>();
cacheNames.add(userCacheName);
// 对每个缓存空间应用不同的配置
Map<String, RedisCacheConfiguration> configMap = new HashMap<>();
configMap.put(userCacheName, defaultCacheConfig.entryTtl(Duration.ofSeconds(userCacheExpireTime)));
RedisCacheManager cacheManager = RedisCacheManager.builder(connectionFactory)
.cacheDefaults(defaultCacheConfig)
.initialCacheNames(cacheNames)
.withInitialCacheConfigurations(configMap)
.build();
return cacheManager;
}
}
2.测试
2.1修改ClazzBiz.java的内容
@Cacheable(value = "redis-cache-clzs-",key = "'clzid:'+#cid")
Clazz selectByPrimaryKey(Integer cid);
2.2ClazzController添加内容
@GetMapping("/select")
@ResponseBody
public Clazz selectByPrimaryKey(Integer cid){
Clazz clazz = clazzBiz.selectByPrimaryKey(cid);
return clazz;
}
3.测试
请求http://localhost:8080/springboot04/clz/select?cid=2
查看redis中的内容
修改ClazzBiz.java的内容
@Cacheable(value = "test")
Clazz selectByPrimaryKey(Integer cid);
请求http://localhost:8080/spboot04/clz/select?cid=2
查看redis中的内容