一切福田,不離方寸,從心而覓,感無不通。

ASP.NET缓存全解析7:第三方分布式缓存解决方案 Memcached和Cacheman

Memcached — 分布式缓存系统 1.Memcached是什么? Memcached是高性能的,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度。Memcached通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。Memcached由Danga Interactive最初为了加速 LiveJournal网站访问速度而开发的,后来被很多大型的网站采用。起初作者编写它可能是为了提高动态网页应用,为了减轻数据库检索的压力,来做的这个缓存系统。它的缓存是一种分布式的,也就是可以允许不同主机上的多个用户同时访问这个缓存系统,这种方法不仅解决了共享内存只能是单机的弊端, 同时也解决了数据库检索的压力,最大的优点是提高了访问获取数据的速度!基于memcached作者对分布式cache的理解和解决方案。memcached完全可以用到其他地方 比如分布式数据库,分布式计算等领域。Memcached将数据库负载大幅度降低,更好的分配资源,更快速访问。 2.Memcached工作机制 通过在内存中开辟一块区域来维持一个大的hash表来加快页面访问速度,和数据库是独立的。但是目前主要用来缓存数据库的数据。允许多个server通过网络形成一个大的hash,用户不必关心数据存放在哪,只调用相关接口就可。存放在内存的数据通过LRU算法进行淘汰出内存。同时可以通过删除和设置失效时间来淘汰存放在内存的数据。 现在一些.NET开发人员开始放弃ASP.NET内置的缓存机制,转而使用Memcached——一种分布式的内存缓存系统。当运行在单独的Web服务器上,你可以很容易地清除一个已经确认被改变了的缓存。可惜,ASP.NET没有一个很好的方法来支持多服务器。每个服务器上的缓存都对其他缓存的改变一无所知。 ASP.NET允许通过基于文件系统和数据库表的触发器来作废一个缓存。然而,这也存在问题,比如数据库触发器需要使用昂贵的轮询,以及触发器本身冗长的编程。但是,我们还是有其他的选择的。 不像ASP.NET内置的缓存机制,Memcached是一个分布式的缓存系统。任何Web服务器都能更新或删除一个缓存项,并且所有其他的服务器都能在下次访问这些缓存项的时候自动获取到更新的内容。这是通过把这些缓存项存储在一个或者多个缓存服务器上来实现的。每一个缓存项都根据它的关键字的哈希值来分配到一个服务器上。 表面看来,Memcached针对ASP.NET的API就像和内置的API一样。这让开发人员很容易地转换到Memcached上,仅仅通过在代码中查找和替换即可实现。 一个被推荐的解决方案是不根据缓存项的关键字来生成哈希键值。这将允许开发人员能够让一个给定页面中需要的所有缓存项,尽量存放在同一个服务器上。可惜,基于数据保存的地方而不是基于缓存项自身的关键字来生成哈希键,很容易产生错误,需要仔细来实现(这个算法)。 Memcached是基于Linux运行的,你可以在BSD的许可协议下使用Memcached。他也提供了针对C#的客户端以及Perl、Python、PHP、Java和其他语言的API:http://www.danga.com/memcached/apis.bml。还有一个Win32的移植版本(http://jehiah.cz/projects/memcached-win32/),可以让Memcached运行在非Linux的机器上。 Cacheman — .NET架构下的分布式缓存项目 Cacheman据说是由微软旗下的 Popfly 项目组成员 Sriram Krishnan 的作品。是他用业余时间开发的。最新的情况是,微软的 Popfly 网站已经“悄悄地”的做了更新,就是采用了 Krishnan 的 Cacheman,更新了缓存机制。该项缓存技术更新带来的性能提升非常显著,根据Popfly团队中的 John Montgomery 的说法:加载一个已有的Mashup应用时,可以带来2到6倍的性能提升。 这些说法也得到了 Krishnan 本人的确认。他提到这是Cacheman 的第一次的实际应用,并自豪的说 Cacheman 不费吹灰之力就拿下了 Popfly 的全部访问量。 简单介绍一下 Cacheman 这个项目。资料主要来源于 Krishnan的博客对Cacheman的介绍。 Cacheman是一个基于Windows平台的快速分布式哈希表。是由纯托管代码实现。中间搁置了有几个月,直到最近才开始重新上马这个项目,极可能就是因为Popfly项目需要的缘故才开始着手的。 Krishnan本人对 memcached 很感兴趣,于是创建了 Cacheman。Cacheman上有很多 memcached 的影子,比如与memcached相似的文本通讯协议。Cacheman的通讯协议公开,任何人可以根据自己偏爱的语言环境写客户端。 Krishnan 在自己家用电脑(2.4GHz Intel Core 2 带2GB内存)上进入测试,达到了每秒16000次左右的请求,并且还是服务器与客户端都是在同一台服务器下完成的。 现这款产品还不太完善,作者自身也提到:在Cacheman做指定key的GET/SET/DELETE操作时,客户端需要弄清需要与哪一台Cacheman服务器通讯,为此要对该key做一个快速FNV哈希然后求余得到应该和几台服务器中的哪台服务器通讯。但该法的缺点在于新增或删除一个服务器节点时,缓存节点需要大规模迁移。修复该问题需要一致性的哈希算法,作者表示还没有时间解决此事。作者提出了采用中心架构的“主缓存服务器”的解决办法,让客户端轮询主缓存服务器来获取应该与那个缓存服务器通讯,但他也觉的这样做增加了复杂性,会带来些新问题。 可以感觉到,由于 Cacheman 这个个人项目已经介入到 Popfly 这个正式产品中,可能很快就会被微软吸纳为正式产品,因此如果有人采用这个产品做自己缓存的解决方案的话,应该不必太担心后续的产品升级及文档支持服务,它的未来前途值的期待。说不定 Krishnan 会从 Popfly 项目脱身出来专职负责这个 Cacheman 项目。 目前最新的版本是0.0.2版 :http://www.sriramkrishnan.com/code/。   from:http://kb.cnblogs.com/page/69728/

