Spring Session Redis最佳实践(一)简单入门
Spring Sessionadmin 发布于: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数据一致。
<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>
<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>
(同一个session在8080服务器保存的数据)
(同一个session在8888服务器保存的数据)
(1)前面的 jedisConnectionFactory 对象配置属性时,IDEA中给出了一些属性设置时是过期的,为了屏蔽过期的属性显示,故写成了 p:port 的写法,正常使用 property 属性声明即可;
(2)当logback的日志级别为debug时,启动时控制台会有错误的堆栈日志输出,但它不算是错,将日志级别调整为info后可以屏蔽,参考如下图所示:
(3)既然数据已经存储至Redis了,一起来分析一下它存的都是些什么值,比如浏览器创建了一个Session ID,对应的Redis下对应了3条数据(与之前的JDBC一致),参考如下:
(4)在Redis中查看其具体的数值信息,发现它默认存储的数据为Java序列化后的数据,它的具体数值存储的有一些个具体的属性值,如过期时间、sessionKey等等,还有一些看起来不能识别的特殊字符,它们都是Java序列化存储的结果,详细如下图所示:
(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
点赞