文章目录
- 思考
- redis实现键值序列化
- 自定义一个序列化转换器
- 编写redis配置文件
- 编写application.properties
- 编写User类
- 编写controller
- 编写service
- 测试
思考
为什么键值要序序列化呢?
不同平台之间的数据传输,深拷贝,浅拷贝,如果不采用序列化,很容易在传输过程中出现各种错误,无法正常使用
Redis的序列化到底是什么?
简单的是说 就是 key 和 value存储到redis中的形式,这个储存的格式是可以自己定义的,保证数据的正确性
redis实现键值序列化
自定义一个序列化转换器
public class MyRedisSerializable implements RedisSerializer {
private Class clazz;
public MyRedisSerializable(Class clazz) {
this.clazz = clazz;
}
/**
* 序列化的方法
* 就是将对象转换成字符串的方法
*/
@Override
public byte[] serialize(Object o) throws SerializationException {
if (null == o) {
return null;
}
// 我们需要把这个值转换成json对象,存储到redis中
String json = JSON.toJSONString(o);
return json.getBytes();
}
/**
* 反序列化的方法
* 就是将redis中的字符串转换成java对象的方法
*/
@Override
public Object deserialize(byte[] bytes) throws SerializationException {
if (null == bytes || bytes.length < 1) {
return null;
}
String strResult = new String(bytes);
return JSON.parseObject(strResult);
}
}
编写redis配置文件
@SpringBootConfiguration
public class RedisConfig {
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
// 设置redis连接工厂
redisTemplate.setConnectionFactory(redisConnectionFactory);
// 设置 键的序列化器
redisTemplate.setKeySerializer(new StringRedisSerializer());
// 设置 值的序列化器
// 这是我们自定义的序列化器,使用的是 fastjson
redisTemplate.setValueSerializer(new MyRedisSerializable(Object.class));
// 这是redis内置的序列化器,使用的是jackson
// redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));
return redisTemplate;
}
}
编写application.properties
# 配置redis ip
spring.redis.host=你自己服务器的ip
# redis端口
spring.redis.port=6379
# redis密码
spring.redis.password=密码
# 最大连接数
spring.redis.jedis.pool.max-active=10
# 线程池中最大的空闲连接数
spring.redis.jedis.pool.max-idle=8
# 最小空闲连接数
spring.redis.jedis.pool.min-idle=1
# 连接池最大阻塞时间 -1 代表没有限制
spring.redis.jedis.pool.max-wait=-1
编写User类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User implements Serializable {
private static final long serialVersionUID = -8029900025848971882L;
private Integer id;
private String name;
private String password;
}
编写controller
@RestController
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("addUser")
public String addUser() {
User user = new User(123, "孔明km11", "mima");
userService.addUser(user);
return "添加成功...";
}
@RequestMapping("getUser")
public User getUser() {
String key = "user:123";
User user = userService.getUserByKey(key);
return user;
}
}
编写service
@Service
public class UserServiceImpl implements UserService {
private Logger logger = LoggerFactory.getLogger(UserServiceImpl.class);
@Autowired
private RedisTemplate redisTemplate;
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Override
public void addUser(User user) {
redisTemplate.opsForValue().set("user:" + user.getId(), user);
logger.info("设置对象成功....");
}
@Override
public User getUserByKey(String key) {
String userStr = stringRedisTemplate.opsForValue().get(key);
logger.info("获取对象成功.... " + userStr);
User user = JSON.parseObject(userStr, User.class);
return user;
}
}
测试
启动项目分别访问以下链接即可
这里证明自定义序列化转换器设置成功