大家都知道用系统默认的session 会存在这样的问题 如果用户过多的话 session 会自动消亡,而且不能支持分布式和集群。

  这系列博客主要讲解  怎样 解决用户过多的session自动消亡,和分布式集群

  使用例子

 Session["test"] = "啄木鸟";  
完全不改变系统的使用风格,可以直接升级系统;

 

   在这里我们主要用的 HttpRuntime.cache 和 memcache。 希望读者这跟着我的思路,一步一步来设计自定义Session

  首先,我们想既然有两个数据存取工具,就必须有一个接口  来解耦使用的他的类,从而可以轻而易举的切换数据存储工具,而不影响使用它的类

 接口如下:

  

 public interface ICache
{
/// <summary>
/// 数据加入缓存,并使用全局配置的过期时间
/// </summary>
/// <param name="key">键</param>
/// <param name="obj">数据</param>
void Put(string key, object obj);
/// <summary>
/// 数据加入缓存,并指定过期时间(分钟)
/// </summary>
/// <param name="key">键</param>
/// <param name="obj">数据</param>
/// <param name="expireMinutes">过期时间</param>
void Put(string key, object obj, int expireMinutes);
/// <summary>
/// 拿出缓存数据
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
object Get(string key);
/// <summary>
/// 手动删除缓存数据
/// </summary>
/// <param name="key"></param>
void Delete(string key);
}

  接下来 我们来实现这两个数据存储工具类

  一个是系统自带的HttpRuntime.cache

  

 public class RuntimeCache:ICache
{
readonly static System.Web.Caching.Cache httpRuntimeCache = System.Web.HttpRuntime.Cache;
readonly static int _expireMinutes = 20; //ConfigConstants.ConfigManager.Config.Cache_ExpireMinutes;配置默认多少秒过时
public void Put(string key, object obj)
{
httpRuntimeCache.Insert(key,obj);
} public void Put(string key, object obj, int expireMinutes)
{
httpRuntimeCache.Insert(key, obj, null, System.Web.Caching.Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(expireMinutes));
} public object Get(string key)
{
return httpRuntimeCache.Get(key);
} public void Delete(string key)
{
httpRuntimeCache.Remove(key);
}
}

  上面这个工具我想大家多知道,如果不知道的可以百度 HttpRuntime.Cache  来学习 ,在这里我就不讲解了(其实里面有很多的设计思路可以学习)

  另一个的就是memcache,redis 我会在后面加上去

  

 public class MemcacheCache:ICache
{
private static readonly MemcachedClient m_memcachedClient;
private static string m_memcacheStr = ConfigConstants.FrameConfigManager.Config.MemcacheStr ?? "127.0.0.1:11211";
static MemcacheCache()
{ string[] servers = m_memcacheStr.Split(',');//
try
{
//初始化池
SockIOPool pool = SockIOPool.GetInstance();
pool.SetServers(servers);
pool.InitConnections = 3;
pool.MinConnections = 3;
pool.MaxConnections = 5;
pool.SocketConnectTimeout = 1000;
pool.SocketTimeout = 3000;
pool.MaintenanceSleep = 30;
pool.Failover = true;
pool.Nagle = false;
pool.Initialize();
m_memcachedClient = new Memcached.ClientLibrary.MemcachedClient();
m_memcachedClient.EnableCompression = false;
}
catch (Exception ex)
{
int i = 0;
}
} public void Put(string key, object obj)
{
m_memcachedClient.Set(key, obj);
} public void Put(string key, object obj, int expireMinutes)
{
m_memcachedClient.Set(key, obj, DateTime.Now.AddMinutes(expireMinutes));
} public object Get(string key)
{
return m_memcachedClient.Get(key);
} public void Delete(string key)
{
m_memcachedClient.Delete(key);
}
}

    memcache的详细配置,可以找其他资料学习

  

    到这里为止,是不是感觉有点像我们的工厂模式 前段,没错就要用到工厂模式

     我们再新建一个类 叫做

    

 /// <summary>
/// 缓存管理者
/// </summary>
public class CacheManager :Singleton<CacheManager>,ICache
{
#region 私有变量
private static string _cacheProvider = ConfigConstants.FrameConfigManager.Config.Cache_Provider ?? "runtimecache";
private ICache _iCache; #endregion #region 构造方法
/// <summary>
/// 类构造方法,对外不支持创建它的实例对象
/// </summary>
static CacheManager() { }
private CacheManager()
{
switch (_cacheProvider.ToLower())
{
case"runtimecache":
_iCache = new RuntimeCache();
break;
case "memcachecache":
_iCache = new MemcacheCache();
break;
default:
throw new ArgumentException("缓存提供者只支持RunTimeCache和RedisCache");
}
}
#endregion
public void Put(string key, object obj)
{
_iCache.Put(key, obj);
} public void Put(string key, object obj, int expireMinutes)
{
_iCache.Put(key,obj,expireMinutes);
} public object Get(string key)
{
return _iCache.Get(key);
} public void Delete(string key)
{
_iCache.Delete(key);
}
}

  我想这个类 大家都能看的懂,唯有这个Singleton<CacheManager> 大家可能有点 不能明白,因为这个是我自己分装的单例模式,只要继承了他,这个类就是单利了,我会再下一次博客讲明白怎样分装的。到这里我们就实现了使用和提供解耦,我 想告诉大家的就是设计模式会根据你的代码量来循循渐进,不要特意看设计模式

  我们有了这些准备,下一篇就好讲如何自定义session

  