龙生   14 Mar 2014
View Details

ASP.NET缓存全解析3:页面局部缓存

有时缓存整个页面是不现实的,因为页的某些部分可能在每次请求时都需要变化。在这些情况下,只能缓存页的一部分。顾名思义,页面部分缓存是将页面部分内容保存在内存中以便响应用户请求,而页面其他部分内容则为动态内容。页面部分缓存的实现包括两种方式:控件缓存和替换后缓存。 1. 控件缓存(也称为片段缓存) 这种方式允许将需要缓存的信息包含在一个用户控件内,然后,将该用户控件标记为可缓存的,以此来缓存页面输出的部分内容。该选项允许缓存页面中的特定内容,而没有缓存整个页面,因此,每次都需重新创建整个页。例如,如果要创建一个显示大量动态内容(如股票信息)的页,其中有些部分为静态内容(如每周总结),这时可以将静态部分放在用户控件中,并允许缓存这些内容。 在ASP.NET中,提供了UserControl这种用户控件的功能。一个页面可以通过多个UserControl来组成。只需要在某个或某几个UserControl里设置缓存。 例如: 那么可以在WebUserControl1.ascx的页头代码中添加声明语句: <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="WebUserControl1.ascx.cs" Inherits="CacheWebApp._16_4_5.WebUserControl1" %> <%@ OutputCache Duration="60" VaryByParam="none" %> <%=DateTime.Now %> 调用该控件的页面WebForm1.aspx代码: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="CacheWebApp._16_4_5.WebForm1" %> <%@ Register src="WebUserControl1.ascx" tagname="WebUserControl1" tagprefix="uc1" %> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>控件缓存</title> </head> <body> <form id="form1" runat="server"> <div> 页面的:<%=DateTime.Now %> </div> <div> 控件的:<uc1:WebUserControl1 ID="WebUserControl11" runat="server" /> </div> </form> </body> </html> 这时候刷新WebForm1.aspx页面时,页面的时间每次刷新都变化,而用户控件中的时间数据却是60秒才变化一次,说明对页面的“局部”控件实现了缓存,而整个页面不受影响。 2. 缓存后替换 与控件缓存正好相反。它对整个页面进行缓存,但是页中的某些片段是动态的,因此不会缓存这些片段。ASP.NET页面中既包含静态内容,又包含基于数据库数据的动态内容。静态内容通常不会发生变化。因此,对静态内容实现数据缓存是非常必要的。然而,那些基于数据的动态内容,则不同。数据库中的数据可能每时每刻都发生变化,因此,如果对动态内容也实现缓存,可能造成数据不能及时更新的问题。对此问题如果使用前文所述的控件缓存方法,显然不切实际,而且实现起来很繁琐,易于发生错误。 如何实现缓存页面的大部分内容,而不缓存页面中的局部某些片段。ASP.NET 2.0提供了缓存后替换功能。实现该项功能可通过以下三种方法: 一是以声明方式使用Substitution控件。 二是以编程方式使用Substitution控件API。 三是以隐式方式使用控件。 前两种方法的核心是Substitution控件,本节将重点介绍该控件,第三种方法仅专注于控件内置支持的缓存后替换功能,本节仅做简要说明。 (1) Substitution控件应用 为提高应用程序性能,可能会缓存整个ASP.NET页面,同时,可能需要根据每个请求来更新页面上特定的部分。例如,可能要缓存页面的很大一部分,需要动态更新该页上与时间或者用户高度相关的信息。在这种情况下,推荐使用Substitution控件。Substitution控件能够指定页面输出缓存中需要以动态内容替换该控件的部分,即允许对整页面进行输出缓存,然后,使用Substitution控件指定页中免于缓存的部分。需要缓存的区域只执行一次,然后从缓存读取,直至该缓存项到期或被清除。动态区域,也就是Substitution控件指定的部分,在每次请求页面时都执行。Substitution控件提供了一种缓存部分页面的简化解决方案。 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="CacheWebApp._16_4_5.WebForm2" %> <%@ OutputCache Duration="60" VaryByParam="none" %> <html xmlns="http://www.w3.org/1999/xhtml" > <head […]

