SpringBoot基础回顾-18

列化机制

​       

刚刚完成了Spring Boot整合Redis进行了数据的缓存管理,但缓存管理的实体类数据使用的是JDK序列化方式,不便于使用可视化管理工具进行查看和管理。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9wSEA9yy-1591687292844)(./images/image-20191231142353290.png)]

接下来分别针对基于注解的Redis缓存实现和基于API的Redis缓存实现中的数据序列化机制进行介绍,并自定义JSON格式的数据序列化方式进行数据缓存管理 

#### 5.3.1

自定义RedisTemplate

**1.Redis API默认序列化机制**

​       

基于API的Redis缓存实现是使用RedisTemplate模板进行数据缓存操作的,这里打开RedisTemplate类,查看该类的源码信息 

```java

public class RedisTemplate<K, V>

extends RedisAccessor

                                implements

RedisOperations<K, V>, BeanClassLoaderAware {

      //

声明了key、value的各种序列化方式,初始值为空


@Nullable


private RedisSerializer keySerializer = null;


@Nullable


private RedisSerializer valueSerializer = null;

    @Nullable


private RedisSerializer hashKeySerializer = null;


@Nullable


private RedisSerializer hashValueSerializer = null;

      ...

      //

进行默认序列化方式设置,设置为JDK序列化方式


public void afterPropertiesSet() {


super.afterPropertiesSet();


boolean defaultUsed = false;


if(this.defaultSerializer == null) {


this.defaultSerializer = new JdkSerializationRedisSerializer(

                this.classLoader !=

null?this.classLoader:this.getClass().getClassLoader());


}

              ...

    }

      ...

}

```

​       

从上述RedisTemplate核心源码可以看出,在RedisTemplate内部声明了缓存数据key、value的各种序列化方式,且初始值都为空;在afterPropertiesSet()方法中,判断如果默认序列化参数defaultSerializer为空,将数据的默认序列化方式设置为JdkSerializationRedisSerializer 

​          根据上述源码信息的分析,可以得到以下两个重要的结论:

(1)使用RedisTemplate进行Redis数据缓存操作时,内部默认使用的是JdkSerializationRedisSerializer序列化方式,所以进行数据缓存的实体类必须实现JDK自带的序列化接口(例如Serializable);

(2)使用RedisTemplate进行Redis数据缓存操作时,如果自定义了缓存序列化方式defaultSerializer,那么将使用自定义的序列化方式。

​       

另外,在RedisTemplate类源码中,看到的缓存数据key、value的各种序列化类型都是RedisSerializer。进入RedisSerializer源码查看RedisSerializer支持的序列化方式(进入该类后,使用Ctrl+Alt+左键单击类名查看) 

![屏幕快照 2019-12-31 下午4.43.04](/Users/ericsun/Desktop/屏幕快照

2019-12-31 下午4.43.04.png)

​       

可以看出,RedisSerializer是一个Redis序列化接口,默认有6个实现类,这6个实现类代表了6种不同的数据序列化方式。其中,JdkSerializationRedisSerializer是JDK自带的,也是RedisTemplate内部默认使用的数据序列化方式,开发者可以根据需要选择其他支持的序列化方式(例如JSON方式)

**2.自定义RedisTemplate序列化机制**

​       

在项目中引入Redis依赖后,Spring

Boot提供的RedisAutoConfiguration自动配置会生效。打开RedisAutoConfiguration类,查看内部源码中关于RedisTemplate的定义方式 

```java

public class RedisAutoConfiguration {


@Bean


@ConditionalOnMissingBean(


name = {"redisTemplate"}

    )


public RedisTemplate<Object, Object>

redisTemplate(RedisConnectionFactory

                                        redisConnectionFactory)

throws UnknownHostException {


RedisTemplate<Object, Object> template = new RedisTemplate();


template.setConnectionFactory(redisConnectionFactory);


return template;

    }

      ...

}

```

从上述RedisAutoConfiguration核心源码中可以看出,在Redis自动配置类中,通过Redis连接工厂RedisConnectionFactory初始化了一个RedisTemplate;该类上方添加了@ConditionalOnMissingBean注解(顾名思义,当某个Bean不存在时生效),用来表明如果开发者自定义了一个名为redisTemplate的Bean,则该默认初始化的RedisTemplate不会生效。

​       

如果想要使用自定义序列化方式的RedisTemplate进行数据缓存操作,可以参考上述核心代码创建一个名为redisTemplate的Bean组件,并在该组件中设置对应的序列化方式即可 

​       

接下来,在项目中创建名为com.lagou.config的包,在该包下创建一个Redis自定义配置类RedisConfig,并按照上述思路自定义名为redisTemplate的Bean组件 

```java

@Configuration

public class RedisConfig {


@Bean


public RedisTemplate<Object, Object>

redisTemplate(RedisConnectionFactory


redisConnectionFactory) {


RedisTemplate<Object, Object> template = new RedisTemplate();


template.setConnectionFactory(redisConnectionFactory);


// 使用JSON格式序列化对象,对缓存数据key和value进行转换


Jackson2JsonRedisSerializer jacksonSeial = new

Jackson2JsonRedisSerializer(Object.class);


// 解决查询缓存转换异常的问题


ObjectMapper om = new ObjectMapper();


om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);


om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);


jacksonSeial.setObjectMapper(om);


// 设置RedisTemplate模板API的序列化方式为JSON


template.setDefaultSerializer(jacksonSeial);


return template;

    }

}

```

​       

通过@Configuration注解定义了一个RedisConfig配置类,并使用@Bean注解注入了一个默认名称为方法名的redisTemplate组件(注意,该Bean组件名称必须是redisTemplate)。在定义的Bean组件中,自定义了一个RedisTemplate,使用自定义的Jackson2JsonRedisSerializer数据序列化方式;在定制序列化方式中,定义了一个ObjectMapper用于进行数据转换设置 

​ 

**3.效果测试**

​       

启动项目,项目启动成功后,通过浏览器访问“http://localhost:8080/api/findCommentById?id=3”查询id为3的用户评论信息,并重复刷新浏览器查看同一条数据信息 

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8TbIslW9-1591687292848)(./images/image-20191231170732322.png)]

查看控制台打印的SQL查询语句

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LePE36nl-1591687292851)(./images/image-20191231170819323.png)]

可以看出,执行findById()方法正确查询出用户评论信息Comment,重复进行同样的查询操作,数据库只执行了一次SQL语句,这说明定制的Redis缓存生效。

​       

使用Redis客户端可视化管理工具Redis

Desktop Manager查看缓存数据 :


​        执行findById()方法查询出用户评论信息Comment正确存储到了Redis缓存库中,且缓存到Redis服务的数据已经使用了JSON格式存储展示,查看和管理也非常方便,说明自定义的Redis API模板工具RedisTemplate生效。

***上了拉勾教育的《Java工程师高薪训练营》,做一下笔记。希望拉勾能给我推到想去的公司,目标:字节!!***

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,386评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,142评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,704评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,702评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,716评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,573评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,314评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,230评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,680评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,873评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,991评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,706评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,329评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,910评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,038评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,158评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,941评论 2 355