学习到好的知识还是需要记录下来的。
开发环境 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. php常用字符串数组函数

    Php常用的数组函数 键值操作 Array_values($arr) 获取数据的值 Array_keys($arr) 获取数组的key Array_flip($arr) 数组键值反转 In_array ...

  2. one2many &&many2many

    只记录双向的情况(双向是单向的一种)  @OneToMany 和 @ManyToOne :一个Group 包含多个 User; Group.class package com.XX.model; im ...

  3. cx_Oracle.DatabaseError: ORA-12541: TNS:no listener

    问题:利用Python连接Oracle时报错,完整过程如下 import cx_Oracle conn = cx_Oracle.connect('testma/dingjia@192.168.88.1 ...

  4. C++实现进制转换

    知识内容: 1.string类基本使用 2.10进制转2进制 3.10进制转8进制和10进制转16进制 4.上述3种转换的递归实现 注:进制的表示: 二进制:开头是0b,eg: 0b1011(注:c/ ...

  5. 转:Ubuntu下下载工具安装--uget+aria2

    原文地址:http://burner1024.blog.163.com/blog/static/17447800420126191858424/ Windows下的下载工具--迅雷,之所以下载速度快, ...

  6. 初识ansible

    一 . 初识ansible 1 . 准备工作: 准备四台干净的虚拟机, 192.168.133.129(主控节点,下面三个为被控节点) 192.168.133.130 192.168.133.131 ...

  7. 腾讯安全反病毒实验室解读“Wannacry”勒索软件

    背景 针对昨日英国医院被攻击,随后肆虐中国高校的 WannaCry 勒索事件,腾讯安全反病毒实验室第一时间给出了深度权威的分析.此次勒索事件与以往相比最大的亮点在于,勒索病毒结合了蠕虫的方式进行传播, ...

  8. python的socket编程之udp编程

    在上篇文章中,仅仅讲述了如何进行了TCP编程,在本章中,将讲述使用udp进行编码,先看如下的代码,服务器端: root@python 513]# cat serverudp.py #!/usr/bin ...

  9. 跟我学算法聚类(DBSCAN)

    DBSCAN 是一种基于密度的分类方法 若一个点的密度达到算法设定的阖值则其为核心点(即R领域内点的数量不小于minPts) 所以对于DBSCAN需要设定的参数为两个半径和minPts 我们以一个啤酒 ...

  10. VNC Linux 远程桌面控制软件

    简介: VNC (Virtual Network Computer)是虚拟网络计算机的缩写. VNC 是一款优秀的远程控制工具软件,VNC 是在基于 UNIX 和 Linux 操作系统的免费的开源软件 ...