通常情况下可以使用
@Test
void test() throws JsonProcessingException {
User user = new User("哈哈哈", 20);
String jsonUser = new ObjectMapper().writeValueAsString(user);
redisTemplate.opsForValue().set("user",jsonUser );
System.out.println(redisTemplate.opsForValue().get("user"));
}
给redis数据库的value插入一个自定义的对象,但当直接redisTemplate.opsForValue().set("user",user);时程序即会报错,所以此时需要进行序列化
方法一:将自定义类User实现Serializable,即
@Component
@AllArgsConstructor
@NoArgsConstructor
@Data //lombook依赖
public class User implements Serializable{
private String name;
private int age;
}
方法二则比较繁琐:
1、自定义一个配置类@Configuration
@Configuration
public class RedisConfig {
//自定义序列化固定模板,直接使用即可
@Bean
@SuppressWarnings("all")
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
//序列化配置
Jackson2JsonRedisSerializer objectJackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
objectJackson2JsonRedisSerializer.setObjectMapper(om);
//string的序列化
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
//key采用string的序列化方式
template.setKeySerializer(stringRedisSerializer);
//hash的key也采用string的序列化方式
template.setHashKeySerializer(stringRedisSerializer);
//value序列化方式采用jackson
template.setValueSerializer(objectJackson2JsonRedisSerializer);
//hash的value序列化方式采用jackson
template.setHashValueSerializer(objectJackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
}
2、使用该类时注入时需要添加@Autowired和@Qualifier("redisTemplate") //指定我们自己写的template
@Autowired
@Qualifier("redisTemplate")
private RedisTemplate redisTemplate;
@Test
void test() throws JsonProcessingException {
User user = new User("zhangx", 20);
String jsonUser = new ObjectMapper().writeValueAsString(user);
redisTemplate.opsForValue().set("user",jsonUser );
System.out.println(redisTemplate.opsForValue().get("user"));
}
方法三:
1、在方法二的基础上写一个RedisUtil类,后续对redis的操作可直接调用此util类
package com.test.utils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
@Component
public final class RedisUtil {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
// ==================&#