SpringBoot整合Druid、Redis的示例详解

网友投稿 344 2022-08-29


SpringBoot整合Druid、Redis的示例详解

目录1.整合Druid1.1Druid简介1.2添加上 Druid 数据源依赖1.3使用Druid 数据源 2.整合redis2.1添加上 redis依赖2.2yml添加redis配置信息 2.3 redis 配置类

1.整合Druid

1.1Druid简介

java程序很大一部分要操作数据库,为了提高性能操作数据库的时候,又不得不使用数据库连接池。

Druid 是阿里巴巴开源平台上一个数据库连接池实现,结合了 C3P0、DBCP 等 DB 池的优点,同时加入了日志监控。

Druid 可以很好的监控 DB 池连接和 SQL 的执行情况,天生就是针对监控而生的 DB 连接池。

1.2添加上 Druid 数据源依赖

com.alibaba

druid-spring-boot-starter

1.2.8

1.3使用Druid 数据源

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

测试一下看是否成功!

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());

}

}

打印结果

2.整合redis

2.1添加上 redis依赖

org.springframework.boot

spring-boot-starter-data-redis

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: 10000

2.3 redis 配置类

package com.wyy.spring.conf;

import org.springframework.cache.CacheManager;

import org.springframework.cache.annotation.CachingConfigurerSupport;

import org.springframework.cache.axckoYPuqSnnotation.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 orghttp://.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-:")

/*设置缓存过期时间*/

.entryTtl(Duration.ofHours(1))

/*禁用缓存空值,不缓存null校验*/

.disableCachingNullValues()

/*设置CacheManager的值序列化方式为json序列化,可使用加入@Class属性*/

.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(

new GenericJackson2JsonRedisSerializer()

));

/*使用RedisCacheConfiguration创建RedisCacheManager*/

RedisCacheManager manager = RedisCacheManager.builder(factory)

.cacheDefaults(cacheConfiguration)

.build();

return manager;

}

public RedisTemplate redisTemplate(RedisConnectionFactory factory) {

RedisTemplate redisTemplate = new RedisTemplate();

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) {

/* 参数之间用,进行分隔 */

if (0 != count) {

key.append(',');

}

if (param == null) {

key.append(NULL_PARAM_KEY);

} else if (ClassUtils.isPrimitiveArray(param.getClass())) {

int length = Array.getLength(param);

xckoYPuqSfor (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 一个类级别的注解,允许共享缓存的cacheNames、KeyGenerator、CacheManager 和 CacheResolver

@Cacheable 用来声明方法是可缓存的。将结果存储到缓存中以便后续使用相同参数调用时不需执行实际的方 法。直接从缓存中取值

@CachePut 标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果,而是每次都会执行该方法, 并将执行结果以键值对的形式存入指定的缓存中。

@CacheEvict 的作用 主要针对方法配置,能够根据一定的条件对缓存进行清空


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Python中双精度浮点数操作并分行显示操作实例(python输出单精度浮点数)
下一篇:Python使用TestLoader、TestSuite、HTMLTestRunner组织测试用例实例(htmltestrunner生成测试报告)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~