Jedis是直連模式,在多個線程間共享一個Jedis實例時是線程不安全的,可以通過創建多個Jedis實例來解決,但當連接數量增多時,物理連接成本就較高同時會影響性能,因此較好的解決方法是使用JedisPool。
Lettuce的連接是基於Netty的,連接實例可以在多個線程間共享,Netty可以使多線程的應用使用同一個連接實例,而不用擔心併發線程的數量。通過異步的方式可以讓我們更好地利用系統資源。
1、Jedis集成使用
1.1、pom.xml中添加redis相關依賴
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.3</version>
</dependency>
1.2、redis配置文件
spring.redis.port=6377
spring.redis.timeout=20000
spring.redis.host=127.0.0.1
spring.redis.password=123456
# Redis數據庫索引(默認爲0)
spring.redis.database=1
# 連接池最大連接數(使用負值表示沒有限制)
spring.redis.jedis.pool.max-active=3000
# 連接池最大阻塞等待時間(使用負值表示沒有限制)
spring.redis.jedis.pool.max-wait=10000
# 連接池中的最大空閒連接
spring.redis.jedis.pool.max-idle=200
# 連接池中的最小空閒連接
spring.redis.jedis.pool.min-idle=0
# 連接超時時間(毫秒)
spring.redis.timeout=10000
1.3、RedisConfig配置及注入
@Configuration
@PropertySource("classpath:/redis/redis.properties")
public class RedisConfig {
@Bean
public JedisPool redisPoolFactory() throws Exception{
logger.info("JedisPool注入成功!!");
logger.info("redis地址:" + host + ":" + port);
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxIdle(maxIdle);
jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);
// 連接耗盡時是否阻塞, false報異常,ture阻塞直到超時, 默認true
jedisPoolConfig.setBlockWhenExhausted(blockWhenExhausted);
// 是否啓用pool的jmx管理功能, 默認true
jedisPoolConfig.setJmxEnabled(true);
JedisPool jedisPool = new JedisPool(jedisPoolConfig, host, port, timeout, password, database);
return jedisPool;
}
}
2、Lettuce集成使用
2.1、pom.xml中添加lettuce相關依賴
<!-- Redis Lettuce實現 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<!-- <version>2.1.3.RELEASE</version>-->
</dependency>
<!-- lettuce pool連接池 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
2.2、lettuce配置文件
spring.redis.host=127.0.0.1
spring.redis.port=6377
# 密碼 沒有則可以不填
spring.redis.password=123456
spring.redis.database=1
spring.redis.timeout=20000
# 如果使用的jedis 則將lettuce改成jedis即可
# 最大活躍鏈接數
spring.redis.lettuce.pool.max-active=3000
spring.redis.lettuce.pool.max-wait=10000
# 最大空閒連接數
spring.redis.lettuce.pool.max-idle=200
# 最小空閒連接數
spring.redis.lettuce.pool.min-idle=0
2.3、RedisConfig配置及注入
@Configuration
@AutoConfigureAfter(RedisAutoConfiguration.class)
public class RedisConfig {
/**
* 配置自定義redisTemplate
* @return
*/
@Bean
RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
template.setConnectionFactory(redisConnectionFactory);
//使用Jackson2JsonRedisSerializer來序列化和反序列化redis的value值
Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
serializer.setObjectMapper(mapper);
template.setValueSerializer(serializer);
//使用StringRedisSerializer來序列化和反序列化redis的key值
template.setKeySerializer(new StringRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());
template.setHashValueSerializer(serializer);
template.afterPropertiesSet();
return template;
}
}