龙生   14 Mar 2014
View Details

ASP.NET缓存全解析1:缓存的概述

有时候总听到网友说网站运行好慢,不知如何是好;有时候也总见到一些朋友写的网站功能看起来非常好,但访问性能却极其的差。没有“勤俭节约”的意识,势必会造成“铺张浪费”。如何应对这种情况,充分利用系统缓存则是首要之道。 系统缓存有什么好处呢?举个简单的例子,你想通过网页查询某些数据,而这些数据并非实时变化,或者变化的时间是有期限的。例如查询一些历史数据。那么每个用户每次查的数据都是一样的。如果不设置缓存,ASP.NET也会根据每个用户的请求重复查询n次,这就增加了不必要的开销。所以,可能的情况下尽量使用缓存,从内存中返回数据的速度始终比去数据库查的速度快,因而可以大大提供应用程序的性能。毕竟现在内存非常便宜,用空间换取时间效率应该是非常划算的。尤其是对耗时比较长的、需要建立网络链接的数据库查询操作等。 缓存功能是大型网站设计一个很重要的部分。由数据库驱动的Web应用程序,如果需要改善其性能,最好的方法是使用缓存功能。    缓存的分类 从分布上来看,我们可以概括为客户端缓存和服务器端缓存。   客户端缓存——这点大家都有直观的印象。比如你去一个新的网站,第一次可能要花一阵子时间才能载入整个页面。而以后再去呢,时间就会大大的缩短,原因就在于这个客户端缓存。现在的浏览器都比较智能,它会在客户机器的硬盘上保留许多静态的文件,比如各种gif,jpeg文件等等。等以后再去的时候,它会尽量使用本地缓存里面的文件。只有服务器端的文件更新了,或是缓存里面的文件过期了,它才会再次从服务器端下载这些东西。很多时候是IE替我们做了这件事情。 服务器端缓存——有些东西没法或是不宜在客户端缓存,那么我们只好在服务器端想想办法了。服务器端缓存从性质上看,又可以分为两种。 (1)、静态文件缓存 好多页面是静态的,很少改动,那么这种文件最适于作静态缓存。现在的IIS 6.0这部分内容是直接存放在Kernel的内存中,由HTTP.SYS直接管理。由于它在Kernel Space,所以它的性能非常的高。用户的请求如果在缓存里面,那么HTTP.SYS直接将内容发送到network driver上去,不需要像以前那样从IIS的User space的内存copy到Kernel中,然后再发送到TCP/IP stack上。Kernel level cache几乎是现在高性能Web server的一个必不可少的特性。 (2)、动态缓存 动态缓存是比较有难度的。因为你在缓存的时候要时刻注意一个问题,那就是缓存的内容是不是已经过时了。因为内容过时了可能会有很严重的后果。比如网上买卖股票的网站。你给别人提供的价格是过时的,那人家非砍了你不可。缓存如何发现自己是不是过时就是一个非常复杂的问题。 在ASP.NET中,常见的动态缓存主要有以下几种手段: Ø  传统缓存方式 Ø  页面输出缓存。 Ø  页面局部缓存。 Ø  利用.NET提供的System.Web.Caching 缓存。 Ø  缓存依赖。 传统缓存方式 比如将可重复利用的东西放到Application或是Session中去保存。 Session["Style"] = val; Application["Count"] = 0; from:http://kb.cnblogs.com/page/69483/

