zoukankan      html  css  js  c++  java
  • 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"/> ;即要求集群有相同的值。

  • 相关阅读:
    Linux命令: ls -l显示文件和目录的详细资料
    Linux命令: ls -F
    Linux命令: pwd显示工作路径
    Linux命令: cd /home 进入'/home'目录
    Linux命令: cd ../.. 返回上两级目录
    Linux命令: cd
    boost::mpl::eval_if的使用方法
    【block第四篇】实现
    Android中pendingIntent的深入理解
    hdu 1565 方格取数(1)(状态压缩dp)
  • 原文地址:https://www.cnblogs.com/gowhy/p/2824999.html
Copyright © 2011-2022 走看看