什么是序列化和反序列化
类似于面向对象的封装
狭义:属性私有化,方法能公开就公开
广义:一个系统有哪些服务,一个服务有哪些模块,一个模块有哪些结构,一个结构有哪些属性
序列化
狭义的层面:将对象转换为字节
广义的层面:将对象转换为指定格式的字符串
反序列化
狭义的层面:将字节转换为对象
广义的层面:将指定格式的字符串转换为对象
Redis存储对象(序列化和反序列化)
RedisSerializer接口,及其实现类
RedisSerializer接口下的实现类
注意:接口内的方法中,每次修改属性都会产生一个新的对象
在配置类中配置序列化设定
package com.jt.blog;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.serializer.*;
import java.time.Duration;
@Configuration
public class RedisCacheConfig extends CachingConfigurerSupport {
/**
* 定义redis的缓存key生成器,不定义也可以使用默认的。需要继承CachingConfigurerSupport类
* @return
*/
@Bean
public KeyGenerator keyGenerator() {
return (o, method, params) -> {
StringBuilder sb = new StringBuilder();
sb.append(o.getClass().getName()); // 类目
sb.append("::");
sb.append(method.getName()); // 方法名
for (Object param : params) {
sb.append(param.toString());
}
return sb.toString();
};
}
/**
* 自定义Cache管理器对象,不定义也可以,有默认的,但假如希望基于AOP
* 方式实现Redis的操作时,按照指定的序列化方式进行序列化,
* 可以对CacheManager进行自定义。
* @param connectionFactory
* @return
*/
@Bean
public RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory) {
//因为配置的config 的方法来自
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofSeconds(60)) // 60s缓存失效
// 设置key的序列化方式
.serializeKeysWith(RedisSerializationContext.SerializationPair
.fromSerializer(new StringRedisSerializer()))
// 设置value的序列化方式
.serializeValuesWith(RedisSerializationContext.SerializationPair
.fromSerializer(
new Jackson2JsonRedisSerializer<Object>(Object.class)))
// 不缓存null值
.disableCachingNullValues();
return RedisCacheManager.builder(connectionFactory)
.cacheDefaults(config)
.transactionAware()
.build();
}
.....
}