Spring Session Redis最佳实践(三)使用Fastjson替换JDK序列化存储

Spring Session
placeholder image
admin 发布于:2019-05-25 21:08:02
阅读:loading

基本描述

这一篇来继续说说Spring Session Redis中的数据存储,将默认的JDK序列化存储修改为使用Fastjson存储,实际上我们知道JDK序列化的性能非常慢,而且我们无法直观的查看其中的数据,另外一个我不确定使用JDK序列化的数据能否使用其它语言进行反序列化,反正json格式的数据可以,而且fastjson是世界上最快的json实现,所以这个实现值得这么去做。

在Spring Session Redis的数据存储方式除了提供JDK的序列化外,也提供有使用JSON格式的数据存储,但JSON组件为“Jackson”,参考实现如下图:

image.png

首先依赖的fastjson jar的gav前文中有给出,并且版本稍微有点新,其次需要修改session.xml配置文件中的RedisHttpSessionConfiguration配置参数,增加defaultRedisSerializer属性并引用fastJsonRedisSerializer的序列化实现,而fastJsonRedisSerializer它的构造函数则依赖一个Class类型的对象,至于fastJsonRedisSerializer的实现网络上也是搜索出来许多的实现方式,基本都是自己写的,按照接口实现规范重写方法,最后使用JSON.toJSONString与JSON.parseObject的形式进行存储于转换。让我意外的是我也使用此种实现时我的class命名与fastjson中提供的实现方式相同,所以不出意外的我发现了新版fastjson中提供的Spring Session Redis的自带实现,参见上图可以看出一共给提供了2个实现,分别是FastJsonRedisSerializer与GenericFastJsonRedisSerializer,本文使用前者。

使用前文中的命令再查看session ID数据时,可以看出来所有的数据值都已经存储为JSON格式了,详见下图:

image.png

注意了啊,这里的更改默认序列化实现方式与直接往session里存储数据时使用JSON.toJSONString有一些区别的,替换后直接再存储时就是以JSON格式了,参考配置文件如下:

<context:annotation-config/>
<
bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration">
    
<property name="defaultRedisSerializer" ref="fastJsonRedisSerializer" />
</
bean>
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <
property name="locations">
        <
array>
            <
value>classpath:spring-config-redis.properties</value>
        </
array>
    </
property>
</
bean>
<!--直接采用property的形式可以看到很多属性已经过期了-->
<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
      
p:hostName="${spring.redis.hostName}" p:port="${spring.redis.port}" p:database="${spring.redis.database}"
      
p:poolConfig-ref="jedisPoolConfig"
>
</
bean>
<
bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
    <
property name="maxTotal" value="${spring.redis.maxTotal}"/>
    <
property name="maxIdle" value="${spring.redis.maxIdle}"/>
    <
property name="minIdle" value="${spring.redis.minIdle}"/>
    <
property name="testOnBorrow" value="${spring.redis.testOnBorrow}"/>
    <
property name="maxWaitMillis" value="${spring.redis.maxWaitMillis}"/>
</
bean>
<bean id="fastJsonRedisSerializer" class="com.alibaba.fastjson.support.spring.FastJsonRedisSerializer">
    <constructor-arg name="type" value="java.lang.Object" />
</bean>

其它说明

(1)发现这个session数据中存储的中文显示的有问题,不知这么设计是何用意;

(2)在替换默认格式化为json时,网络上许多文章里面有的“redisTemplate”的配置没有关系;

image.png

源码下载

https://gitee.com/88911006/chendd-examples

 点赞


 发表评论

当前回复:作者

 评论列表


留言区