Redis 分布式session

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis 分布式session相关的知识,希望对你有一定的参考价值。

参考技术A http协议是一个无状态协议,某些场景我需要session和cookie去记录一些数据。

存储在用户主机浏览器中的一小段文本文件
有服务器生成,发送给浏览器,KV形式存储

字面理解为“会话”
保存在服务端的数据结构

Tomcat Request

Tomcat CoyoteAdapter

http://localhost:8081/login?username=lisi&password=321

分布式session
分布式环境session失效问题
session粘粘
session复制
session集中式存储

优点:实现简单
缺点:可扩展性差、分配不均衡

缺点:
每台机器存储全量数据,比较占机器内存
session同步当机器较多时,可能造成广播风暴
session同步占用一定的网络带宽

本质上利用Tomcat的Filter的实现类SpringSessionRepositoryFilter实现了对每一次请求的拦截,拦截之后把Session放到Redis里面

redis 实现分布式session配置

Redis分布式session配置

如上图,多实例下可以使用redis实现分布式session管理,客户端请求,经过负载均衡分发至tomcat实例,再经过session管理,实现session在redis中存取,这里暂时只有一台redis机器。

具体代码如下:

1、redis配置

可以使用spring-cache.xml作为redis配置文件名,首先配置redis缓存池:

<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxTotal" value="${redis.pool.maxTotal}"/>
<property name="maxIdle" value="${redis.pool.maxIdle}"/>
<property name="maxWaitMillis" value="${redis.pool.maxWaitMillis}"/>
<property name="testOnBorrow" value="${redis.pool.testOnBorrow}"/>
</bean>

2、配置分布式session过滤器

<!-- 配置分布式session过滤器-->
<filter>
<filter-name>springSessionFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
<init-param>
<param-name>targetBeanName</param-name>
<param-value>springSession</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>springSessionFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

3、redis session配置

配置分布式session管理bean,经过第二步过滤器的请求,都会经过这个管理bean,配置SessionRepositoryFilter.java默认构造函数是redis session操作仓RedisOperationsSessionRepository。

<bean id="springSession" class="org.springframework.session.web.http.SessionRepositoryFilter">
<constructor-arg>
<bean class="org.springframework.session.data.redis.RedisOperationsSessionRepository">
<constructor-arg>
<bean class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
p:usePool="true"
p:port="${redis.session.port}"
p:hostName="${redis.session.server}"
p:password="${redis.session.pwd}"
p:database="${redis.session.db}"
p:poolConfig-ref="jedisPoolConfig"/>
</constructor-arg>
<property name="defaultMaxInactiveInterval" value="3600"/> <!-- 若不设置,session默认失效时间是半小时,这里设置成1小时-->
</bean>
</constructor-arg>
</bean>
参考文档:
http://www.jianshu.com/p/1361d578035d

以上是关于Redis 分布式session的主要内容,如果未能解决你的问题,请参考以下文章

场景应用:利用Redis实现分布式Session

场景应用:利用Redis实现分布式Session

Redis实战和核心原理详解使用Spring Session和Redis解决分布式Session跨域共享问题

Redis学习笔记~StackExchange.Redis实现分布式Session

转载Session分布式共享 = Session + Redis + Nginx

PHP分布式中Redis实现Session