NET下Session共享的几种实现方式

一、把用户ID加密存储在Cookie中

1.  把用户ID,用可逆加密的方式,存储于Cookie中。当用户登陆成功时,ID经过加密存储。用户第一次访问A页面,通过解密ID,如果解密成功,然后调用SOA(或者其他分布式服务实现,可以达到随意扩展,而不用更改调用端),获取用户信息,然后把用户信息存储在Session中,如果这时用户从A页面跳转到B页面,同样可以通过解密获取用户信息。这样导致的问题是,大量访问登陆服务,降低了Session的利用率。如果能实现,同一个用户固定负载均衡到同一台服务器上,就可以实现比较高的Session利用率。

2.  可以随时更换密钥,但是必须所有服务器都使用相同的密钥,否则会出现混乱。

3.  如果客户端禁用Cookie将产生致命问题。

4.  Cookie容量有限,存储的数据量必须要严格控制,并且把一组信息写到同一个Cookie中,避免过多的Cookie。

二、把Session写到Memcache、Redis等分布式共享缓存中。

1.  必须实现分布式缓存的容灾机制,否则一台机器挂掉,将导致大量用户不能登陆。

2.  并且要能水平扩展,这将导致分布式缓存的维护成本上升。

三、把Session存放在数据库中。

1.  可靠性高,进程挂掉,也能处理。

2.  需要单独程序的实现,数据库开销大。

3.  数据库会是单点,可以用Hash的方式解决。

四、NET提供把Session存储在内存中。

1.  可以是单独的存储Session的服务器的内存中,也可以是和IIS同一台机器的内存中,集群化实现比较困难,如果Session存放在单独一台机器,其也是单点,有风险;如果存放和IIS同一台机器上,集群化有实现不易,负载均衡受制,必须保证同一个用户,一直访问同一台机器才能保证Session。

五、NET也提供把Session存储在IIS进程中。

1.  问题同把Session存放在内存中。

2.  同时由于和IIS共有进程,可能由于IIS的问题导致Session无法使用问题,崩溃的几率上升。

六、无聊想法自定义的Session解决方案。

1.  把用户ID加密存储在Cookie中,通过“方式一”,解密得到用户ID,然后把用户相关信息,存储在Memcache/Redis等上,用户再次访问时,优先从分布式缓存上取用户更多信息,如果没有从数据库中去取,然后同时以异步的方式把用户信息,缓存,而且分布式缓存的淘汰算法,是最近最少使用法。其实现方式是封装在基类中,在分布式缓存上,存储基于ID的key/Value数据。即使挂掉也可以从数据库中恢复用户的主要信息。

2.  该方式是基于加密算法和分布式缓存的结合体。

七、NET的Session值的共享,需要在配置machineKey。

1. 配置sessionState置节点,使用StateServer或SQLServer来实现Session共享。

为实现跨服务器共享,必须在Web.config配置:

<machineKey decryptionKey="FD69B2EB9A11E3063518F1932E314E4AA1577BF0B824F369" validationKey="5F32295C31223A362286DD5777916FCD0FD2A8EF882783FD3E29AB1FCDFE931F8FA45A8E468B7A40269E50A748778CBB8DB2262D44A86BBCEA96DCA46CBC05C3" validation="SHA1" decryption="Auto"/> ;即要求集群有相同的值。

 

posted @ 2012-12-19 15:17  狼-志  阅读(3653)  评论(0编辑  收藏  举报