Asp.net Mvc 自定义Session (一),的更多相关文章

  1. Asp.net Mvc 自定义Session (二)

    在 Asp.net Mvc 自定义Session (一)中我们把数据缓存工具类写好了,今天在我们在这篇把 剩下的自定义Session写完 首先还请大家跟着我的思路一步步的来实现,既然我们要自定义Ses ...

  2. ASP.NET MVC 自定义Razor视图WorkContext

    概述 1.在ASP.NET MVC项目开发的过程中,我们经常需要在cshtml的视图层输出一些公用信息 比如:页面Title.服务器日期时间.页面关键字.关键字描述.系统版本号.资源版本号等 2.普通 ...

  3. 转载ASP.NET MVC中Session的处理机制

    本文章转载自 http://www.cnblogs.com/darrenji/p/3951065.html ASP.NET MVC中的Session以及处理方式   最近在ASP.NET MVC项目中 ...

  4. asp.net mvc 自定义pager封装与优化

    asp.net mvc 自定义pager封装与优化 Intro 之前做了一个通用的分页组件,但是有些不足,从翻页事件和分页样式都融合在后台代码中,到翻页事件可以自定义,再到翻页和样式都和代码分离, 自 ...

  5. ASP.NET MVC 自定义路由中几个需要注意的小细节

    本文主要记录在ASP.NET MVC自定义路由时,一个需要注意的参数设置小细节. 举例来说,就是在访问 http://localhost/Home/About/arg1/arg2/arg3 这样的自定 ...

  6. Asp.net mvc 自定义全局的错误事件HandleErrorAttribute无效

    Asp.net mvc 自定义全局的错误事件HandleErrorAttribute,结果无效, 原因: 1.没有在RegisterGlobalFilters 里面添加或者你要的位置添加. 2.你把这 ...

  7. 实现Asp.net Mvc分布式Session Redis群集

    Redis群集实现Asp.net Mvc分布式Session Session的缺点 众所周知Asp.net Session默认存储在IIS中,IIS的重启会导致Session丢失. 如果你的网站使用了 ...

  8. ASP.NET MVC自定义验证Authorize Attribute(包含cookie helper)

    前几天Insus.NET有在数据库实现过对某一字段进行加密码与解密<使用EncryptByPassPhrase和DecryptByPassPhrase对MS SQLServer某一字段时行加密和 ...

  9. asp.net MVC 自定义模型绑定 从客户端中检测到有潜在危险的 Request.QueryString 值

    asp.net mvc 自定义模型绑定 有潜在的Requset.Form 自定义了一个模型绑定器.前端会传过来一些敏感字符.调用bindContext. valueProvider.GetValue( ...

随机推荐

  1. 安装完QQ必须要删除掉的几个恐怖文件

    安装完QQ必须要删除掉的几个恐怖文件 感谢 QQ很可怕 的投递 很多关注自己电脑硬件温度的朋友,一般都懂得去查看什么进程占用CPU较高,可能发现过有这么几个进程的CPU占用会有时莫名其妙的非常之高,它 ...

  2. AT&T 和 Intel 汇编语法的主要区别

    转自AT&T 和 Intel 汇编语法的主要区别 作为一个爱折腾的大好青年,补番之余还要补一些 Linux 下的基础,比如 GDB 的正确使用方法.但无论是看 gdb 还是 gcc -S 里的 ...

  3. 如何成为python高手(转)

    http://www.cnblogs.com/xupeizhi/p/3207976.html#2896469 如何成为python高手 本文是从 How to become a proficient ...

  4. 上次的AJAX定时刷新多ID不正确,这次请教了高手之后补全

    关键是setInterval无法传递参数,所以用了匿名函数再包裹一下就好了. //重置发布进度 function resetPercent(id_data){ $.ajax({ url:'/autod ...

  5. mysql导出数据库几种方法

    方法一 cmd 到mysql bin目录下用 如下命令 mysqldump --opt -h192.168.0.156 -uusername -ppassword --skip-lock-tables ...

  6. ANDROID_MARS学习笔记_S02_002_Date\TimePicker

    一.文档用法 1.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" ...

  7. Altium查看所有快捷键,图文教程

    方式一:依次打开“查看”>>"工作区面板">>“Help”>>“快捷方式”.即可. 英文版“快捷方式”为“shotcut” 方式二: 留意右下角 ...

  8. Django中的Model继承

    Django 中的 model 继承和 Python 中的类继承非常相似,只不过你要选择具体的实现方式:让父 model 拥有独立的数据库:还是让父 model 只包含基本的公共信息,而这些信息只能由 ...

  9. ruby quiz The Solitaire Cipher

    solitaire cipher:http://en.wikipedia.org/wiki/Solitaire_(cipher) https://www.schneier.com/solitaire. ...

  10. 【HDOJ】1018 Big Number

    数学题,还是使用log避免大数,但是不要忘记需要+1,因为0也是1位,log(100)= 2,但却是3位. #include <stdio.h> #include <math.h&g ...