GVKun编程网logo

分布式中Redis实现Session终结篇(redis解决分布式session)

7

在这里,我们将给大家分享关于分布式中Redis实现Session终结篇的知识,让您更了解redis解决分布式session的本质,同时也会涉及到如何更有效地Asp.net实现Session分布式储存(

在这里,我们将给大家分享关于分布式中Redis实现Session终结篇的知识,让您更了解redis解决分布式session的本质,同时也会涉及到如何更有效地Asp.net 实现Session分布式储存(Redis,Mongodb,Mysql等) sessionState Custom、java开发之Redis实现分布式Session管理、nginx+redis实现session共享、PHP+redis实现session共享的内容。

本文目录一览:

分布式中Redis实现Session终结篇(redis解决分布式session)

分布式中Redis实现Session终结篇(redis解决分布式session)

 上一篇使用Redis实现Session共享方式虽然可行,但是实际操作起来却很麻烦,现有代码已经是这个样子了,总不可能全部换掉吧!好吧,这是个很实际的问题,那么能不能实现无侵入式的分布式Session共享方案呢?mode="InProc"这是web.config里面使用iis进程保存Session的配置,不知你注意过没,mode除了InProc,SQLServer,StateServer这几个常用的,还有一个Custom。这里我要使用的是网友提供给的一种方自定义Session,需要继承System.Web.SessionState.SessionStateStoreProviderBase实现自己的SessionStateStoreProvide,下面讲解如何实现自定义的RedisSessionStateStore。

SessionStateStoreProviderBase

  SessionStateStoreProviderBase是asp.net提供的定义数据存储区的会话状态提供程序所需的成员。像常用InProcSessionStateStore(mode="InProc"),SqlSessionStateStore(mode="SQLServer"),都是继承SessionStateStoreProviderBase实现的存储。我们来看看msdn对其成员的定义

成员 说明

InitializeRequest 方法

执行会话状态存储提供程序必需的所有初始化操作。

EndRequest 方法

执行会话状态存储提供程序必需的所有清理操作。

Dispose 方法

释放会话状态存储提供程序不再使用的所有资源。

GetItemExclusive 方法

从会话数据存储区中检索会话的值和信息,并在请求持续期间锁定数据存储区中的会话项数据。GetItemExclusive 方法设置几个输出参数值,这些参数值将数据存储区中当前会话状态项的状态通知给执行调用的 SessionStateModule

如果数据存储区中未找到任何会话项数据,则GetItemExclusive 方法将 locked 输出参数设置为false,并返回 null。这将导致 SessionStateModule调用 CreateNewStoreData 方法来为请求创建一个新的SessionStateStoreData 对象。

如果在数据存储区中找到会话项数据但该数据已锁定,则GetItemExclusive 方法将 locked 输出参数设置为true,将 lockAge 输出参数设置为当前日期和时间与该项锁定日期和时间的差,将 lockId 输出参数设置为从数据存储区中检索的锁定标识符,并返回 null。这将导致SessionStateModule 隔半秒后再次调用GetItemExclusive 方法,以尝试检索会话项信息和获取对数据的锁定。如果 lockAge 输出参数的设置值超过ExecutionTimeout 值,SessionStateModule 将调用ReleaseItemExclusive 方法以清除对会话项数据的锁定,然后再次调用 GetItemExclusive 方法。

如果 regenerateExpiredSessionId 属性设置为 true,则 actionFlags 参数用于其 Cookieless 属性为 true 的会话。actionFlags 值设置为 InitializeItem (1) 则指示会话数据存储区中的项是需要初始化的新会话。通过调用CreateUninitializedItem 方法可以创建会话数据存储区中未初始化的项。如果会话数据存储区中的项已经初始化,则 actionFlags 参数设置为零。

如果提供程序支持无 Cookie 会话,请将 actionFlags 输出参数设置为当前项从会话数据存储区中返回的值。如果被请求的会话存储项的 actionFlags 参数值等于InitializeItem 枚举值 (1),则 GetItemExclusive 方法在设置 actionFlags out 参数之后应将数据存储区中的值设置为零。

GetItem 方法

除了不尝试锁定数据存储区中的会话项以外,此方法与GetItemExclusive 方法执行的操作相同。GetItem 方法在 EnableSessionState 属性设置为 ReadOnly 时调用。

SetAndReleaseItemExclusive 方法

采用当前请求的 HttpContext 实例、当前请求的SessionID 值、包含要存储的当前会话值的SessionStateStoreData 对象、当前请求的锁定标识符以及指示要存储的数据是属于新会话还是现有会话的值作为输入。

如果 newItem 参数为 true,则SetAndReleaseItemExclusive 方法使用提供的值将一个新项插入到数据存储区中。否则,数据存储区中的现有项使用提供的值进行更新,并释放对数据的任何锁定。请注意,只有与提供的 SessionID 值和锁定标识符值匹配的当前应用程序的会话数据才会更新。

调用 SetAndReleaseItemExclusive 方法后,SessionStateModule 调用 ResetItemTimeout 方法来更新会话项数据的过期日期和时间。

ReleaseItemExclusive 方法

采用当前请求的 HttpContext 实例、当前请求的SessionID 值以及当前请求的锁定标识符作为输入,并释放对会话数据存储区中的项的锁定。在调用 GetItemGetItemExclusive 方法,并且数据存储区指定被请求项已锁定,但锁定时间已超过 ExecutionTimeout 值时会调用此方法。此方法清除锁定,释放该被请求项以供其他请求使用。

RemoveItem 方法

此方法在 Abandon 方法被调用时调用。

CreateUninitializedItem 方法

采用当前请求的 HttpContext 实例、当前请求的SessionID 值以及当前请求的锁定标识符作为输入,并向会话数据存储区添加一个 actionFlags 值为InitializeItem 的未初始化项。

如果 regenerateExpiredSessionId 属性设置为 true,则 CreateUninitializedItem 方法用于无 Cookie 会话,这将导致遇到过期会话 ID 时,SessionStateModule 会生成一个新的 SessionID值。

生成新的 SessionID 值的过程需要浏览器重定向到包含新生成的会话 ID 的 URL。在包含过期的会话 ID 的初始请求期间,会调用 CreateUninitializedItem 方法。SessionStateModule 获取一个新的 SessionID 值来替换过期的会话 ID 之后,它会调用CreateUninitializedItem 方法以将一个未初始化项添加到会话状态数据存储区中。然后,浏览器重定向到包含新生成的 SessionID 值的 URL。如果会话数据存储区中存在未初始化项,则可以确保包含新生成的 SessionID 值的重定向请求被视为新的会话,而不会被误认为是对过期会话的请求。

会话数据存储区中未初始化的项与新生成的 SessionID值关联,并且仅包含默认值,其中包括到期日期和时间以及与 GetItemGetItemExclusive 方法的actionFlags 参数相对应的值。会话状态存储区中的未初始化项应包含一个与 InitializeItem 枚举值 (1) 相等的actionFlags 值。此值由 GetItemGetItemExclusive 方法传递给SessionStateModule,并针对 SessionStateModule指定当前会话是新会话。然后,SessionStateModule将初始化该新会话,并引发 Session_OnStart 事件。

CreateNewStoreData 方法

采用当前请求的 HttpContext 实例和当前会话的Timeout 值作为输入,并返回带有空ISessionStateItemCollection 对象的新的SessionStateStoreData 对象、一个HttpStaticObjectsCollection 集合和指定的 Timeout值。使用 GetSessionStaticObjects 方法可以检索 ASP.NET 应用程序的 HttpStaticObjectsCollection 实例。

上面的定义有点长,其实很多都在说明一点那就是原生了Session是单线程的方式实现的,当多个进行读的时候会加锁后面的会等待。我们下面实现的去掉了这些锁,加快并发读写。



实现自己的RedisSessionStateStore

继承SessionStateStoreProviderBase实现自己的RedisSessionStateStore也很简单,只需继承SessionStateStoreProviderBase重写CreateNewStoreData,CreateUninitializedItem,GetItem等几个方法即可,下面贴出代码,参考InProcSessionStateStore实现。



使用也很简单,修改web.config,如下图


然后可以保持原先代码不变,像Session["UserCode"]="admin"方式进行使用,但是现在的Session已经具备了分布式的特征,支持跨域。这里得说一下该方式的缺点,在GetItem和SetAndReleaseItemExclusive时需要对键值对进行反序列化和序列化操作,对于保存数据量大的情况反而性能相对于系统提供的方式大打折扣,所以使用的时候需要考虑自己的实际场景。


总结  

  本来分布式Session共享到上篇就完结了,但是由于方案的可行性差,还有更好的方案,所以花了点时间参考了前面MSND中的说明,和ASP.net源码中InProcSessionStateStore的实现,解决GetItemExclusive等方法的并发锁定问题,最终实现了Redis的存储方式,更加灵活方便。这里要感谢大家提的意见,让我又学会了一个知识点!

  svn下载地址:http://code.taobao.org/svn/ResidSessionDemo/

  本文参考:

  sessionstatestoreproviderbase定义:https://msdn.microsoft.com/zh-cn/library/system.web.sessionstate.sessionstatestoreproviderbase(VS.80).aspx

  sessionstatestoreproviderbase成员:https://msdn.microsoft.com/zh-cn/library/ms178587(v=vs.80).aspx


原文地址:http://www.cnblogs.com/yanweidie/p/4763556.html


关注我们的方法:
1.点击文章标题下的“dotNET跨平台”蓝字,或者在微信搜索“opendotnet”,加关注
2.老朋友点击点击右上角“……”标志分享到朋友圈

本文分享自微信公众号 - dotNET跨平台(opendotnet)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

Asp.net 实现Session分布式储存(Redis,Mongodb,Mysql等) sessionState Custom

Asp.net 实现Session分布式储存(Redis,Mongodb,Mysql等) sessionState Custom

  对于asp.net 程序员来说,Session的存储方式有InProc、StateServer、sqlServer和Custom,但是Custom确很少有人提及。但Custom确实最好用,目前最实用和最灵活一种方式,因为Custom可以实现各种情况的Session存储,特别对于大型网站尤为重要,解决Session丢失和Session效率的最佳实现方式,也是实现单点登录的最佳途径。 对于InProc、StateServer和sqlServer各自优缺点,网上一大堆,这里就不做详解。

重要的两点

 1、首先是关于Session存储,Session的存储并不是我们想象的,当设置Session时立即往数据容器里插入或者修改数据,当获取Session的值时就是立即去数据容器里获取值,这种理解是错误的(我之前就是这样理解的)。后来想想完全没必要这样操作,而且会大大影响效率。Asp.net的Session实现方式是每次请求前获取数据,当请求逻辑代码结束的时候在设置Session的值,所以说Session对数据容器的修改简单的意义只有两次,这个可能就要牵扯到管道流了。

2、第二个就是关于Asp.net网站异步的问题,当我们不设置Session的状态为只读时,我们每个用户的请求其实都是同步的,也就说每个用户请求网站同时只能有一个请求响应。理解这个就可以理解后面实现方法中需要锁的概念了。

SessionStateStoreProviderBase

  SessionStateStoreProviderBase是asp.net框架为我们提供的一个用来存储Session提供程序所需的成员(就是实现这个类),我们知道的InProc、sqlServer、StateServer都是实现了这个抽象类。继承这个类需要有多个抽象方法需要实现。关于这多个方法没必要每个都实现,我们只关注我们需要实现的即可。说简单点就是对Session数据的增删改查(CRUD)。关于SessionStateStoreProviderBase的详情可以参考

<table summary="table">
<tr>
<th scope="col">

成员

说明

 方法

采用当前请求的  实例作为输入,并执行会话状态存储提供程序必需的所有初始化操作。

方法

采用当前请求的  实例作为输入,并执行会话状态存储提供程序必需的所有清理操作。

 方法

释放会话状态存储提供程序不再使用的所有资源。

 方法

采用当前请求的 
 实例和当前请求的  值作为输入。从会话数据存储区中检索会话的值和信息,并在请求持续期间锁定数据存储区中的会话项数据。 方法设置几个输出参数值,这些参数值将数据存储区中当前会话状态项的状态通知给执行调用的 

如果数据存储区中未找到任何会话项数据,则  方法将 arameter">locked 输出参数设置为  方法来为请求创建一个新的  对象。

如果在数据存储区中找到会话项数据但该数据已锁定,则  方法将 arameter">locked 输出参数设置为 arameter">lockAge输出参数设置为当前日期和时间与该项锁定日期和时间的差,将 arameter">lockId 输出参数设置为从数据存储区中检索的锁定标识符,并返回  方法,以尝试检索会话项信息和获取对数据的锁定。如果 arameter">lockAge 输出参数的设置值超过  值, 将调用  方法以清除对会话项数据的锁定,然后再次调用  方法。

如果 arameter">actionFlags 参数用于其  属性为  (1) 则指示会话数据存储区中的项是需要初始化的新会话。通过调用 方法可以创建会话数据存储区中未初始化的项。如果会话数据存储区中的项已经初始化,则

如果提供程序支持无 Cookie 会话,请将  枚举值 (1),则  方法在设置 

 方法

除了不尝试锁定数据存储区中的会话项以外,此方法与  方法执行的操作相同。 方法在 属性设置为 

 方法

采用当前请求的  实例、当前请求的  值、包含要存储的当前会话值的  对象、当前请求的锁定标识符以及指示要存储的数据是属于新会话还是现有会话的值作为输入。

如果  方法使用提供的值将一个新项插入到数据存储区中。否则,数据存储区中的现有项使用提供的值进行更新,并释放对数据的任何锁定。请注意,只有与提供的  值和锁定标识符值匹配的当前应用程序的会话数据才会更新。

调用  方法后, 调用  方法来更新会话项数据的过期日期和时间。

stem.web.sessionstate.sessionstatestoreproviderbase.releaseitemexclusive(v=vs.100).aspx">ReleaseItemExclusive 方法

采用当前请求的  实例、当前请求的  值以及当前请求的锁定标识符作为输入,并释放对会话数据存储区中的项的锁定。在调用 stem.web.sessionstate.sessionstatestoreproviderbase.getitem(v=vs.100).aspx">GetItem 或  方法,并且数据存储区指定被请求项已锁定,但锁定时间已超过 值时会调用此方法。此方法清除锁定,释放该被请求项以供其他请求使用。

stem.web.sessionstate.sessionstatestoreproviderbase.removeitem(v=vs.100).aspx">RemoveItem方法

采用当前请求的  实例、当前请求的  值以及当前请求的锁定标识符作为输入,并删除数据存储区中与提供的 stem.web.sessionstate.httpsessionstate.sessionid(v=vs.100).aspx">SessionID 值、当前应用程序和提供的锁定标识符相匹配的数据存储项的会话信息。此方法在  方法被调用时调用。

方法

采用当前请求的  实例、当前请求的  值以及当前请求的锁定标识符作为输入,并向会话数据存储区添加一个  的未初始化项。

如果 方法用于无 Cookie 会话,这将导致遇到过期会话 ID 时, 会生成一个新的  值。

生成新的  值的过程需要浏览器重定向到包含新生成的会话 ID 的 URL。在包含过期的会话 ID 的初始请求期间,会调用 方法。 获取一个新的  值来替换过期的会话 ID 之后,它会调用 方法以将一个未初始化项添加到会话状态数据存储区中。然后,浏览器重定向到包含新生成的 值的 URL。如果会话数据存储区中存在未初始化项,则可以确保包含新生成的  值的重定向请求被视为新的会话,而不会被误认为是对过期会话的请求。

会话数据存储区中未初始化的项与新生成的  值关联,并且仅包含默认值,其中包括到期日期和时间以及与  和 方法的  枚举值 (1) 相等的  和  方法传递给 ,并针对 指定当前会话是新会话。然后, 将初始化该新会话,并引发 

 方法

采用当前请求的 
 实例和当前会话的  值作为输入,并返回带有空  对象的新的  对象、一个  集合和指定的  值。使用 方法可以检索 ASP.NET 应用程序的  实例。

 方法

采用引用 Global.asax 文件中定义的 支持  参数的局部引用,并且此方法返回 

 由于本机只有SQLServer作为数据存储,所有就用SqlServer作为代码演示,其原理都一样的,直接改成Redis或者其他的就可以。

表结构

. () , , , , , , , () , , )

