一. 背景:

在大访问量的web程序开发中,数据库常常会称为性能的瓶颈。为了缓解数据库的压力,我们频繁的使用缓存,而asp.net自带的Cache很强大,但是有先天的不足,它是进程内的缓存,当站点由多台服务器负载均衡时,当缓存在有数据更新时,我们不能同时将更新后的数据同步到两台或多台web server上。所幸的是老外的大牛开发了memcached分布式缓存,它的性能非凡,memcached常用的.net的client类库有两个分别是:http://code.google.com/p/beitmemcached/,http://sourceforge.net/projects/memcacheddotnet/,我个人推荐使用后一个。

有关memcached的介绍和在控制台中的简单调用请参考:分布式缓存系统Memcached简介与实践

二. 如何使用

  1. 安装memcached server端,下载dot net版本的客户端,请参考分布式缓存系统Memcached简介与实践
  2. 在asp.net项目中使用memcached客户端访问服务端
    思路:
    1) 我们在站点启动时即启动memcached的client端,在站点停止时停掉client端,释放占用的端口资源;
    这一点只要把启动和关闭放到Global的Application_Start和Application_End中执行,即可。由于整个网站的运行期间,我们都希望不需要再重新生成MemcachedClient类的实例,所以我们在Global中声明了一个静态的实例来存放此Client。并用一个public的属性RemoteCache和IsRemoteCacheAvailable来暴露MemcachedClient的引用和其是否可用。
    2) 为了方便使用我们需要建一个System.Web.UI.Page类的基类PageBase,在此基类中引用Memcached client的客户端访问类实例,然后新建的所有aspx页面的基类继承PageBase就可以了。
    这儿也很容已做到,我们只需找到 Global appInstance = HttpContext.Current.ApplicationInstance as Global;然后引用Global中暴露的两个属性即可。需要注意的是在程序中引用Global是通过HttpContext.Current.ApplicationInstance而不是HttpContext.Current.Applicatioin,后者只是一个键值对的集合,而前者是网站的HttpApplication的实例

请参考Global和PageBase的代码:

Global
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.SessionState;

using Memcached.ClientLibrary;
using log4net;

namespace Forum.UI
{
    public class Global : System.Web.HttpApplication
    {
        protected static ILog AppLog = LogManager.GetLogger(typeof(Global));

        public override void Init()
        {
            this.Error += new EventHandler(Application_Error);
            base.Init();
        }


        protected void Application_Error(object sender, EventArgs e)
        {
#if !DEBUG
            Exception ex = Server.GetLastError();
            AppLog.Error(ex.Message, ex);
            Server.ClearError();
            Response.Redirect("~/error/500.htm", true);
#endif
        }

        protected void Application_Start(object sender, EventArgs e)
        {
            SetupMemcachedClient();
        }

        protected void Application_End(object sender, EventArgs e)
        {
            ShutdownMemecachedClient();
        }


        RemoteCache#region RemoteCache
        private static MemcachedClient mc = null;
        private const string MEMCACHED_INSTANCE_NAME = "Memcached-Forum";


        /**//// <summary>
        /// 返回MemcachedClient是否可用
        /// </summary>
        public bool IsRemoteCacheAvailable
        {
            get
            {
                return mc != null;
            }
        }


        /**//// <summary>
        /// 外部访问入口
        /// </summary>
        public MemcachedClient RemoteCache
        {
            get
            {
                return mc;
            }
        }

        /**//// <summary>
        /// 关闭占用的tcp端口资源
        /// </summary>
        private void ShutdownMemecachedClient()
        {
            SockIOPool pool = SockIOPool.GetInstance(MEMCACHED_INSTANCE_NAME);
            if (pool != null) pool.Shutdown();
        }

        /**//// <summary>
        /// 启动memcachedClient,给client赋予指定参数
        /// </summary>
        private void SetupMemcachedClient()
        {
            string memcachedServers = ConfigurationManager.AppSettings["memcachedServers"];
            string[] servers = memcachedServers.Split(';');
            SockIOPool pool = SockIOPool.GetInstance(MEMCACHED_INSTANCE_NAME);
            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();

            mc = new MemcachedClient();
            mc.PoolName = MEMCACHED_INSTANCE_NAME;
            mc.EnableCompression = false;
        }
        #endregion


    }
}
PageBase
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Web.Caching;
using Memcached.ClientLibrary;
using System.Collections.Generic;

using log4net;
using Forum.Models;
using Forum.UI.Proxy;

namespace Forum.UI
{
    public class PageBase : Page
    {
        #region RemoteCache & IsRemoteCacheAvailable

protected MemcachedClient RemoteCache
        {
            get
            {
                if (HttpContext.Current.ApplicationInstance == null) return null;
                Global appInstance = HttpContext.Current.ApplicationInstance as Global;
                if (appInstance == null) return null;

return appInstance.RemoteCache;
            }
        }

protected bool IsRemoteCacheAvailable
        {
            get
            {
                return RemoteCache != null;
            }
        }
        #endregion
        
    }
}

