SpringBoot集成Redis的配置方案

pom.xml


<dependencies>


<!-- (1)开启 cache 缓存 -->

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-cache</artifactId>

</dependency>


<!-- (2)ehcache 缓存、Redis是一级缓存、ehcache是二级缓存 -->

<dependency>

<groupId>net.sf.ehcache</groupId>

<artifactId>ehcache</artifactId>

</dependency>


<!-- (3)redis -->

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-data-redis</artifactId>

</dependency>


<!-- (4)Springboot2.x以后默认情况下使用lettuce框架访问Redis,所以需要在pom.xml文件添加commons-pool2 -->

<dependency>

<groupId>org.apache.commons</groupId>

<artifactId>commons-pool2</artifactId>

</dependency>


<!-- (5)使用Guava在内存中维护一个布隆过滤器 -->

<dependency>

<groupId>com.google.guava</groupId>

<artifactId>guava</artifactId>

<version>29.0-jre</version>

</dependency>


<!-- (6)使用Guava在内存中维护一个布隆过滤器 -->

<dependency>

<groupId>mysql</groupId>

<artifactId>mysql-connector-java</artifactId>

<scope>runtime</scope>

</dependency>


<!-- MP -->

<dependency>

<groupId>com.baomidou</groupId>

<artifactId>mybatis-plus-boot-starter</artifactId>

<version>3.5.1</version>

</dependency>


<!-- spring web -->

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-web</artifactId>

</dependency>


<!-- lombok -->

<dependency>

<groupId>org.projectlombok</groupId>

<artifactId>lombok</artifactId>

<optional>true</optional>

</dependency>


<!-- junit -->

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-test</artifactId>

<scope>test</scope>

</dependency>


</dependencies>



application.yml


spring:

cache:

ehcache:

config: classpath:ehcache.xml

type: ehcache

application:

name: redis_demo

#redis数据库配置

redis:

database: 0 # Redis数据库索引(默认为0)

host: 127.0.0.1 # Redis服务器地址

#password: 123456 # Redis密码(默认没有)

port: 6379 # Redis服务器端口

lettuce:

pool:

maxActive: 8 #最大连接数

maxIdle: 8  #最大空闲连接数

minIdle: 0 #最小空闲连接数

maxWait: -1 #阻塞等待时间(负数表示没有等待)

timeout: 2000 #超时时间

datasource:

password: root

username: root

driver-class-name: com.mysql.cj.jdbc.Driver

url: jdbc:mysql://127.0.0.1:3306/db01?characterEncoding=utf-8&serverTimezone=Asia/Shanghai&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true


mybatis-plus:

mapper-locations: classpath:mapper/*.xml

configuration:

# 日志

log-impl: org.apache.ibatis.logging.stdout.StdOutImpl




配置类一:通过RedisTemplate工具类实现缓存数据库。


package com.zhaoyang.config;


import com.fasterxml.jackson.annotation.JsonAutoDetect;

import com.fasterxml.jackson.annotation.PropertyAccessor;

import com.fasterxml.jackson.databind.ObjectMapper;

import org.springframework.cache.annotation.CachingConfigurerSupport;

import org.springframework.cache.annotation.EnableCaching;

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.*;

import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;

import org.springframework.data.redis.serializer.StringRedisSerializer;


@Configuration

@EnableCaching

public class RedisConfig extends CachingConfigurerSupport {


/**

* retemplate相关配置

*

* @param factory

* @return

*/

@Bean

public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {


RedisTemplate<String, Object> template = new RedisTemplate<>();

// 配置连接工厂

template.setConnectionFactory(factory);


//使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式)

Jackson2JsonRedisSerializer jacksonSeial = new Jackson2JsonRedisSerializer(Object.class);


ObjectMapper om = new ObjectMapper();

// 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public

om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);

// 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常

om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);

jacksonSeial.setObjectMapper(om);


// 值采用json序列化

template.setValueSerializer(jacksonSeial);

//使用StringRedisSerializer来序列化和反序列化redis的key值

template.setKeySerializer(new StringRedisSerializer());


// 设置hash key 和value序列化模式

template.setHashKeySerializer(new StringRedisSerializer());

template.setHashValueSerializer(jacksonSeial);

template.afterPropertiesSet();


return template;

}



/**

* 对hash类型的数据操作

*

* @param redisTemplate

* @return

*/

@Bean

public HashOperations<String, String, Object> hashOperations(RedisTemplate<String, Object> redisTemplate) {

return redisTemplate.opsForHash();

}


/**

* 对redis字符串类型数据操作

*

* @param redisTemplate

* @return

*/

@Bean

public ValueOperations<String, Object> valueOperations(RedisTemplate<String, Object> redisTemplate) {

return redisTemplate.opsForValue();

}


/**

* 对链表类型的数据操作

*

* @param redisTemplate

* @return

*/

@Bean

public ListOperations<String, Object> listOperations(RedisTemplate<String, Object> redisTemplate) {

return redisTemplate.opsForList();

}


/**

* 对无序集合类型的数据操作

*

* @param redisTemplate

* @return

*/

@Bean

public SetOperations<String, Object> setOperations(RedisTemplate<String, Object> redisTemplate) {

return redisTemplate.opsForSet();

}


/**

* 对有序集合类型的数据操作

*

* @param redisTemplate

* @return

*/

@Bean

public ZSetOperations<String, Object> zSetOperations(RedisTemplate<String, Object> redisTemplate) {

return redisTemplate.opsForZSet();

}


}



配置类二:通过缓存注解实现缓存数据库。

 


package com.zhaoyang.config;


import com.fasterxml.jackson.annotation.JsonAutoDetect;

import com.fasterxml.jackson.annotation.PropertyAccessor;

import com.fasterxml.jackson.databind.ObjectMapper;

import org.springframework.cache.CacheManager;

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.serializer.Jackson2JsonRedisSerializer;

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.Map;



/**

* 第二中redis方案

*

* redis配置

*

*/

@Configuration

@EnableCaching

public class RedisConfig2 {



/**

* CacheManager为一个接口,RedisCacheManager为该接口的实现

* redisConnectionFactory 连接工厂

* cacheDefaults 默认配置

* @param redisConnectionFactory

* @return

*/

@Bean

public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory){

RedisCacheManager redisCacheManager = RedisCacheManager.builder(redisConnectionFactory)

.cacheDefaults(defaultCacheConfig(10000))

.withInitialCacheConfigurations(initCacheConfigMap())

.transactionAware()

.build();

return redisCacheManager;


}


/**

* 默认配置中进行了序列化的配置

* @param second

* @return

*/

private RedisCacheConfiguration defaultCacheConfig(Integer second) {

Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);


//解决查询缓存转换异常的问题

ObjectMapper om = new ObjectMapper();

om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);

om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);

jackson2JsonRedisSerializer.setObjectMapper(om);


//配置序列化 解决乱码的问题

RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()

.entryTtl(Duration.ofSeconds(second))

.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))

.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))

.disableCachingNullValues();


return config;


}


/**

* 针对不同的redis的key 有不同的过期时间

* @return

*/

private Map<String, RedisCacheConfiguration> initCacheConfigMap() {


Map<String,RedisCacheConfiguration> configMap = new HashMap<>();

configMap.put("Cache",this.defaultCacheConfig(1000));

configMap.put("Cache1",this.defaultCacheConfig(1000));

configMap.put("Cache2",this.defaultCacheConfig(1000));

configMap.put("Cache3",this.defaultCacheConfig(1000));

return configMap;

}

}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容