网站Session 处理方式

分布式session有以下几种方案:

1. 基于nfs(net filesystem)的session共享

将共享服务器目录mount各服务器的本地session目录,session读写受共享服务器io限制,不能满足高并发。

2. 基于关系数据库的session共享

这种方案普遍使用。使用关系数据库存储session数据,对于mysql数据库,建议使用heap引擎。 这种方案性能取决于数据库的性能,在高并发下容易造成表锁(虽然可以采用行锁的存储引擎,性能会下降),并且需要自己实现session过期淘汰机制。

3. 基于cookie的session共享

这种方案也在大型互联网中普遍使用,将用户的session加密序列化后以cookie的方式保存在网站根域名下(比如taobao.com),当 用户访问所有二级域名站点式,浏览器会传递所有匹配的根域名的cookie信息,这样实现了用户cookie化session的多服务共享。 此方案能够节省大量服务器资源,缺点是存储的信息长度受到http协议限制;cookie的信息还需要做加密解密; 请求任何资源时都会将cookie附加到http头上传到服务器,占用了一定带宽。

4. 基于resin/tomcat/iis等web容器的session机制

利用容器机制,通过配置即可实现。

5. 基于zookeeper的分布session存储

详见http://my.oschina.net/u/699015/blog/159654

6. 基于redis/memcached的session共享存储

这些key/value非关系存储有较高的性能,轻松达到2000左右的qps,内置的过期机制正好满足session的自动实效特性。

以上方案各有优缺点,本文主要介绍第六种基于redis存储session时,如何实现动态扩容。 redis目前并没有内置高可用集群,很多客户端代理基于一致性hash算法能够实现分布式存储,但是扩容并不方便(需要成倍扩容),目前我们采用了淘宝 fourinone中session方案的思想:

a. 用于存储session的redis集群有多个redis节点

b. proxy记录了每个节点加入到集群的时间,并按照时间顺序对节点进行了编号(0—n)

c. session key的生成算法方面,需要在session key中包含生成时的当前日期(可考虑细化到小时还是分秒),在session key生成后,再进行取模运算  hash(sesionKey)%redisHost_count,  根据取模结果决定当前session值存储到落到哪个节点上存储。

d. 再通过sessionkey获取session信息时,根据当前sessionKey取出时间部分,再根据取出的时间与redis集群中所有的节点的添加 时间进行比较,筛选出所有addtime<sessionkey_time的节点,再进行c中的取模计算,由于即使这期间进行了扩容,由于进行了时 间匹配,redisHost_count也不会发生变化,所以取模结果和存储此session时一样,还会落到当时存储这个session的节点上,在那 个节点能够得到此session的值。

但是对于这种部署结果如何能够保障高可用性,如何应对单点故障,后续会在redis高可用方案中介绍。

网站Session 处理方式

时间: 2024-12-16 09:16:59

网站Session 处理方式的相关文章

Shiro源码分析之两种Session的方式

1.Shiro默认的Session处理方式 <!-- 定义 Shiro 主要业务对象 --> <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <!-- <property name="sessionManager" ref="sessionManager" />

Shiro源代码分析之两种Session的方式

1.Shiro默认的Session处理方式 <!-- 定义 Shiro 主要业务对象 --> <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <!-- <property name="sessionManager" ref="sessionManager" />

C#获得和发送网站Session

request = (HttpWebRequest)WebRequest.Create(url);                                         if (Const.session != null)                {                    request.Headers.Add("Cookie", Const.session);                }                 request.Timeo

PHP中的Session储存方式优化

1:查看当前PHP版本中Seesion支持的储存方式   可以看出当前Session支持的储存方式有以下几种 files:文件模式,PHP默认的储存方式,把储存的值放在服务器的指定目录里 user:用户模式,暂时不了解 redis:支持redis储存.通过上面的图,可以看出当前session是redis储存,并指定了连接信息 memcache:支持memcache储存 2:redis|memcache储存的配置方式(支持redis|memcache拓展) 一:php.ini配置(推荐) sess

钉钉扫码登录网站(两种方式实现)

原文:钉钉扫码登录网站(两种方式实现) 钉钉扫码登录网站(两种方式实现)# 效果:# 源代码地址:https://github.com/jellydong/DingQrCodeLogin 动手敲代码!# 第一步,钉钉后台配置 参考链接:获取appId及appSecret. 点击进入钉钉开发者平台 的页面,点击左侧菜单的[移动接入应用-登录],然后点击右上角的[创建扫码登录应用授权],创建用于免登过程中验证身份的appId及appSecret,创建后即可看到appId和appSecret. 这里因

分布式集群下的Session存储方式窥探

传统的应用服务器,自身实现的session管理是大多是基于单机的,对于大型分布式网站来说,支撑其业务的远远不止一台服务器,而是一个分布式集群,请求在不同的服务器之间跳转.那么,如何保持服务器之前的session同步呢? 分布式环境下,如果一次请求被负载均衡分配到了服务器A,如果按照一般的方式存储session,在A的本地会存储session,如果此次会话没有结束,下一次的请求被负载均衡到了B服务器(或者其他的非A服务器)那么上次的请求的session信息将不再存在.如果不做任何处理的话,用户将出

网站攻击的方式有哪几种

1.xss(跨站脚本攻击):富文本.评论 利用站点开放的文本编辑并发布的功能,输入并执行js脚本,窃取cookie等敏感信息. 预防方法: 方法一:cookie添加httpOnly属性,这是使用js是不能读取和操作cookie的. 方法二:在cookie中添加校验信息. 方法三:对用户输入进行编码(encode).过滤(移除style.script.iframe相关节点).校正() js编码解码: 1.使用参数时,使用encodeURIComponent 2.进行url跳转时,使用encodeU

现在网站主流排版方式

CSS(Cascading Style Sheets)层叠样式表 直到现在为止,大部分网站仍使用css加div的方式进行排版,用html中的div标签划分区域,然后通过关联css文件的方式对指定区域的样式进行指定,这种做法的好处在于可以将网页的表示内容和显示样式分开,提高了网页的维护性,降低了日后维护的人力成本,维护者只需要修改相对应的css文件,就可以很容易的做到在不改变网页显示内容的前提下,对网页的部分分区进行样式的改动,不仅如此,采用关联css文件的方式,还可以在一定程度上增强网页的显示效

hibernate中一种导致a different object with the same identifier value was already associated with the session错误方式及解决方法

先将自己出现错误的全部代码都贴出来: hibernate.cfg.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-con