三. 后记

仅仅是个人使用心得,如果有问题,请回复讨论。

在web应用程序中使用MemcachedClient相关推荐

  1. Web应用程序中(VS2005+SP1)添加App_Code(转)

    Web应用程序中(VS2005+SP1)添加App_Code 在Web应用程序中不能通过右键项目-〉"添加"-〉"添加ASP.NET文件夹"方式添加 .因为We ...

  2. spring_在基于Spring的Web应用程序中使用Http Session

    spring 在基于Spring的Web应用程序中拥有和使用Http会话有多种方法. 这是基于最近项目经验的总结. 方法1 只需在需要的HttpSession中注入即可. @Service publi ...

  3. 如何在Web应用程序中使用TWAIN驱动程序的自定义功能?

    如何在Web应用程序中使用TWAIN驱动程序的自定义功能?接下来跟着小编一起来看看如何去实现. 本文适用于以下产品: Dynamic Web TWAIN v7 以上 ImageCapture Suit ...

  4. DotNetCore Web应用程序中的Session管理

    原文来自互联网,由长沙DotNET技术社区编译.如译文侵犯您的署名权或版权,请联系小编,小编将在24小时内删除.限于译者的能力有限,个别语句翻译略显生硬,还请见谅. 作者简介:Jon(Jonathan ...

  5. DotNetCore Web应用程序中的Cookie管理

    原文来自互联网,由长沙DotNET技术社区编译.如译文侵犯您的署名权或版权,请联系小编,小编将在24小时内删除.限于译者的能力有限,个别语句翻译略显生硬,还请见谅. 作者简介:Jon(Jonathan ...

  6. Spring Security并发会话控制示例教程–如何限制Java JEE Web应用程序中的用户会话数...

    如果您不知道, Spring安全性可能会限制用户可以拥有的会话数. 如果要开发Web应用程序,尤其是Java JEE中的安全Web应用程序 ,则必须提出与在线银行门户相似的要求,例如, 每个用户一次只 ...

  7. 如何使用recaptcha_在Spring MVC Web应用程序中使用reCaptcha

    如何使用recaptcha CAPTCHA是一个程序,可以生成人类可以通过但计算机程序" 不能 "通过的测试并对其进行评分. 所采取的策略之一是向用户显示具有扭曲文本的图像,并且用 ...

  8. web csrf java_在Java Web应用程序中阻止CSRF

    web csrf java 跨站点请求伪造攻击(CSRF)在Web应用程序中非常常见,如果允许,可能会造成重大危害. 如果您从未听说过CSRF,建议您查看有关它的OWASP页面 . 幸运的是,阻止CS ...

  9. threadlocal线程_线程故事:Web应用程序中的ThreadLocal

    threadlocal线程 本周,我花了一些合理的时间来消除Web应用程序中的所有ThreadLocal变量. 原因是他们造成了类加载器泄漏,我们不能再适当地取消部署我们的应用程序. 取消部署应用程序 ...

最新文章

  1. linux的底层文件i o,Linux 文件I/O操作
  2. Magicodes.IE编写多框架版本支持和执行单元测试
  3. mmdnn TensorFlow is outdated
  4. 不同类型的变量在内存中存储的详细情况
  5. 在加州最古老的监狱教课是种什么样的体验?
  6. mysql 配置邮件_SQL 邮件配置篇
  7. spring boot 1.5.4 整合redis、拦截器、过滤器、监听器、静态资源配置(十六)
  8. 【3-16】数据库基本编程语句,存储过程,触发器
  9. python的库有哪些餐厅_Python告诉你上海有哪些高性价比的西餐厅
  10. 给.Net程序员和WEB程序员建议 (转自CSDN)
  11. Linux多线程编程实验
  12. Photoshop CC2019安装教程
  13. 量子笔记:量子计算祛魅
  14. Data Analysis - Day7 - Pandas
  15. cydia多开微信_cydia怎么安装微信
  16. 大学计算机文件管理实验步骤,大学计算机实验报告
  17. 化工过程机械类毕业论文文献有哪些?
  18. 高数下|级数4|手写笔记(绝对收敛与条件收敛)
  19. 【经验】转一个非常好的【SCI论文写法攻略】
  20. java 查看对象内存占用大小

热门文章

  1. java图书商城项目介绍_JavaWeb网上图书商城完整项目--11.项目所需jquery函数介绍...
  2. Python入门1_数字表达式
  3. hadoop 实现序列化
  4. Redis设计与实现阅读总结(一)数据结构和对象
  5. 除了比特币之外,区块链还能向汽车行业渗透?
  6. H5项目常见问题汇总及解决方案
  7. 《Spring实战》第一章 — Spring之旅
  8. Thinkphp3.2整合微信支付
  9. IOS socket编程--Asyncsocket
  10. NGINX 502 Bad Gateway 用upstream解决方法