除了String类型,实战中我们还经常会在Redis中存储对象,这时候我们就会想是否可以使用类似RedisTemplate<String, User>来初始化并进行操作。但是Spring Boot并不支持直接使用,需要我们自己实现RedisSerializer<T>接口来对传入对象进行序列化和反序列化,下面我们通过一个实例来完成对象的读写操作。
- 创建要存储的对象:User
123456789101112131415
publicclassUserimplementsSerializable {privatestaticfinallongserialVersionUID = -1L;privateString username;privateInteger age;publicUser(String username, Integer age) {this.username = username;this.age = age;}// 省略getter和setter} - 实现对象的序列化接口
123456789101112131415161718192021222324252627282930313233343536
publicclassRedisObjectSerializerimplementsRedisSerializer<Object> {privateConverter<Object,byte[]> serializer =newSerializingConverter();privateConverter<byte[], Object> deserializer =newDeserializingConverter();staticfinalbyte[] EMPTY_ARRAY =newbyte[0];publicObject deserialize(byte[] bytes) {if(isEmpty(bytes)) {returnnull;}try{returndeserializer.convert(bytes);}catch(Exception ex) {thrownewSerializationException("Cannot deserialize", ex);}}publicbyte[] serialize(Object object) {if(object ==null) {returnEMPTY_ARRAY;}try{returnserializer.convert(object);}catch(Exception ex) {returnEMPTY_ARRAY;}}privatebooleanisEmpty(byte[] data) {return(data ==null|| data.length ==0);}} - 配置针对User的RedisTemplate实例
1234567891011121314151617181920
@ConfigurationpublicclassRedisConfig {@BeanJedisConnectionFactory jedisConnectionFactory() {returnnewJedisConnectionFactory();}@BeanpublicRedisTemplate<String, User> redisTemplate(RedisConnectionFactory factory) {RedisTemplate<String, User> template =newRedisTemplate<String, User>();template.setConnectionFactory(jedisConnectionFactory());template.setKeySerializer(newStringRedisSerializer());template.setValueSerializer(newRedisObjectSerializer());returntemplate;}} - 完成了配置工作后,编写测试用例实验效果
123456789101112131415161718192021222324252627
@RunWith(SpringJUnit4ClassRunner.class)@SpringApplicationConfiguration(Application.class)publicclassApplicationTests {@AutowiredprivateRedisTemplate<String, User> redisTemplate;@Testpublicvoidtest()throwsException {// 保存对象User user =newUser("超人",20);redisTemplate.opsForValue().set(user.getUsername(), user);user =newUser("蝙蝠侠",30);redisTemplate.opsForValue().set(user.getUsername(), user);user =newUser("蜘蛛侠",40);redisTemplate.opsForValue().set(user.getUsername(), user);Assert.assertEquals(20, redisTemplate.opsForValue().get("超人").getAge().longValue());Assert.assertEquals(30, redisTemplate.opsForValue().get("蝙蝠侠").getAge().longValue());Assert.assertEquals(40, redisTemplate.opsForValue().get("蜘蛛侠").getAge().longValue());}}当然spring-data-redis中提供的数据操作远不止这些,本文仅作为在Spring Boot中使用redis时的配置参考,更多对于redis的操作使用,请参考Spring-data-redis Reference。
-