龙生   14 Mar 2014
View Details

ASP.NET缓存全解析2:页面输出缓存

页面输出缓存是最为简单的缓存机制,该机制将整个ASP.NET页面内容保存在服务器内存中。当用户请求该页面时,系统从内存中输出相关数据,直到缓存数据过期。在这个过程中,缓存内容直接发送给用户,而不必再次经过页面处理生命周期。通常情况下,页面输出缓存对于那些包含不需要经常修改内容的,但需要大量处理才能编译完成的页面特别有用。需要读者注意的是,页面输出缓存是将页面全部内容都保存在内存中,并用于完成客户端请求。 在ASP.NET中页面缓存的使用方法非常的简单,只需要在aspx页的顶部加这样一句声明即可: <%@ OutputCache Duration="60" VaryByParam="none" %>   Duration:缓存的时间(秒),这是必选属性。如果未包含该属性,将出现分析器错误。 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="CacheWebApp._16_4_3.WebForm1" %> <%@ OutputCache Duration="60" VaryByParam="none" %> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>页面缓存示例</title> </head> <body> <form id="form1" runat="server"> <div> <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label> </div> </form> </body> </html> 后台代码:   protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { Label1.Text = DateTime.Now.ToString(); } } 如果不加<%@ OutputCache Duration="60" VaryByParam="none" %>,每次刷新页面上的时间每次都是在变。而加了缓存声明以后,每次刷新页面的时间并不变化,60秒后才变化一次,说明数据被缓存了60秒。   VaryByParam:是指页面根据使用 POST 或 GET 发送的名称/值对(参数)来更新缓存的内容,多个参数用分号隔开。如果不希望根据任何参数来改变缓存内容,请将值设置为 none。如果希望通过所有的参数值改变都更新缓存,请将属性设置为星号 (*)。 例如: http://localhost:1165/16-4-3/WebForm1.aspx?p=1   则可以在WebForm1.aspx页面头部声明缓存:<%@ OutputCache Duration="60" VaryByParam="p" %> 以上代码设置页面缓存时间是60秒,并根据p参数的值来更新缓存,即p的值发生变化才更新缓存。 如果一直是WebForm1.aspx?p=1访问该页,则页面会缓存当前数据,当p=2时又会执行后台代码更新缓存内容。 如果有多个参数时,如:http://localhost:1165/16-4-3/WebForm1.aspx?p=1&n=1 可以这样声明:<%@ OutputCache Duration="60" VaryByParam="p;n" %> 除此之外,@OutputCache 还有一些其他的属性。@OutputCache指令中的属性参数描述如下: <%@ OutputCache […]

龙生   14 Mar 2014
View Details

修改远程桌面连接数

