springboot使用Jedis
在springboot2.X版本后,默认使用的的redis客户端是Lettuce,如果项目中想要使用jedis,需要先把Lettuce依赖去掉,一般如下步骤
- 1.pom引入依赖
- 引入
spring-boot-starter-data-redis
- 排除
lettuce-core
- 引入
jedis
- 引入
- 2.编写RedisConfig
- 注入Jedis相关类,如
JedisPoolConfig
,RedisStandaloneConfiguration
,JedisConnectionFactory
,RedisTemplate
- 注意序列化问题
- 在创建
RedisTemplate
的时,如果项目使用比较简单,redis存储的是字符串,可以直接使用StringRedisTemplate
,它用的是字符串的序列化器,如果redis想存储对象,则需要其他的序列化反序列化器,下面代码例子使用的是一个json的序列化器Jackson2JsonRedisSerializer
- 在创建
- 注入Jedis相关类,如
- 3.使用
pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>${springframework.version}</version>
<!-- 如果使用jedis,则去掉默认的lettuce,再引入redis client-->
<exclusions>
<exclusion>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.3.0</version>
</dependency>
RedisConfig.java
@Component
public class RedisConfig {
@Autowired
RedisProperties redisProperties;
@Value("${spring.jedis.pool.max-idle:25}")
private int maxIdle;
@Value("${spring.jedis.pool.min-idle:10}")
private int minIdle;
@Value("${spring.jedis.pool.max-active:25}")
private int maxActive;
@Value("${spring.jedis.pool.max-wait:-1}")
private int maxWait;
@Bean
public JedisPoolConfig jedisPoolConfig(){
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxIdle(maxIdle);
jedisPoolConfig.setMinIdle(minIdle);
jedisPoolConfig.setMaxTotal(maxActive);
jedisPoolConfig.setMaxWaitMillis(maxWait);
return jedisPoolConfig;
}
@Bean
public RedisStandaloneConfiguration redisStandaloneConfiguration(){
RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
redisStandaloneConfiguration.setHostName(redisProperties.getHost());
redisStandaloneConfiguration.setPort(redisProperties.getPort());
if (!StringUtils.isEmpty(redisProperties.getPassword())) {
redisStandaloneConfiguration.setPassword(RedisPassword.of(redisProperties.getPassword()));
}
return redisStandaloneConfiguration;
}
@Bean
public JedisConnectionFactory jedisConnectionFactory(
JedisPoolConfig jedisPoolConfig, RedisStandaloneConfiguration redisStandaloneConfiguration){
JedisClientConfiguration.JedisClientConfigurationBuilder jedisClientConfiguration = JedisClientConfiguration.builder();
jedisClientConfiguration.connectTimeout(redisProperties.getTimeout());
jedisClientConfiguration.usePooling();
jedisClientConfiguration.clientName("test");
JedisClientConfiguration.JedisPoolingClientConfigurationBuilder builder = (JedisClientConfiguration.JedisPoolingClientConfigurationBuilder) JedisClientConfiguration.builder();
builder.poolConfig(jedisPoolConfig);
JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(redisStandaloneConfiguration,builder.build());
return jedisConnectionFactory;
}
@Bean
public RedisTemplate redisTemplate(JedisConnectionFactory redisConnectionFactory){
//spring默认自动注入了LettuceConnectionFactory,我们可以直接获取,或自己创建JedisConnectionFactory
// StringRedisTemplate template = new StringRedisTemplate(redisConnectionFactory);
RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
template.setConnectionFactory(redisConnectionFactory);
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;
}
}
RedisTest测试类
@SpringBootTest(classes = {DevelopApplication.class})
public class RedisTest {
@Autowired
RedisTemplate<String,Object> redisTemplate;
@Test
void create() {
/**
* 对象
* 127.0.0.1:6379> get apple
* "[\"com.cxy.develop.test.Apple\",{\"name\":\"asd\"}]"
*/
// redisTemplate.opsForValue().set("apple", new Apple("asd"));
/**
* 字符串
* 127.0.0.1:6379> get str
* "\"str\""
*/
// redisTemplate.opsForValue().set("str", "str");
/**
* list
* 127.0.0.1:6379> get list
* "[\"java.util.ArrayList\",[1,3]]"
*/
List<Integer> asd = new ArrayList<>();
asd.add(1);
asd.add(3);
redisTemplate.opsForValue().set("list", asd);
System.out.println("");
}
@Test
void get() {
// Object apple = redisTemplate.opsForValue().get("apple");
Object apple = redisTemplate.opsForValue().get("str");
System.out.println("");
}
}
application.yml
...
spring:
redis:
host: 127.0.0.1
port: 6379
password: 123456
timeout: 5000
jedis:
pool:
max-idle: 25
min-idle: 10
max-active: 50
max-wait: -1
...
参考文章
- https://blog.csdn.net/wangpf2011/article/details/106451782
- https://blog.csdn.net/guyue35/article/details/107381429
- https://blog.csdn.net/pan_junbiao/article/details/108871103