SpringBoot整合Druid、Redis的示例詳解
1.整合Druid
1.1Druid簡(jiǎn)介
Java程序很大一部分要操作數(shù)據(jù)庫(kù),為了提高性能操作數(shù)據(jù)庫(kù)的時(shí)候,又不得不使用數(shù)據(jù)庫(kù)連接池。
Druid 是阿里巴巴開(kāi)源平臺(tái)上一個(gè)數(shù)據(jù)庫(kù)連接池實(shí)現(xiàn),結(jié)合了 C3P0、DBCP 等 DB 池的優(yōu)點(diǎn),同時(shí)加入了日志監(jiān)控。
Druid 可以很好的監(jiān)控 DB 池連接和 SQL 的執(zhí)行情況,天生就是針對(duì)監(jiān)控而生的 DB 連接池。
1.2添加上 Druid 數(shù)據(jù)源依賴
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.8</version>
</dependency>1.3使用Druid 數(shù)據(jù)源
server:
port: 8080
spring:
datasource:
druid:
url: jdbc:mysql://localhost:3306/eshop?useSSL=false&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&allowPublicKeyRetrieval=true
username: xxx
password: xxx
driver-class-name: com.mysql.cj.jdbc.Driver
initial-size: 10
max-active: 20
min-idle: 10
max-wait: 60000
time-between-eviction-runs-millis: 60000
min-evictable-idle-time-millis: 300000
stat-view-servlet:
enabled: true
login-username: admin
login-password: 1234
logging:
level:
com.wyy.spring.Dao: debug測(cè)試一下看是否成功!
package com.wyy.spring;
import com.wyy.spring.Dao.StudentMapper;
import com.wyy.spring.service.StudentService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import javax.sql.DataSource;
@SpringBootTest
class SpringBoot04ApplicationTests {
@Autowired
DataSource dataSource;
@Test
void contextLoads() {
System.out.println(dataSource.getClass());
}
}打印結(jié)果