今天管理一台服务器,远程连接时帐号密码都输入完后,点连接后弹出一个“终端服务器超出最大允许连接数”的提示窗口。 终端服务器超出最大允许连接数 上网查了一下归结一下出现这种情况的原因和解决办法。 原因:用远程桌面链接登录到终端服务器时经常会遇到“终端服务器超出最大允许链接数”诸如此类错误导致无法正常登录终端服务器,引起该问题的原因在于终端服务的缺省链接数为2个链接,并且当登录远程桌面后如果不是采用注销方式退出,而是直接关闭远程桌面窗口,那么实际上会话并没有释放掉,而是继续保留在服务器端, 这样就会占用总的链接数,当这个数量达到最大允许值时就会出现上面的提示。 如何避免? 一、用注销来退出远程桌面而不是直接关闭窗口 二、限制已断开链接的会话存在时间 1、从终端服务配置中修改 运行-Tscc.msc(终端服务配置)-连接-双击RDP-Tcp或右击-属性-会话-选中第一个的替代用户设置(O)-结束已断开的会话[将默认值“从不”改为一个适当的时间,比如30分钟] 2、从组策略修改 开始-运行-gpedit.msc-计算机配置-管理模板-windows组件-终端服务-会话 右边窗口选择 为断开的会话设置时间限制 -选择已启用,选择一个时间 三、增加最多链接数 1、 从终端服务配置中修改:运行-Tscc.msc(终端服务配置)-连接-双击RDP-Tcp或右击-属性,选择“网卡”选项卡-修改“最大连接数”改成你所需的值,当然这个值不也能太大,否则会占用较多的系统资源。不过这里修改的值好像不起作用,设置成无限制时照样还是会出现本文所说的情况。 2、组策略级别要高于终端服务配置,当启用组策略后终端服务配置中的相应选项会变成灰色不可修改。 运行-gpedit.msc-计算机配置-管理模板-Windows组件-终端服务 双击右边的“限制连接数量”-选择“已启用”-填入允许的最大连接数 四、改变远程终端模式 打开“控制面板”,双击“添加删除程序”,单击“添加删除Windows组件”,“组件”,在Windows组件向导对话框中选中“终端服务” , “下一步”,“应用服务器”,“下一步”,然后按照提示即可改变终端服务的模式。 Windows 2000终端服务有2种运行模式:远程管理模式和应用程序服务器模式。远程管理模式允许系统管理员远程管理服务器,而且只允许2个终端会话同时登录终端服务器。应用程序服务器模式允许用户 运行一个以上应用程序,允许多个用户从终端登录访问服务器。但是,应用终端服务的用户必须有终端服务授权,即必须在90天之内在这个域或工作组中设置终端 服务授权服务器,否则用户需删除应用程序,然后再重新安装。 五、修改本地安全策略 控制面板>>管理工具>>本地安全策略>>本地策略>>安全选项>> 1、先找到>>Microsoft网络服务器:在挂起会话之前所需的空闲时间 默认为:15分钟,改为自己所需要的时间(就是登陆后无动作空闲超过多少时间后自动断开) 2、然后找到>>网络安全:在超过登录时间后强制注销。默认为:已禁用,一定要改为:已启用   六、踢出已经断开的连接用户 1、首先通过各种方法连接到服务器上(telnet); 2、上去后,查看登陆用户列表。输入命令:query user; 这样你就可以看出有何不同来啦,可以根据你的具体情况而定。ID为0的用户就是本地登陆的,而在State中看提示,当提示为已断开,则说明用户已经断开还占用着系统资源和通道,这样就可以把该用户踢掉。输入logoff ID,即踢除相应ID的用户。   七、限制用户会话数 对Terminal Services进行限制,使得一个用户仅仅能够连接一次。对于Windows Server 2003,请在Terminal Services Configuration(Terminal Services配置)中将“限制每位用户只有拥有一个会话”(Restrict each user to one session)设置为“是”(Yes)。此外,您可以将“限制终端服务用户使用单个远程会话”组策略设置为“启用”。 —————————————————————————————————————————————————————- 安装了windows server 2008 R2,现在要远程连接,开启了服务器上的远程桌面连接,使用管理员远程登录。默认情况下windows server 2008只允许一个连接。默认一个账号最大2个连接。 因需要两台电脑连接。在windows server 2008 调整下默认配置。 开启远程桌面连接: 计算机—属性—远程设置—勾选"允许运行任意版本远程桌面的计算机连接(较不安全)" 有的时候我们windows server 2008服务器需要多个管理员同时登录的,这时我们就需要修改远程桌面的连接数了,具体修改方法如下: windows server 2008设置远程桌面连接最大数量 系统默认远程桌面连接的数量为1。控制面板—类别选择"小图标"—管理工具—远程桌面服务—远程桌面会话主机设置—把"限制每个用户只能进行一个会话"勾选去掉, 然后双击连接中的RDP-Tcp—网络适配器--最大连接数 修改为2 此时的同时远程桌面连接的数量即设置为2。 如果“最大连接数”选项已选中并且灰显,则“限制连接数”组策略设置已启用并且应用于 RD 会话主机服务器。 通过应用“限制连接数”组策略设置,还可以为 RD 会话主机服务器设置允许的最大同时连接数。此组策略设置位于“计算机配置\策略\管理模板\Windows 组件\远程桌面服务\远程桌面会话主机\连接”中,可以使用本地组策略编辑器或组策略管理控制台 (GPMC) 进行配置。请注意,此组策略设置将优先于远程桌面会话主机配置中配置的设置。   […]

