感謝作者:https://www.jianshu.com/p/5a70b13a4fa7
本章目標
實現SpringBoot項目中整合Redis非關係數據庫作爲內存緩存框架,並測試數據讀取源。
開啓Redis
執行redis-server.exe redis.windows.conf
構建項目
添加依賴Web, MySQL, JPA, Druid, Redis, Jedis支持
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 引入Druid依賴 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.9</version>
</dependency>
<!-- 添加緩存支持 -->
<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>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
</dependency>
<!-- 添加Jedis支持 -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<!--<scope>provided</scope>-->
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
配置Redis數據庫
application.yml 配置(適用SpringBoot2)
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8
username: root
password: root
druid:
#配置控制統計攔截的filters,去掉後監控界面sql將無法統計, wall用於防火牆
filters: stat,wall
#最大活躍數
max-active: 20
#初始化數量
initial-size: 1
#最小連接池數量
min-idle: 1
#最大連接等待超時時間
max-wait: 60000
#打開PSCache,並且指定每個連接PSCache的大小,mysql可以配置爲false
pool-prepared-statements: false
max-pool-prepared-statement-per-connection-size: 20
#通過connectionProperties屬性來打開mergeSql功能;慢SQL記錄
connection-properties: druid.stat.mergeSql=true;stat.slowSqlMillis=5000
#配置間隔多久才進行一次檢測,檢測需要關閉的空閒連接,單位是毫秒
time-between-eviction-runs-millis: 60000
#配置一個連接在池中最小生存的時間,單位是毫秒
min-evictable-idle-time-millis: 300000
#用來檢測連接是否有效的sql
validation-query: SELECT 'x'
test-while-idle: true
test-on-borrow: false
test-on-return: false
async-init: true
jpa:
properties:
hibernate:
show_sql: true
format_sql: true
#配置redis數據庫連接
redis:
host: 127.0.0.1
port: 6379
jedis:
pool:
#最大連接數
max-active: 8
#最大阻塞等待時間(負數表示沒限制)
max-wait: -1ms
#最大空閒
max-idle: 8
#最小空閒
min-idle: 0
#連接超時時間
timeout: 10000ms
#數據庫索引
database: 0
配置CacheManager
讓SpringBoot內置的緩存框架適用我們的Redis作爲新的緩存, 添加一個RedisConfiguration的配置類,
SpringBoot2 略有不同, 具體配置如下:
/**
* @author Ray
* @date 2018/6/29 0029
* 讓SpringBoot內置的緩存框架使用我們的Redis作爲新的緩存
* 使用@EnableCaching註解來開啓我們的項目支持緩存
*/
@Configuration
@EnableCaching
public class RedisConfiguration {
/**
* 採用RedisCacheManager作爲緩存管理器
* 爲了處理高可用Redis,可以使用RedisSentinelConfiguration來支持Redis Sentinel。
*/
@Bean
public CacheManager cacheManager(RedisConnectionFactory connectionFactory){
RedisCacheManager redisCacheManager = RedisCacheManager.builder(connectionFactory).build();
return redisCacheManager;
}
}
測試Redis(一)
訪問地址: http://localhost:8080/list
再次訪問地址: http://localhost:8080/list
可以看到只有一次輸出, 這個輸出還是我們上次訪問的時候執行的, 證明我們配置的Redis緩存已經生效.
自定義Key
修改RedisConfiguration配置類, 繼承CachingConfigurerSupport類, 並重寫方法keyGenerator()
/**
* @author Ray
* @date 2018/6/29 0029
* 讓SpringBoot內置的緩存框架使用我們的Redis作爲新的緩存
*/
@Configuration
@EnableCaching
public class RedisConfiguration extends CachingConfigurerSupport {
/**
* 採用RedisCacheManager作爲緩存管理器
* 添加spring-data-redis依賴
* 爲了處理高可用Redis,可以使用RedisSentinelConfiguration來支持Redis Sentinel。
*/
@Bean
public CacheManager cacheManager(RedisConnectionFactory connectionFactory){
RedisCacheManager redisCacheManager = RedisCacheManager.builder(connectionFactory).build();
return redisCacheManager;
}
/**
* 自定義生成key的規則
*/
@Override
public KeyGenerator keyGenerator() {
return new KeyGenerator() {
@Override
public Object generate(Object o, Method method, Object... objects) {
// 格式化緩存key字符串
StringBuilder stringBuilder = new StringBuilder();
// 追加類名
stringBuilder.append(o.getClass().getName());
// 追加方法名
stringBuilder.append(method.getName());
// 遍歷參數並且追加
for (Object obj :
objects) {
stringBuilder.append(obj.toString());
}
System.out.println("調用Redis緩存Key: " + stringBuilder.toString());
return stringBuilder.toString();
}
};
}
}
再次訪問地址: http://localhost:8080/list