- 前言
- 项目结构
- 配置类:(实现redis的序列化)
- FastJsonRedisSerializer.java
- RedisConfig.java
- 实体类 UserVO.java
- util
- RedisObjUtil.java
- 测试类
- 运行结果
RedisTemplate是spring封装的操作redis的接口,使用起来很方便,但也有很多坑,比如存储javabean类。这里将使用fastjson实现序列化。非常滴人性!话不多说直接上demo
项目结构|_config:配置文件目录 |_FastJsonRedisSerializer.java |_RedisConfig.java |_util |_RedisObjUtil.java |_vo |_UserVo.java配置类:(实现redis的序列化) FastJsonRedisSerializer.java
package com.king.mooc.config; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.serializer.SerializerFeature; import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.data.redis.serializer.SerializationException; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; public class FastJsonRedisSerializerRedisConfig.javaimplements RedisSerializer { public static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8; private final Class clazz; public FastJsonRedisSerializer(Class clazz) { super(); this.clazz = clazz; } @Override public byte[] serialize(T t) throws SerializationException { if (t == null) { return new byte[0]; } return JSON.toJSONString(t, SerializerFeature.WriteClassName).getBytes(DEFAULT_CHARSET); } @Override public T deserialize(byte[] bytes) throws SerializationException { if (bytes == null || bytes.length <= 0) { return null; } String str = new String(bytes, DEFAULT_CHARSET); return (T) JSON.parseObject(str, clazz); } }
package com.king.mooc.config;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.parser.ParserConfig;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class RedisConfig {
RedisConfig(){
//打开autotype功能,需要强转的类一次添加其后
ParserConfig.getGlobalInstance()
.addAccept("com.king.mooc.vo.UserVo");
}
@Bean
public RedisTemplate
实体类 UserVO.java
package com.king.mooc.vo;
import com.king.mooc.bean.User;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
@Data
public class UserVo implements Serializable {
private Long id;
private String name;
//头像
private String headImg;
private String email;
private Long phone;
//是否为会员
private Boolean isVip = false;
private String validateCode;
public void setUser(User user) {
System.out.println(user);
this.id = user.getId();
this.name = user.getName();
this.email = user.getEmail();
this.phone = user.getPhone();
this.headImg = user.getHeadImg();
this.isVip = user.getVipTime().isBefore(LocalDateTime.now());
}
}
util
RedisObjUtil.java
package com.king.mooc.util;
import com.king.mooc.vo.UserVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.BoundHashOperations;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.stereotype.Repository;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
@Repository
public class RedisObjUtil {
@Autowired
private RedisTemplate redisTemplate;
public void setEntity(String key, Object o) {
redisTemplate.opsForValue().set(key, o);
}
public void setEntity(String key, long time, Object o) {
redisTemplate.opsForValue().set(key, o, time, TimeUnit.MINUTES);
}
public UserVo getUserVo(String key) {
return (UserVo) redisTemplate.opsForValue().get(key);
}
public T getEntity(String key, Class entity) {
return (T) redisTemplate.opsForValue().get(key);
}
}
测试类
package com.king.mooc.util;
import com.king.mooc.vo.UserVo;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import static org.junit.Assert.*;
@SpringBootTest
@RunWith(SpringJUnit4ClassRunner.class)
public class RedisObjUtilTest {
@Autowired
RedisObjUtil redisObjUtil;
@Test
public void setEntity(){
UserVo userVo = new UserVo();
userVo.setEmail("123456789@qq.com");
userVo.setPhone(12345678941L);
userVo.setId(1L);
userVo.setName("test");
userVo.setHeadImg("F:\Downloads\1.jpg");
userVo.setIsVip(true);
userVo.setValidateCode("K25sk");
redisObjUtil.setEntity("userVo",userVo);
}
@Test
public void getEntity(){
UserVo userVo = redisObjUtil.getUserVo("userVo");
System.out.println(userVo);
UserVo userVo1 = redisObjUtil.getEntity("userVo",userVo.getClass());
System.out.println(userVo1);
}
}
运行结果



