Spring Session Redis最佳实践(一)简单入门

Spring Session
placeholder image
admin 发布于:2019-05-25 18:51:40
阅读:loading

如果你关注Spring Session JDBC的实现可关注前面一篇文章。本文所谓的Spring Session Redis的简单入门,主要是根据github上的Spring Session项目源码实践而来,具体是从该项目中摘一些示例代码,按照需要,修改而来。

本文目标

实现基于Redis的Spring Session管理(不含Redis的搭建过程),spring-session-data-redis的版本为2.1.3.RELEASE,依赖的Spring版本为5.1.4.RELEASE,实现一个分布式的Session管理示例,多个服务器(端口不同)下session数据一致。

最佳实践

1.Maven依赖

<dependency>
    <
groupId>junit</groupId>
    <
artifactId>junit</artifactId>
    <
version>4.11</version>
    <
scope>test</scope>
</
dependency>
<!-- spring redis 相关-->
<dependency>
    <
groupId>org.springframework.session</groupId>
    <
artifactId>spring-session-data-redis</artifactId>
    <
version>2.1.3.RELEASE</version>
</
dependency>
<
dependency>
    <
groupId>redis.clients</groupId>
    <
artifactId>jedis</artifactId>
    <
version>2.9.1</version>
</
dependency>
<
dependency>
    <
groupId>org.springframework</groupId>
    <
artifactId>spring-web</artifactId>
    <
version>5.1.4.RELEASE</version>
</
dependency>
<!-- jsp servlet相关 -->
<dependency>
    <
groupId>javax.servlet</groupId>
    <
artifactId>javax.servlet-api</artifactId>
    <
version>4.0.1</version>
    <
scope>provided</scope>
</
dependency>
<
dependency>
    <
groupId>jstl</groupId>
    <
artifactId>jstl</artifactId>
    <
version>1.2</version>
</
dependency>
<!-- logback日志相关 -->
<dependency>
    <
groupId>org.slf4j</groupId>
    <
artifactId>slf4j-api</artifactId>
    <
version>1.7.7</version>
</
dependency>
<
dependency>
    <
groupId>ch.qos.logback</groupId>
    <
artifactId>logback-core</artifactId>
    <
version>1.1.7</version>
</
dependency>
<
dependency>
    <
groupId>ch.qos.logback</groupId>
    <
artifactId>logback-access</artifactId>
    <
version>1.1.7</version>
</
dependency>
<
dependency>
    <
groupId>ch.qos.logback</groupId>
    <
artifactId>logback-classic</artifactId>
    <
version>1.1.7</version>
</
dependency>
<!-- fastjson -->
<dependency>
    <
groupId>com.alibaba</groupId>
    <
artifactId>fastjson</artifactId>
    <
version>1.2.58</version>
</
dependency>

2.session.xml参数配置

<context:annotation-config/>
<
bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration">
</
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>

3.页面示例效果--session在不同服务器上的数据共享

image.png

(同一个session在8080服务器保存的数据)


image.png

(同一个session在8888服务器保存的数据)

总结一下

(1)前面的 jedisConnectionFactory 对象配置属性时,IDEA中给出了一些属性设置时是过期的,为了屏蔽过期的属性显示,故写成了 p:port 的写法,正常使用 property 属性声明即可;

(2)当logback的日志级别为debug时,启动时控制台会有错误的堆栈日志输出,但它不算是错,将日志级别调整为info后可以屏蔽,参考如下图所示:

image.png

(3)既然数据已经存储至Redis了,一起来分析一下它存的都是些什么值,比如浏览器创建了一个Session ID,对应的Redis下对应了3条数据(与之前的JDBC一致),参考如下:

image.png

(4)在Redis中查看其具体的数值信息,发现它默认存储的数据为Java序列化后的数据,它的具体数值存储的有一些个具体的属性值,如过期时间、sessionKey等等,还有一些看起来不能识别的特殊字符,它们都是Java序列化存储的结果,详细如下图所示:

image.png

(5)Redis中的具体查看命令,可根据session ID查看所有信息,亦可根据ID的某个属性进行查看,如下:

--查看某个session ID的对象数据

127.0.0.1:6379[5]> hgetall "spring:session:sessions:c3c007d3-fdd9-4ccf-ae55-1e8a53404cdf"

--查看某个session ID的某个属性

127.0.0.1:6379[5]> hget "spring:session:sessions:c3c007d3-fdd9-4ccf-ae55-1e8a53404cdf" "creationTime"

(6)其实我是Redis新手,如果要问我上面的命令是如何总结出来的,我会说我有使用Jedis客户端连接后,使用它提供的Java Api进行的分析,比如它里面有个 type 函数,我们可以知道这个session ID存储的到底是个什么类型的结构,以及使用这个结构找到其对应的取数函数将数据给显示出来。

源码下载

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


 点赞


 发表评论

当前回复:作者

 评论列表


留言区