正常一个服务连接一个redis库就是可以的, 但是如果有需要连多个数据源的时候,也得会配置
Tip: redis 连接池基于lettuce pool
<!-- redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- redis 连接池 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
spring:
# 连接池配置
redis:
timeout: 60000
lettuce:
pool:
max-active: 1024
max-idle: 100
max-wait: 30
min-idle: 20
#第一个数据源
redis:
host-name: **.**.**.**
port: 6379
database: 1
password: *****
#第二个数据源
second-redis:
host-name: **.**.**.**
port: 6379
database: 2
password: *****
#多个类似:
....
package com.fanneng.spring.config;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cache.Cache;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.interceptor.CacheErrorHandler;
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.cache.RedisCacheWriter;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.lang.NonNull;
import org.springframework.lang.NonNullApi;
import javax.validation.constraints.NotNull;
import java.time.Duration;
import java.util.Objects;
@Configuration
@Slf4j
@EnableCaching
public class RedisConfiguration extends CachingConfigurerSupport {
@Autowired
RedisConnectionFactory redisConnectionFactory;
/**
* 配置lettuce连接池
*/
@Bean
@ConfigurationProperties(prefix = "spring.redis.lettuce.pool")
public GenericObjectPoolConfig<LettucePoolingClientConfiguration> redisPool() {
return new GenericObjectPoolConfig<>();
}
/**
* 原来的数据源
*/
@Bean
@ConfigurationProperties(prefix = "spring.redis")
public RedisStandaloneConfiguration redisConfig() {
return new RedisStandaloneConfiguration();
}
/**
* 用于存储的的数据源
*/
@Bean
@ConfigurationProperties(prefix = "spring.db-redis")
public RedisStandaloneConfiguration redisDbConfig() {
return new RedisStandaloneConfiguration();
}
/**
* 配置第一个数据源的连接工厂
* 这里注意:需要添加@Primary 指定bean的名称,目的是为了创建两个不同名称的LettuceConnectionFactory
*/
@Bean("factory")
@Primary
public LettuceConnectionFactory factory(GenericObjectPoolConfig<LettucePoolingClientConfiguration> config,
RedisStandaloneConfiguration redisConfig) {
LettuceClientConfiguration clientConfiguration = LettucePoolingClientConfiguration.builder().poolConfig(config).build();
return new LettuceConnectionFactory(redisConfig, clientConfiguration);
}
@Bean("dbFactory")
public LettuceConnectionFactory dbFactory(GenericObjectPoolConfig<LettucePoolingClientConfiguration> config,
RedisStandaloneConfiguration redisDbConfig) {
LettuceClientConfiguration clientConfiguration = LettucePoolingClientConfiguration.builder().poolConfig(config).build();
return new LettuceConnectionFactory(redisDbConfig, clientConfiguration);
}
/**
* 配置第一个数据源的RedisTemplate
* 注意:这里指定使用名称=factory 的 RedisConnectionFactory
* 并且标识第一个数据源是默认数据源 @Primary
*/
@Bean("redisTemplate")
@Primary
public RedisTemplate<?, ?> redisTemplate(@Qualifier("factory") RedisConnectionFactory factory) {
return buildRedisTemplate(factory);
}
/**
* 配置第一个数据源的RedisTemplate
* 注意:这里指定使用名称=factory2 的 RedisConnectionFactory
*/
@Bean("dbRedisTemplate")
public RedisTemplate<?, ?> redisTemplate2(@Qualifier("dbFactory") RedisConnectionFactory dbFactory) {
return buildRedisTemplate(dbFactory);
}
public RedisTemplate<?, ?> buildRedisTemplate(RedisConnectionFactory factory) {
StringRedisTemplate redisTemplate = new StringRedisTemplate(factory);
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = jackson2JsonRedisSerializer();
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.setHashKeySerializer(jackson2JsonRedisSerializer);
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
private Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer() {
Jackson2JsonRedisSerializer<Object> 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);
return jackson2JsonRedisSerializer;
}
@Override
@Bean
public CacheManager cacheManager() {
RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory);
RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofDays(1))
.serializeValuesWith(RedisSerializationContext.SerializationPair
.fromSerializer(jackson2JsonRedisSerializer()));
return new RedisCacheManager(redisCacheWriter, redisCacheConfiguration);
}
@Override
@Bean
public KeyGenerator keyGenerator() {
return (target, method, params) -> {
StringBuilder sb = new StringBuilder();
sb.append(target.getClass().getName());
sb.append(":").append(method.getName()).append(":");
for (Object obj : params) {
sb.append(obj.toString());
}
return sb.toString();
};
}
@Bean
@Override
public CacheErrorHandler errorHandler() {
return new CacheErrorHandler() {
@Override
public void handleCacheGetError(@NonNull RuntimeException exception, @NonNull Cache cache, @NonNull Object key) {
log.error("handleCacheGetError key = {}, value = {}", key, cache);
log.error("cache get error", exception);
}
@Override
public void handleCachePutError(@NonNull RuntimeException exception, @NonNull Cache cache, @NonNull Object key, Object value) {
log.error("handleCachePutError key = {}, value = {}", key, cache);
log.error("cache put error", exception);
}
@Override
public void handleCacheEvictError(@NonNull RuntimeException exception, @NonNull Cache cache, @NonNull Object key) {
log.error("handleCacheEvictError key = {}, value = {}", key, cache);
log.error("cache evict error", exception);
}
@Override
public void handleCacheClearError(@NonNull RuntimeException exception, @NonNull Cache cache) {
log.error("handleCacheClearError value = {}", cache);
log.error("cache clear error", exception);
}
};
}
}
import org.springframework.data.redis.core.SetOperations;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/**
* Created by feifan.gou@gmail.com on 2019/12/30 17:30.
*/
@Service
public class TestRedisMultipleDatasource {
//使用第一个(默认)数据源
@Autowired
private RedisTemplate<String, String> redisTemplate;
//使用第二个数据源
@Resource(name = "dbRedisTemplate")
private HashOperations<String, String, Integer> hashOperations;
//也可以使用Qualifier
@Qualifier("dbRedisTemplate")
@Autowired
private SetOperations<String, Integer> setOperations;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。