学习到好的知识还是需要记录下来的。
开发环境 asp.net mvc4,iis。asp.net 自带的session机制存在诸多不好的地方。先只要列出几点。
  1. asp.net mvc 默认的session模式mode为InProc。很多向我这样的菜鸟是没有意识去修改它的。这模式下的话是session的保存的东西是存储在服务器内存的。而服务器的资源是有限的,当用户访问量大的时候,对服务器的内存压力会比极大,很可能会导致内存溢出。
  2. Session 支持其它模式。mode="SQLServer",mode="StateServer".这两种模式下,会比默认的方式减低了服务压力,但在每次请求时,不管你用不用session,都会为你准备好,这其实是很浪费时间的。
  3. 如果你没有关闭session,SessionStateModule就一直在工作,会对每个请求执行一系列的调用,浪费资源。
  4. 当iis或服务器重启,session会丢失。为防止内存溢出,服务器会长时间把没有活跃的session从内存删除。这在用户体验的角度来说,是非常不好的。而且session产出之后,需要服务器一直来维护(比如过期,从内存中删掉),这也是需要消耗服务器资源的。本身windows服务器的成本就不低了。这么耗着,是挺浪费的。
  5. 不能保证过期时间。session默认设置过期时间为20分钟。但我在实际的应用中经常会出现不到20分钟就不能使用的状况。session里面存的容量太大导致的。
  6. 不能跨服务器访问。session是存在服务器内存的。不能为其他服务器所访问。对部署分布式系统是非常不利的。
为了解决以上的问题,我现在的解决方案是:redis+cookie。首先说明一下为什么选择这么做的原因。
 
      redis是一个key-value存储系统。
  • 操作非常的方便,容易上手。跟它同类型的有memcached。但服务器断电后数据并不会丢失,这是redis好的一个点。
  • 其次,redis支持分布式拓展,且方便。关于两者比较,这里不做细说。
cookie的话,主流的浏览器都支持的了。可能有人会说会有人会禁用cookie,这个只能提示用户开启来解决了。大部分的人还是不会关闭的喔。
 
业务如下:保存用户的登录状态,设置过期时间为7天。
user的数据结构
public class user{
    public string userid{get;set;}
    public string username{get;set;}
    public string gender{get;set;}
    public string avatar{get;set;}
    public int age{get;set;}
}
该将什么数据保存在cookie中呢。这个时候是需要认真看看cookie的本意了。cookie,小饼干。cookie是浏览器专用,用来记录保存数据的工具。保存在cookie的文件不能过大。好像是每个网站最多3M吧,要省着点花。哈哈。。。。
 
我选择把userid的数据保存在cookie中,为什么呢。首先userid的来源是数据库主键,是唯一。二,userid也无实际的意义。窃取了并不会获得很多的信息。
 
初期准备
  1. userid需要进行可逆加密。原因:虽说userid被选择来暴露的,但还是得保护一下咯。为什么是可逆加密呢。这个数据是需要使用的,当然是需要可逆的。我在哪里使用到呢。这个userid与redis的key有相关。
  2. 既然说不需要使用内置session了。那就关闭它。要不然就这样让它在那里耗着服务器资源是太好了。怎么关闭呢。全局关闭session的方法:在web.config的<system.web></system.web>中加入 <sessionState mode="Off"></sessionState>。这就成功关闭咯。哈哈哈。。。
  3. 准备好RedisHelper。这主要是对redis相关操作的封装。还是很容易理解和包装的。要注意程序池的分配。
总算准备好了。
步骤
  1. 在用户登录的时候,把加密后的userid写入cookie.设置有效期为7天。
  2. 写入cookie后,把用户数据写入redis。redis的可以值为“u”+userid,value为user实体。同时也要设置key-value的有效期为7天。这就完成了基本的存储。
  3. 用户拥有cookie之后,每次访问,用户都会把cookie发送到服务器。这个时候需要对cookie进行实时刷新有效期。这里该怎么做是最好的呢。还要想。特性吧。为什么要这步呢?用户cookie的有效期是7天,但是用户在7天内登录的话,是要刷新cookie的有效期的喔。
  4. 实时刷新redis中"u"+userid键值对的有效期。在刷新cookie时,随后就去刷新redis吧。
  5. 判断cookie是否过期或有效。先判断cookie的有效期,其次获取redis对应的键值对。如果redis中查找不到对应的键值对,也就是过期的节奏了。
这就写完了。写的有点乱。。。。。有空整理好代码贴上去。
 
最后贴上一些很不错的与本文相关的文章。感谢他们的分享。爱分享的人与你们同在。
http://www.2cto.com/kf/201205/133998.html 配置Session变量的生命周期

