你这个工具类在获取list的数据的时候,内部是object,转换特别麻烦,有更好的方法吗
时间: 2024-03-05 14:51:44 浏览: 80
是的,您说得对,在 RedisUtils 中获取 List 类型的数据时,返回的是 Object 类型,需要手动进行类型转换,这样确实比较麻烦。不过,我们可以借助 Spring Framework 提供的一个类型转换工具类,来简化这个过程。
具体来说,我们可以使用 RedisTemplate 的 execute 方法,配合 RedisSerializer 和 RedisDeserializer,将 Redis 中存储的数据反序列化成 Java 对象。Spring Framework 中提供了许多默认的序列化器和反序列化器,包括 JsonSerializer、Jackson2JsonRedisSerializer、GenericJackson2JsonRedisSerializer 等。这些序列化器和反序列化器都可以通过配置 RedisTemplate 进行使用。
下面是一个使用 Jackson2JsonRedisSerializer 实现 List 类型的序列化和反序列化的 RedisUtils 的示例:
```java
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.stereotype.Component;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.concurrent.TimeUnit;
@Component
public class RedisUtils {
private final RedisTemplate<String, Object> redisTemplate;
private final ObjectMapper objectMapper;
public RedisUtils(RedisTemplate<String, Object> redisTemplate, ObjectMapper objectMapper) {
this.redisTemplate = redisTemplate;
this.objectMapper = objectMapper;
// 配置 RedisTemplate 的序列化器和反序列化器
RedisSerializer<String> stringSerializer = RedisSerializer.string();
Jackson2JsonRedisSerializer<Object> jsonSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
jsonSerializer.setObjectMapper(objectMapper);
redisTemplate.setKeySerializer(stringSerializer);
redisTemplate.setValueSerializer(jsonSerializer);
redisTemplate.setHashKeySerializer(stringSerializer);
redisTemplate.setHashValueSerializer(jsonSerializer);
}
public void set(String key, Object value) {
redisTemplate.opsForValue().set(key, value);
}
public void set(String key, Object value, long timeout, TimeUnit timeUnit) {
redisTemplate.opsForValue().set(key, value, timeout, timeUnit);
}
public Object get(String key) {
return redisTemplate.opsForValue().get(key);
}
public <T> T get(String key, Class<T> clazz) {
Object value = redisTemplate.opsForValue().get(key);
return objectMapper.convertValue(value, clazz);
}
public boolean delete(String key) {
return redisTemplate.delete(key);
}
public boolean expire(String key, long timeout, TimeUnit timeUnit) {
return redisTemplate.expire(key, timeout, timeUnit);
}
public <T> List<T> getList(String key, Class<T> elementType) {
byte[] bytes = redisTemplate.opsForValue().get(key).toString().getBytes(StandardCharsets.UTF_8);
return objectMapper.readValue(bytes, objectMapper.getTypeFactory().constructCollectionType(List.class, elementType));
}
public <T> void setList(String key, List<T> list) {
redisTemplate.opsForValue().set(key, list);
}
public <T> void setList(String key, List<T> list, long timeout, TimeUnit timeUnit) {
redisTemplate.opsForValue().set(key, list, timeout, timeUnit);
}
public boolean hasKey(String key) {
return redisTemplate.hasKey(key);
}
}
```
使用时,只需要调用 getList 方法即可获取 List 类型的数据,例如:
```java
List<String> list = redisUtils.getList("myList", String.class);
```
这样就可以避免手动进行类型转换了。
阅读全文