2.整合redis
2.1添加上 redis依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>2.2yml添加redis配置信息
redis:
database: 0
host: 120.0.0.0
port: 6379
password: xxxx
jedis:
pool:
max-active: 8
max-wait: -1
max-idle: 8
min-idle: 0
timeout: 100002.3 redis 配置類
package com.wyy.spring.conf;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
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.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.util.ClassUtils;
import java.lang.reflect.Array;
import java.lang.reflect.Method;
import java.time.Duration;
@Configuration
@EnableCaching
public class RedisConfiguration extends CachingConfigurerSupport {
@Bean
@Primary
/**
* 緩存管理器
*/
CacheManager cacheManager(RedisConnectionFactory factory) {
RedisCacheConfiguration cacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
.computePrefixWith(cacheName -> cacheName + ":-cache-:")
/*設(shè)置緩存過(guò)期時(shí)間*/
.entryTtl(Duration.ofHours(1))
/*禁用緩存空值,不緩存null校驗(yàn)*/
.disableCachingNullValues()
/*設(shè)置CacheManager的值序列化方式為json序列化,可使用加入@Class屬性*/
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(
new GenericJackson2JsonRedisSerializer()
));
/*使用RedisCacheConfiguration創(chuàng)建RedisCacheManager*/
RedisCacheManager manager = RedisCacheManager.builder(factory)
.cacheDefaults(cacheConfiguration)
.build();
return manager;
}
public RedisTemplate redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
redisTemplate.setConnectionFactory(factory);
RedisSerializer stringSerializer = new StringRedisSerializer();
/* key序列化 */
redisTemplate.setKeySerializer(stringSerializer);
/* value序列化 */
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
/* Hash key序列化 */
redisTemplate.setHashKeySerializer(stringSerializer);
/* Hash value序列化 */
redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
redisTemplate.afterPropertiesSet();
return redisTemplate;
@Override
public KeyGenerator keyGenerator() {
return (Object target, Method method, Object... params) -> {
final int NO_PARAM_KEY = 0;
final int NULL_PARAM_KEY = 53;
StringBuilder key = new StringBuilder();
/* Class.Method: */
key.append(target.getClass().getSimpleName())
.append(".")
.append(method.getName())
.append(":");
if (params.length == 0) {
return key.append(NO_PARAM_KEY).toString();
}
int count = 0;
for (Object param : params) {
/* 參數(shù)之間用,進(jìn)行分隔 */
if (0 != count) {
key.append(',');
}
if (param == null) {
key.append(NULL_PARAM_KEY);
} else if (ClassUtils.isPrimitiveArray(param.getClass())) {
int length = Array.getLength(param);
for (int i = 0; i < length; i++) {
key.append(Array.get(param, i));
key.append(',');
}
} else if (ClassUtils.isPrimitiveOrWrapper(param.getClass()) || param instanceof String) {
key.append(param);
} else {
/*JavaBean一定要重寫hashCode和equals*/
key.append(param.hashCode());
count++;
return key.toString();
};
}@CacheConfig 一個(gè)類級(jí)別的注解,允許共享緩存的cacheNames、KeyGenerator、CacheManager 和 CacheResolver
@Cacheable 用來(lái)聲明方法是可緩存的。將結(jié)果存儲(chǔ)到緩存中以便后續(xù)使用相同參數(shù)調(diào)用時(shí)不需執(zhí)行實(shí)際的方 法。直接從緩存中取值
@CachePut 標(biāo)注的方法在執(zhí)行前不會(huì)去檢查緩存中是否存在之前執(zhí)行過(guò)的結(jié)果,而是每次都會(huì)執(zhí)行該方法, 并將執(zhí)行結(jié)果以鍵值對(duì)的形式存入指定的緩存中。
@CacheEvict 的作用 主要針對(duì)方法配置,能夠根據(jù)一定的條件對(duì)緩存進(jìn)行清空
到此這篇關(guān)于SpringBoot整合Druid、Redis的文章就介紹到這了,更多相關(guān)SpringBoot整合Druid、Redis內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java隨機(jī)數(shù)生產(chǎn)算法實(shí)例
下面小編就為大家?guī)?lái)一篇java隨機(jī)數(shù)生產(chǎn)算法實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10
Java函數(shù)式編程(三):列表的轉(zhuǎn)化
這篇文章主要介紹了Java函數(shù)式編程(二):列表的轉(zhuǎn)化,lambda表達(dá)式不僅能幫助我們遍歷集合,并且可以進(jìn)行集合的轉(zhuǎn)化,需要的朋友可以參考下2014-09-09
Mybatis-plus多租戶項(xiàng)目實(shí)戰(zhàn)進(jìn)階指南
多租戶是一種軟件架構(gòu)技術(shù),在多用戶的環(huán)境下共有同一套系統(tǒng),并且要注意數(shù)據(jù)之間的隔離性,下面這篇文章主要給大家介紹了關(guān)于Mybatis-plus多租戶項(xiàng)目實(shí)戰(zhàn)進(jìn)階的相關(guān)資料,需要的朋友可以參考下2022-02-02
Idea的Generate Sources無(wú)法生成QueryDSL問(wèn)題及解決方法
這篇文章主要介紹了解決Idea的Generate Sources無(wú)法生成QueryDSL問(wèn)題,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02
Springboot集成mybatis實(shí)現(xiàn)多數(shù)據(jù)源配置詳解流程
在日常開(kāi)發(fā)中,若遇到多個(gè)數(shù)據(jù)源的需求,怎么辦呢?通過(guò)springboot集成mybatis實(shí)現(xiàn)多數(shù)據(jù)源配置,簡(jiǎn)單嘗試一下,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
Spring?Boot超大文件上傳實(shí)現(xiàn)秒傳功能
這篇文章主要介紹了Spring?Boot超大文件上傳實(shí)現(xiàn)秒傳功能,在實(shí)現(xiàn)分片上傳的過(guò)程,需要前端和后端配合,比如前后端的上傳塊號(hào)的文件大小,前后端必須得要一致,否則上傳就會(huì)有問(wèn)題,需要的朋友可以參考下2022-12-12

