Springboot整合RedisTemplate
springboot整合redisTemplate
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<guava-version>27.0-jre</guava-version>
<jedis-version>2.9.0</jedis-version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--引入模板引擎的相关依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!-- springboot整合redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>${guava-version}</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>${jedis-version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.8.1</version>
</dependency>
</dependencies>
使用springboot-start里面默认的redis配置就可以了,当然也可以自己模仿他那样子自己配置一个也可以:
简单使用默认的:
springboot默认的RedisAutoConfiguration配置类:
/**
* {@link EnableAutoConfiguration Auto-configuration} for Spring Data's Redis support.
*
* @author Dave Syer
* @author Andy Wilkinson
* @author Christian Dupuis
* @author Christoph Strobl
* @author Phillip Webb
* @author Eddú Meléndez
* @author Stephane Nicoll
* @author Marco Aust
* @author Mark Paluch
* @since 1.0.0
*/
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(RedisOperations.class)
@EnableConfigurationProperties(RedisProperties.class)
@Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class })
public class RedisAutoConfiguration {
@Bean
@ConditionalOnMissingBean(name = "redisTemplate")
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory)
throws UnknownHostException {
RedisTemplate<Object, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
@Bean
@ConditionalOnMissingBean
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory)
throws UnknownHostException {
StringRedisTemplate template = new StringRedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
}
配置文件查看这个类RedisProperties:
spring:
redis:
database: 0
host: 127.0.0.1
password:
port: 6379
jedis:
pool:
max-active: 200
max-wait: -1
max-idle: 10
min-idle: 0
timeout: 1000
直接使用StringRedisTemplate即可:
当然也可以自己按照他们那样的配也是可以的:
在整合的时候,我想起来,以前都是配置连接池,后来都是直接配置RedisConnectionFactory,然后试了一下,加入没有jedis的pom配置,会报如下错误:
Caused by: org.springframework.beans.factory.BeanCreationException:
Error creating bean with name ‘taskConnectionFactory’ defined in class
path resource [net/rdd/config/TaskServiceConfig.class]: Bean
instantiation via factory method failed; nested exception is
org.springframework.beans.BeanInstantiationException: Failed to
instantiate
[org.springframework.data.redis.connection.RedisConnectionFactory]:
Factory method ‘taskConnectionFactory’ threw exception; nested
exception is java.lang.NoClassDefFoundError:
org/apache/commons/pool2/impl/GenericObjectPoolConfig
尽管试了一下,发现必须要配置jedis的配置,然后看了一下源码:发现factory内部是维护了一个连接池,后期整理一下;
然后是连接的配置类:
package net.rdd.config;
import net.rdd.listener.RedisMessageListener;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.ClassPathResource;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.RedisPassword;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.data.redis.core.script.RedisScript;
import org.springframework.data.redis.listener.PatternTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.scripting.support.ResourceScriptSource;
@Configuration
public class RedisServiceConfig {
@Value("${redis.task.host}")
private String redisHost;
@Value("${redis.task.port}")
private int redisPort;
@Value("${redis.task.pass}")
private String redisPass;
@Value("${redis.task.db}")
private int redisDb;
@Bean
@Primary
public RedisConnectionFactory taskConnectionFactory() {
JedisConnectionFactory connectionFactory = new JedisConnectionFactory();
connectionFactory.setPort(redisPort);
connectionFactory.setHostName(redisHost);
connectionFactory.setDatabase(redisDb);
connectionFactory.setPassword(redisPass);
return connectionFactory;
}
@Bean
public RedisTemplate taskRedisTemplate() {
RedisTemplate template = new StringRedisTemplate();
template.setConnectionFactory(taskConnectionFactory());
return template;
}
@Bean
public RedisConnectionFactory rddConnectionFactory() {
// 推荐使用
RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
redisStandaloneConfiguration.setPort(redisPort);
redisStandaloneConfiguration.setHostName(redisHost);
redisStandaloneConfiguration.setDatabase(3);
redisStandaloneConfiguration.setPassword(RedisPassword.of(redisPass));
JedisConnectionFactory redisStandaloneConfigurationFactory = new JedisConnectionFactory(redisStandaloneConfiguration);
// JedisConnectionFactory connectionFactory = new JedisConnectionFactory();
// connectionFactory.setPort(redisPort);
// connectionFactory.setHostName(redisHost);
// connectionFactory.setDatabase(3);
// connectionFactory.setPassword(redisPass);
//
//todo something wrong
/**
* org.springframework.data.redis.RedisConnectionFailureException: Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
*/
// JedisShardInfo jedisShardInfo = new JedisShardInfo(redisHost,redisPort );
// jedisShardInfo.setConnectionTimeout(10000);
// jedisShardInfo.setSoTimeout(10000);
// jedisShardInfo.setPassword(redisPass);
// JedisConnectionFactory jedisShardInfoFactory = new JedisConnectionFactory(jedisShardInfo);
return redisStandaloneConfigurationFactory;
}
@Bean("rddRedisTemplate")
public StringRedisTemplate rddRedisTemplate() {
StringRedisTemplate template = new StringRedisTemplate();
template.setConnectionFactory(rddConnectionFactory());
// RedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
// RedisSerializer stringRedisSerializer = new StringRedisSerializer();
// // key 的序列化采用 StringRedisSerializer
// template.setKeySerializer(stringRedisSerializer);
// template.setHashKeySerializer(stringRedisSerializer);
// // value 值的序列化采用 GenericJackson2JsonRedisSerializer
// template.setValueSerializer(genericJackson2JsonRedisSerializer);
// template.setHashValueSerializer(genericJackson2JsonRedisSerializer);
return template;
}
@Bean
public RedisScript<Boolean> lockScript() {
DefaultRedisScript<Boolean> redisScript = new DefaultRedisScript<Boolean>();
redisScript.setScriptSource(new ResourceScriptSource(new ClassPathResource("lua/redis-lock.lua")));
redisScript.setResultType(Boolean.class);
return redisScript;
}
@Bean
public RedisScript<Boolean> unlockScript() {
DefaultRedisScript<Boolean> redisScript = new DefaultRedisScript<Boolean>();
redisScript.setScriptSource(new ResourceScriptSource(new ClassPathResource("lua/redis-unlock.lua")));
redisScript.setResultType(Boolean.class);
return redisScript;
}
@Bean
//key过期监听,指定数据库
RedisMessageListenerContainer keyExpirationListenerContainer(RedisMessageListener listener) {
RedisMessageListenerContainer listenerContainer = new RedisMessageListenerContainer();
listenerContainer.setConnectionFactory(taskConnectionFactory());
listenerContainer.addMessageListener(listener, new PatternTopic("__keyevent@" + redisDb + "__:expired"));
return listenerContainer;
}
}
然后具体使用,注入对应的类就好了:
@Autowired
@Qualifier(value = "taskRedisTemplate")
private RedisTemplate taskRedisTemplate;
@Autowired
@Qualifier(value = "rddRedisTemplate")
private RedisTemplate rddRedisTemplate;
@Test
public void test02() {
taskRedisTemplate.opsForValue().set("dssd","fdsfds");
rddRedisTemplate.opsForValue().set("322","ewew");
}
这样,简单的配置就好了.源码参考地址:https://github.com/stackXu/SpringBootRedis