目录
一、简单介绍
- springboot在现在的版本中操作Redis数据库用到了lettuce
- 豆包回答:Lettuce 是一个高性能的 Java Redis 客户端,基于 Netty 框架构建,支持同步、异步和响应式编程模式,它是 Spring Data Redis 默认的 Redis 客户端(从 Spring Boot 2.0 开始),替代了 Jedis。
- SpringBoot操作Redis主要是通过RedisTemplate统一API来操作Redis,它提供了一系列API。
二、API的简单认识
三、快速入门
1.引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
2.配置文件
# 应用服务 WEB 访问端口
server:
port: 8083
Spring:
redis:
host: 127.0.0.1
port: 6379
password:
timeout: 10s
lettuce:
pool:
# 最大阻塞等待时间,负数表示没有限制
max-wait: -1
# 连接池中的最大空闲连接
max-idle: 5
# 连接池中的最小空闲连接
min-idle: 0
# 连接池中最大连接数,负数表示没有限制
max-active: 20
四、代码测试
@Autowired
private RedisTemplate redisTemplate;
@Test
void redisTest01(){
redisTemplate.opsForValue().set("name","小丁学编程");
String name = (String) redisTemplate.opsForValue().get("name");
System.out.println(name); //小丁学编程
}
@Test
void redisTest02(){
redisTemplate.opsForValue().set("user",new User("123","W233321524325","张三",25,"山东潍坊"));
Object o = redisTemplate.opsForValue().get("user");
System.out.println(o);
}
造成上图的原因是因为默认的redisTemplate进行操作时,key会用StringRedisSerializer序列化,value会用JdkSerializationRedisSerializer序列化(java原生序列化)
解决以上问题可以有两个方法:
- 自定义redisTemplate序列化配置类,key用String序列化,value用Json序列化
- 使用StringRedisTemplate,它的key和Value默认就是String方式,我们不用自己再去定义RedisTemplate的配置类。
1.自定义序列化
/**
* @Description
* @Author dhp
* @create 2025-05-13 15:40
*/
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory)
throws UnknownHostException {
// 创建模板
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
// 设置连接工厂
redisTemplate.setConnectionFactory(redisConnectionFactory);
// 设置序列化工具
GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
// key和 hashKey采用 string序列化
redisTemplate.setKeySerializer(RedisSerializer.string());
redisTemplate.setHashKeySerializer(RedisSerializer.string());
// value和 hashValue采用 JSON序列化
redisTemplate.setValueSerializer(jsonRedisSerializer);
redisTemplate.setHashValueSerializer(jsonRedisSerializer);
return redisTemplate;
}
}
这时候继续存字符串和对象会得到下面的结果
这时,我们会发现用json序列化对象的时候,多存了一个@Class属性,这个的作用就是当我们之后在get取值的时候,它会根据这个@Class属性反序列化为相应的对象,虽然可以实现,但也会带来额外的内存开销。
2.StringRedisTemplate
为了能存入对象,且减少内存的开销,要求key和value都使用String序列化,StringRedisTemplate就是把他们两个用String序列化,而java对象怎么进行String序列化呢,然后value传字符串呢?
没座!~ 即把java对象手动转成json字符串,value传json字符串就可以了
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Test
void redisTest03() throws JsonProcessingException {
User user = new User("123", "W233321524325", "张三", 25, "山东潍坊");
//手动转为json字符串
String json = new ObjectMapper().writeValueAsString(user);
stringRedisTemplate.opsForValue().set("user1",json);
String userJson = stringRedisTemplate.opsForValue().get("user1");
//反序列化手动转为User
User user1 = new ObjectMapper().readValue(userJson, User.class);
System.out.println(user1);
}