一、Lettuce 概述
- Spring Boot 操作 Redis 使用 spring-boot-starter-data-redis。
- 在 Spring Boot-2.x 之后,原来使用的 Jedis 被替换成 Lettuce。
- Jedis 采用的直连,多个线程操作的话,是不安全的。
如果想要避免不安全的,使用 Jedis pool 连接池 (像 BIO 模式)。 - Lettuce 采用 Netty,实例可以在多个线程中进行共享,不存在线程不安全的情况。
可以减少线程数据了 (像 NIO 模式)。
二、Lettuce 示例
1. POM
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2. application.properties
spring.redis.host=127.0.0.1
spring.redis.port=6379
3. RedisTemplate 源码
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(RedisOperations.class)
@EnableConfigurationProperties(RedisProperties.class)
@Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class })
public class RedisAutoConfiguration {
@Bean
@ConditionalOnMissingBean(name = "redisTemplate")
@ConditionalOnSingleCandidate(RedisConnectionFactory.class)
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<Object, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
@Bean
@ConditionalOnMissingBean
@ConditionalOnSingleCandidate(RedisConnectionFactory.class)
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
StringRedisTemplate template = new StringRedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
}
4. 自定义 RedisTemplate
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/eee6922b98454b67ee96ed3b1c5ef3e5.png)
@Configuration
public class RedisConfig {
@Bean
@SuppressWarnings("all")
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(connectionFactory);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
redisTemplate.setKeySerializer(stringRedisSerializer);
redisTemplate.setHashKeySerializer(stringRedisSerializer);
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}
5. SpringBootRedisApplicationTests
@SpringBootTest
class SpringBootRedisApplicationTests {
@Autowired
@Qualifier("redisTemplate")
private RedisTemplate redisTemplate;
@Test
void contextLoads() {
RedisConnection redisConnection = redisTemplate.getConnectionFactory().getConnection();
redisConnection.flushDb();
redisConnection.flushAll();
ValueOperations valueOperations = redisTemplate.opsForValue();
valueOperations.set("name", "张三");
System.out.println(valueOperations.get("name"));
ListOperations listOperations = redisTemplate.opsForList();
SetOperations setOperations = redisTemplate.opsForSet();
ZSetOperations zSetOperations = redisTemplate.opsForZSet();
HashOperations hashOperations = redisTemplate.opsForHash();
GeoOperations geoOperations = redisTemplate.opsForGeo();
HyperLogLogOperations hyperLogLogOperations = redisTemplate.opsForHyperLogLog();
}
@Test
public void test() throws JsonProcessingException {
User user = new User("张三", 18);
redisTemplate.opsForValue().set("user", user);
System.out.println(redisTemplate.opsForValue().get("user"));
String jsonUser = new ObjectMapper().writeValueAsString(user);
redisTemplate.opsForValue().set("jsonUser", jsonUser);
System.out.println(redisTemplate.opsForValue().get("jsonUser"));
}
}