1.SpringDataRedis介绍
SpringData是Spring中数据操作的模块,包含对各种数据库的集成,其中对Redis的集成模块就叫做 Spring-Data-Redis
官网地址: https://spring.io/projects/spring-data-redis
Spring-Data-Redis提供的特性:
- 提供了对不同Redis客户端的整合(Lettuce和Jedis)
- 提供了RedisTemplate统一API来操作Redis
- 支持Redis的发布订阅模型
- 支持Redis哨兵和Redis集群
- 支持基于Lettuce的响应式编程
- 支持基于JDK、JSON、字符串、Spring对象的数据序列化及反序列化支持基于Redis的JDK Collection实现
SpringDataRedis 中提供了RedisTemplate工具类,其中封装了各种对Redis的操作。并且将不同数据类型的操作API封装到了不同的类型中:
API | 返回值类型 | 说明 |
---|---|---|
redisTemplate.opsForValue() | ValueOperations | 操作string类型数据 |
redisTemplate.opsForHash() | HashOperations | 操作Hash类型数据 |
redisTemplate.opsForList() | ListOperations | 操作List类型数据 |
redisTemplate.opsForSet() | SetOperations | 操作Set类型数据 |
redisTemplate.opsForZSet() | ZSetOperations | 操作SortedSet类型数据 |
redisTemplate | 通用的命令 |
2.SpringDataRedis测试
2.1 项目依赖
项目中 springboot spring-boot-starter-parent
版本是 2.7.18
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- Redis连接池 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
2.2 配置文件
application.yml
spring:
redis:
host: 192.168.198.150
port: 6379
# 如果需要密码
password: 123456
lettuce:
pool:
min-idle: 1 # 最小空闲连接
max-idle: 8 # 最大空闲连接
max-active: 8 # 最大连接
max-wait: 1000 # 连接等待时间(单位ms)
2.3 配置类
RedisConfig.java
/**
* 这里RedisConfig会自定义某些序列化
* @author zhouzz
*/
@Configuration
public class RedisConfig {
@Value("${spring.redis.host}")
private String redisHost;
@Value("${spring.redis.port}")
private int redisPort;
@Value("${spring.redis.password}")
private String password;
@Bean
public RedisConnectionFactory redisConnectionFactory() {
// 创建Redis的单机配置
RedisStandaloneConfiguration config =
new RedisStandaloneConfiguration(redisHost, redisPort);
config.setPassword(RedisPassword.of(password));
// 返回Lettuce连接工厂
return new LettuceConnectionFactory(config);
}
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
// 创建RedisTemplate实例
RedisTemplate<String, Object> template = new RedisTemplate<>();
// 设置连接工厂
template.setConnectionFactory(connectionFactory);
// 设置键的序列化器为 StringRedisSerializer
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
template.setKeySerializer(stringRedisSerializer);
// 设置默认的序列化器为 GenericJackson2JsonRedisSerializer,用于序列化键和值为JSON格式
GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
template.setDefaultSerializer(jsonRedisSerializer);
// 设置值的序列化器为 GenericJackson2JsonRedisSerializer
template.setValueSerializer(jsonRedisSerializer);
// 设置hash键的序列化器为 StringRedisSerializer
template.setHashKeySerializer(stringRedisSerializer);
// 设置值的序列化器为 GenericJackson2JsonRedisSerializer
template.setHashValueSerializer(jsonRedisSerializer);
// 返回配置好的RedisTemplate实例
return template;
}
}
2.4 启动类
@SpringBootApplication
public class RedisApplication {
public static void main(String[] args) {
SpringApplication.run(RedisApplication.class, args);
}
}
2.5测试类
UserEntity.java
public class UserEntity {
private String username;
private Integer age;
//getXXX,setXXX,toString方法
}
RedisTemplateTest.java
@SpringBootTest(classes = RedisApplication.class)
public class RedisTemplateTest {
ObjectMapper objectMapper = new ObjectMapper();
@Autowired
private RedisTemplate redisTemplate;
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Test
public void test1() {
String key = "aa";
redisTemplate.opsForValue().set(key, "bb");
Object value = redisTemplate.opsForValue().get(key);
System.out.println(value);
}
@Test
public void test2() {
String key = "user:1001";
UserEntity user = new UserEntity();
user.setUsername("张三");
user.setAge(22);
redisTemplate.opsForValue().set(key, user, 3, TimeUnit.MINUTES);
UserEntity userEntity = (UserEntity) redisTemplate.opsForValue().get(key);
System.out.println(userEntity);
}
@Test
public void test3() throws JsonProcessingException {
String key = "user:1002";
UserEntity user = new UserEntity();
user.setUsername("李四");
user.setAge(25);
//手动需要序列化
String userJsonStr = objectMapper.writeValueAsString(user);
stringRedisTemplate.opsForValue().set(key, userJsonStr, 3, TimeUnit.MINUTES);
userJsonStr = stringRedisTemplate.opsForValue().get(key);
//手动反序列化
UserEntity userEntity = objectMapper.readValue(userJsonStr, UserEntity.class);
System.out.println(userEntity);
}
}
测试结果如下:
用 RedisTemplate 在Redis生成的 value为:
{
"@class": "com.zhouzz.redis.entity.UserEntity",
"username": "张三",
"age": 22
}
而使用StringRedisTemplate在Redis生成的 value为:
{
"username": "李四",
"age": 25
}
两者对比而已,前者所存储value值的内存开销更大。
推荐使用 StringRedisTemplate。
评论区