代码实现

System.Web.Configuration.SessionStateSection sessionStateSection = (System.Web.Configuration.SessionStateSection)System.Configuration.ConfigurationManager.GetSection( _expiresTime = SessionStateStoreData CreateNewStoreData(HttpContext context, SessionStateStoreData( CreateUninitializedItem(HttpContext context, id, (SessionStateEF db = session = Created = Expires = Flags = ( LockDate = Locked = SessionId = LockId = Timeout = ReleaseItemExclusive(HttpContext context, (SessionStateEF db = session = (session == session.Locked = session.Expires = DateTime.Now + RemoveItem(HttpContext context, (SessionStateEF db = session = (session == ResetItemTimeout(HttpContext context, (SessionStateEF db = session = (session == session.Expires = DateTime.Now + SetAndReleaseItemExclusive(HttpContext context,SessionStateStoreData item, lockId, (SessionStateEF db = session = Created = Expires = Flags = ( LockDate = Locked = SessionId = LockId = Timeout = SessionItem = session = db.ASPStateTempSessions.FirstOrDefault(i => i.SessionId == (session == session.Expires = session.Locked = session.LockId = session.SessionItem = SessionStateStoreData GetItem(HttpContext context, locked, TimeSpan lockAge, lockId, DoGet(,context,id, locked, lockAge, lockId, SessionStateStoreData GetItemExclusive(HttpContext context, DoGet(, SessionStateStoreData DoGet( isExclusive,HttpContext context, (SessionStateEF db = item = lockAge = lockId = locked = actions = session = (session == locked = lockAge = session.LockDate - lockId = (session.Expires < lockId = lockId == ? : ()lockId + session.Flags = ( session.LockId = timeout = actions == SessionStateActions.InitializeItem ? SessionStateItemCollection sessionStateItemCollection = (actions == SessionStateActions.None && ! sessionStateItemCollection = item = SessionStateStoreData(sessionStateItemCollection ?? SessionStateItemCollection(),( 序列化反序列化Session的值 SessionStateItemCollection Deserialize( MemoryStream stream = SessionStateItemCollection collection = (stream.Length > BinaryReader reader = collection = MemoryStream ms = BinaryWriter writer = (items != }

最后配置web.config system.web/sessionState

Github地址

最后的最后,decoration: underline;">求推荐

总结

以上是小编为你收集整理的Asp.net 实现Session分布式储存(Redis,Mongodb,Mysql等) sessionState Custom全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

java开发之Redis实现分布式Session管理

java开发之Redis实现分布式Session管理

Redis实现分布式Session管理
Memcached管理机制

Redis管理机制
redis的session管理是利用spring提java培训供的session管理解决方案,将一个应用session交给Redis存储,整个应用中所有session的请求都会去redis中获取对应的session数据。

SpringBoot项目开发Session管理
引入依赖pop.xml

    <!--springboot-redis-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>

    <!--spring-data-redis session 管理-->
    <dependency>
        <groupId>org.springframework.session</groupId>
        <artifactId>spring-session-data-redis</artifactId>
    </dependency>

    <!--排除内嵌tomcat-->
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>provided</scope>
    </dependency>

开发Session管理配置类(使用注解)

@Configuration
@EnableRedisHttpSession //将整个应用中使用session的数据全部交给redis处理
public class RedisSessionManager {

}

Controller层设计
package com.xizi.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

@Controller
@RequestMapping("test")
public class TestController {

//使用redis 的session管理  注意:当session中数据发生变化时必须将session中变化的数据同步到redis中
@RequestMapping("test")
public void test(HttpServletRequest request, HttpServletResponse response) throws IOException {
    List<String> list = (List<String>) request.getSession().getAttribute("list");
    if(list==null){
        list = new ArrayList<>();
    }
    list.add("xxxx");
    request.getSession().setAttribute("list",list);//每次session变化都要同步session

    response.getWriter().println("size: "+list.size());
    response.getWriter().println("sessionid: "+request.getSession().getId());
}

@RequestMapping("logout")
public void logout(HttpServletRequest request){
    //退出登录
    request.getSession().invalidate();//失效
}

}

打包测试

Nginx+Tomcat集群+Redis测试
Nginx相关配置


Tomcat集群

//这是tom4 后面的两个端口号依次+1
//关闭端口
<Server port="8003" shutdown="SHUTDOWN">

//连接端口
<Connector port="8989" protocol="HTTP/1.1"

           connectionTimeout="20000"
           redirectPort="8443" />

<Connector port="10010" protocol="AJP/1.3" redirectPort="8443" />

改变初始页面index.jsp

3.Redis集群
已经开启了,不会的去看我前面的Redis集群搭建博客

测试
上传war包到三个Tomcat的Webapps目录下

直接访问Nginx页面,反向代理了Tomcat集群



GiF演示一波

作者:戏子zzzz

nginx+redis实现session共享

nginx+redis实现session共享

上一篇我们介绍了Nginx实现的负载均衡和动静分离,可看这边。

我们在文章的末尾说到,负载均衡需要面临的一个问题是内存数据的同步。例如:我有A,B两台服务器做了负载均衡,当我在A服务器上执行了登录并且将登录数据存入session的时候,这些session数据只存在于A服务器上,而没有在B服务器上,假如在处理下一个请求的时候,我需要用到session的数据,而不巧的是,这个请求刚好被交由B服务器来处理,这时候就会出现B服务器拿不到session数据的情况,从而造成错误。

这是一个无法避免的问题,有若干的解决方案,归结起来都是要实现session等数据在各负载均衡分支中的同步,第一种想到的方案是把这些数据放在MysqL等数据库,也就是说存在磁盘,但是我们都知道session之所以出现是因为它是在内存中的,程序读取内存的数据要远远比读取磁盘的数据快,所以我们把一些经常用到的东西都放在session里面。

有没有一种数据库,是存放在内存中的呢?这就是redis。通俗的讲,它就是一个数据库,但是这个数据库是存在与内存里面的,所以存取起来速度要比读取磁盘的数据快得多。又因为它是一个数据库,所以可以实现数据的同步。

我们把session数据存放在redis中,然后所有的集群分支都可以去访问这个数据库里面的东西,这就是全局缓存的原理。

1.第一步是安装redis,我的服务器是windows的,下载的是免安装版本,解压以后就可以了,其目录如下。一开始redis是默认不需要密码,如果想要设置密码,可以进入redis.windows.conf文件下找到requirepass,删除前面的#号,在其后面便可以设置密码。

2.从cmd进入redis的根目录,键入如下指令:redis-server.exeredis.windows.conf。这样就可以启动redis了,如果启动成功,则会出现下面画面。当然还可以修改conf文件,加上密码。requirepass xxxxx

3.接下来我们就可以做一些配置工作,来实现session数据的全局缓存。

1)首先是添加jar包,如果你是maven项目,需要在pom.xml加入下面代码

<!-- redis -->
 <dependency>
  <groupId>org.springframework.session</groupId>
  <artifactId>spring-session-data-redis</artifactId>
  <version>1.3.1.RELEASE</version>
  <type>pom</type>
 </dependency>

如果不是maven项目,你需要加入下面这些jar包。

2)编写redis.properties,代码如下

redis_isopen:yes
#主机地址
redis_hostName=xxx.xxx.xxx.xxx
#端口
redis_port=6379
#密码
redis_password=xxxxxxxx
#连接超时时间
redis_timeout=200000
redis_maxIdle:300
redis_maxActive:600
redis_maxWait:100000
redis_testOnBorrow:true

基本上与我们配置数据库的连接语句类似。

3)编写spring-redis.xml配置文件,这个文件配置关于redis的一些基本信息。

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
 xmlns:util="http://www.springframework.org/schema/util" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd ">
 <!-- session设置 maxInactiveIntervalInSeconds为session的失效时间,单位为秒-->
 <beanhttps://www.jb51.cc/tag/dis/" target="_blank">dis.config.annotation.web.http.RedisHttpSessionConfiguration">
 <property name="maxInactiveIntervalInSeconds" value="3600"></property>
 </bean>
 <!-- redis连接池 -->
 <bean id="poolConfig"https://www.jb51.cc/tag/dis/" target="_blank">dis.clients.jedis.JedisPoolConfig">
 <property name="maxIdle" value="${redis_maxIdle}" />
 <property name="testOnBorrow" value="${redis_testOnBorrow}" />
 </bean>
 <!-- redis连接工厂 -->
 <bean id="connectionFactory"https://www.jb51.cc/tag/dis/" target="_blank">dis.connection.jedis.JedisConnectionFactory">
 <property name="hostName" value="${redis_hostName}" />
 <property name="port" value="${redis_port}" />
 <property name="password" value="${redis_password}" />
 <property name="timeout" value="${redis_timeout}" />
 <property name="poolConfig" ref="poolConfig"></property>
 </bean>
</beans>

4)在application.xml(spring的主配置文件)需要加入redis.properties配置文件的扫描,如下。

<!-- 读取redis参数配置 -->
 <bean id="propertyConfigurer"https://www.jb51.cc/tag/fig/" target="_blank">fig.PropertyPlaceholderConfigurer">
 <property name="locations">
  <list>
  <value>/WEB-INF/classes/redis.properties</value>
  </list>
 </property>
 </bean>

5)在主配置文件中引入spring-redis.xml,如下。

<import resource="spring-redis.xml" />

6)在web.xml中,加入关于session的过滤器,只有这样session才会被redis所操纵。

<filter>
 <filter-name>springSessionRepositoryFilter</filter-name>
 <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
 </filter>
 <filter-mapping>
 <filter-name>springSessionRepositoryFilter</filter-name>
 <url-pattern>/*</url-pattern>
 </filter-mapping>

这样以后,我们就实现了redis对session的管理。

7)我们可以安装一个redis的客户端来查看里面的数据,叫做Redis Desktop Manager。如下图,很好用,可以看到redis数据库中的数据。

PS.再退出的时候,需要这样写才不会出错。(ssh项目)

public String yipinExit(){
 Iterator<String>keys=session.keySet().iterator();
 while(keys.hasNext()){
  String key=keys.next();
  session.remove(key);
 }
 return "yipinExit";
 }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。

您可能感兴趣的文章:

PHP+redis实现session共享

PHP+redis实现session共享

这篇文章介绍的内容是关于PHP+redis实现session共享 ,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下

        本篇主要讲述的是如何使用php+redis实现session共享。至于其原理,在此就不再赘述,有需要的小伙伴可以自行百度。这里主要说一下如何实现。


1.为了不同的域名能访问到同一个SESSION_ID,这里把domain设置为统一的。修改php.ini,把默认配置修改为sesssion.cookie_domain=".test.com",

这里的“.test.com”根据自己的需要自行修改。


2.为了使得数据在不同的网站可以访问到,这里选择把session存储在redis中。修改php.ini,把默认配置修改为

session.save_handler=redis,

session.save_path="tcp://192.168.0.120:6379",


3.配置完成后,写一个php文件,里面设置session,运行之后,在redis中会出现一个key,如下:




此时,session就算设置成功了,使用$_SESSION读取刚才设置的值,就可以读出来了。


注:中间可能会遇到redis连接问题,关闭redis的保护模式即可。

相关推荐:

一个php+redis的简单实例分享

请教PHP+Redis实现任务队列的思路

PHP+Redis:hash散列类型


以上就是PHP+redis实现session共享的详细内容,更多请关注php中文网其它相关文章!

关于分布式中Redis实现Session终结篇redis解决分布式session的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于Asp.net 实现Session分布式储存(Redis,Mongodb,Mysql等) sessionState Custom、java开发之Redis实现分布式Session管理、nginx+redis实现session共享、PHP+redis实现session共享等相关知识的信息别忘了在本站进行查找喔。

本文标签:

上一篇EntityFramework之Log

下一篇开放接口的安全验证方案(AES+RSA)(开放api接口安全处理)