龙生   14 Mar 2014
View Details

windows server 2008修改远程桌面连接数

安装了windows server 2008 R2,现在要远程连接,开启了服务器上的远程桌面连接,使用管理员远程登录。默认情况下windows server 2008只允许一个连接。默认一个账号最大2个连接。 因需要两台电脑连接。在windows server 2008 调整下默认配置。 开启远程桌面连接: 计算机—属性—远程设置—勾选"允许运行任意版本远程桌面的计算机连接(较不安全)" 有的时候我们windows server 2008服务器需要多个管理员同时登录的,这时我们就需要修改远程桌面的连接数了,具体修改方法如下: windows server 2008设置远程桌面连接最大数量 系统默认远程桌面连接的数量为1。控制面板—类别选择"小图标"—管理工具—远程桌面服务—远程桌面会话主机设置—把"限制每个用户只能进行一个会话"勾选去掉, 然后双击连接中的RDP-Tcp—网络适配器--最大连接数 修改为2 此时的同时远程桌面连接的数量即设置为2。 下面是调整超过2个连接的设置方法:要安装终端服务器。 1.在我的电脑右键里选择组策略。 2.在组策略中对位于“计算机配置\策略\管理模板\Windows 组件\远程桌面服务\远程桌面会话主机\连接”中,限制连接数进行配置。 3.好像上面两步就大功搞成了,一般来说是这样。但大多数人都没在角色里增加远程桌面服务。所以还是不能同时连接大于两个用户。 下面来为服务器添加角色。在我的电脑右键里选择管理,在角色里添加远程桌面角色,下一步等,然后重启就ok了 from:http://www.cnblogs.com/moonvan/archive/2011/10/11/2207268.html

龙生   14 Mar 2014
View Details

windows server 2008远程桌面实现多用户同时用同一用户名登录

开启远程桌面后,别人远程我的电脑时,windows server 2008默认只支持一个administrator用户登陆,一个登录后另一个就被踢掉了,有没有办法像server03那样允许多用户用同时同一个用户名登录? 打开控制面板-管理工具,终端服务-终端服务配置 1、连接:RDP-tcp 点右键,属性。网络适配器-最大连接数,2.。默认情况下如果你不添加终端服务功能,最大只能调整为同时2个连接。 2、终端服务器授权模式:点右键,属性。常规,限制每个用户只能使用一个会话,去掉勾,确定。到这里就可以多登录了。如果没有设置生效,重启一下。 3、防止恶搞,阻止远程用户终止控制台管理员。叫我说这一项忒难找,刚刚又重新找了一个遍。 运行-gpedit.msc ,计算机配置-管理模板-Windows组件-终端服务。 终端服务器-连接。 配置:拒绝将已经登录到控制台会话的管理员注销,设置启用。 重启生效。 from:http://dengcunhong.blog.163.com/blog/static/28812917201242611115897/

龙生   14 Mar 2014
View Details