基于redis实现分布式Session的更多相关文章

  1. Tornado 自定义session,与一致性哈希 ,基于redis 构建分布式 session框架

    Tornado 自定义session,与一致性哈希 ,基于redis 构建分布式 session import tornado.ioloop import tornado.web from myhas ...

  2. 基于Redis的分布式锁真的安全吗?

    说明: 我前段时间写了一篇用consul实现分布式锁,感觉理解的也不是很好,直到我看到了这2篇写分布式锁的讨论,真的是很佩服作者严谨的态度, 把这种分布式锁研究的这么透彻,作者这种技术态度真的值得我好 ...

  3. Spring+Shiro搭建基于Redis的分布式权限系统(有实例)

    摘要: 简单介绍使用Spring+Shiro搭建基于Redis的分布式权限系统. 这篇主要介绍Shiro如何与redis结合搭建分布式权限系统,至于如何使用和配置Shiro就不多说了.完整实例下载地址 ...

  4. 170222、使用Spring Session和Redis解决分布式Session跨域共享问题

    使用Spring Session和Redis解决分布式Session跨域共享问题 原创 2017-02-27 徐刘根 Java后端技术 前言 对于分布式使用Nginx+Tomcat实现负载均衡,最常用 ...

  5. 基于Redis的分布式锁到底安全吗(下)?

    2017-02-24 自从我写完这个话题的上半部分之后,就感觉头脑中出现了许多细小的声音,久久挥之不去.它们就像是在为了一些鸡毛蒜皮的小事而相互争吵个不停.的确,有关分布式的话题就是这样,琐碎异常,而 ...

  6. 基于redis的处理session的方法

    一个基于redis的处理session的方法,如下. <?php class Session_custom { private $redis; // redis实例 private $prefi ...

  7. 基于redis 实现分布式锁的方案

    在电商项目中,经常有秒杀这样的活动促销,在并发访问下,很容易出现上述问题.如果在库存操作上,加锁就可以避免库存卖超的问题.分布式锁使分布式系统之间同步访问共享资源的一种方式 基于redis实现分布式锁 ...

  8. 基于redis的分布式锁

    <?php /** * 基于redis的分布式锁 * * 参考开源代码: * http://nleach.com/post/31299575840/redis-mutex-in-php * * ...

  9. 基于ZooKeeper的分布式Session实现(转)

    1.   认识ZooKeeper ZooKeeper—— “动物园管理员”.动物园里当然有好多的动物,游客可以根据动物园提供的向导图到不同的场馆观赏各种类型的动物,而不是像走在原始丛林里,心惊胆颤的被 ...

随机推荐

  1. 【学习记录】二分查找的C++实现,代码逐步优化

    二分查找的思想很简单,它是针对于有序数组的,相当于数组(设为int a[N])排成一颗二叉平衡树(左子节点<=父节点<=右子节点),然后从根节点(对应数组下标a[N/2])开始判断,若值& ...

  2. JVM内存管理之垃圾搜集器精解(让你在垃圾搜集器的世界里耍的游刃有余)

    引言 在上一章我们已经探讨过hotspot上垃圾搜集器的实现,一共有六种实现六种组合.本次LZ与各位一起探讨下这六种搜集器各自的威力以及组合的威力如何. 为了方便各位的观看与对比,LZ决定采用当初写设 ...

  3. 将xml转为array

    /** * 将xml转为array * @param string $xml * @throws Exception */ public function FromXml($xml) { if (!$ ...

  4. java web 程序---登陆验证session。提示登陆

    loigin.jsp <%@ page language="java" import="java.util.*" pageEncoding="g ...

  5. 第五章 用Helm部署Istio

    5.1 Istio Chart概述 Helm是目前Istio官方推荐的安装方式.还可以对输入值进行一些调整,完成对Istio的部分配置工作.Istio Chart是一个总分结构,其分级结构和设计结构是 ...

  6. jdk ssl证书

  7. 第一个Net+Mysql的例子,比想象的简单很多

    1.window下安装mysql,比较简单,完全的图形化界面,不用看文档一路点击下来也ok,注意中间几个configtype选项就可以. 2.安装MySql Net的驱动程序程序,安装完后就是几个dl ...

  8. SQL Server 2008系统信息查询常用命令 查看表大小、记录数等

    1.返回所有数据库信息(数据库名,创建日期,存储路径等).   use master; GO select * from dbo.sysdatabases 2.返回当前数据库所有对象(可根据type字 ...

  9. linux加程序是否当掉检测脚本

    cd $(dirname $) source ~/.bash_profile SYSTEM_TIME=`date '+%Y-%m-%d %T'` count=`ps -ef |grep "p ...

  10. apache 自定义404错误页面

    1.有些提供web服务的网站,在用户访问一个不存在的网站文件时,会提示404错误,如下所示: 现在要求自定义一个错误页面,也就是出现404错误代码时,跳转到我们自定义的网址上.下面记录下方法: 1.编 ...