分布式缓存net
❶ 什么是分布式计算机网络
在这种网络中,不存在一个处理和控制中心,网络中任一结点都至少和另外两个结点相连接,信息从一个结点到达另一结点时,可能有多条路径。同时,网络中各个结点均以平等地位相互协调工作和交换信息,并可共同完成一个大型任务。分组交换网、网状形网属于分布式网络。这种网具有信息处理的分布性、可靠性、可扩充性及灵活性等一系列优点。因此,它是网络发展的方向。 分布式系统的平台已经成为一个链接某个组织的各个工作组、部门、分支机构和各个分部的企业网络。数据不是在一台服务器上,而是在许多台服务器上;这些服务器可能位于多个不同的地理区域,并用WAN链路相连接。 图D-26说明了从昂贵的集中式系统向可大批量安装的低成本的分布式系统发展的趋势。在20世纪80年代末、90年代初,分布式系统由数量庞大的桌面计算机组成,而如今,因特网和Web技术已经大大扩展了分布式系统的概念。根据3Com论文的说法,Web是一个“大规模分布的系统集合”,它由数不胜数的节点组成,这些节点范围从服务器到便携式计算机和无线PDA,更不用说那些无需人工干预基本上就能够彼此对话的嵌入式系统了。 TCP/IP提供了一个网络无关的传输层。 Web客户机和服务器消除了对平台和操作系统的依赖性。 组件软件(java、ActiveX)消除了与购买和安装软件相关的争论。 XML使数据独立于软件。 用Web技术构建的网络(如内联网和因特网)是真正的高级分布式计算网络。Web技术为分布式计算添加了一个新的维度。Web服务器为具有Web浏览器的任何一台客户机提供了通用的访问方法。计算平台和操作系统的类型变得无关紧要,而无限制的通信和信息交换却占据了主导地位。 最近的分布式计算项目已经被用于使用世界各地成千上万位志愿者的计算机的闲置计算能力,通过因特网,您可以分析来自外太空的电讯号,寻找隐蔽的黑洞,并探索可能存在的外星智慧生命;您可以寻找超过1000万位数字的梅森质数;您也可以寻找并发现对抗艾滋病病毒的更为有效的药物。这些项目都很庞大,需要惊人的计算量,仅仅由单个的电脑或是个人在一个能让人接受的时间内计算完成是决不可能的。 分布式环境具有一些很有趣的特征。它利用了客户机/服务器计算技术和多层体系结构。它可将处理工作分布在多个不很昂贵的系统上,从而减轻了服务器处理许多任务的工作量。数据可以通过有线或无线网络从许多不同的站点上进行访问。可以将数据复制到其他系统以提供容错功能,并使其更接近于用户。对数据进行分布可以使数据免遭本地灾害的破坏。 分布式环境需要下列组件: 支持多供应商产品和通信协议的网络平台。TCP/IP成为实际使用的标准协议。 用于在客户机和服务器之间交换信息的应用程序接口,如RPC(远程过程调用)、消息传递系统或Web协议。 用来跟踪资源和信息及其所处位置的目录命名服务。 可支持分区和复制以便对数据进行分布并确保数据的可用性、可靠性和保护的文件系统和数据库。 用于使信息更接近于用户并使通过远距离链路传输信息所需时间最小化的高速缓存方案。 安全功能(如身份验证和授权)以及不同位置的系统之间的信任关系。 如前所述,Web是最基本的分布式计算机系统。您可以访问全世界的Web服务器,这些服务器提供了近乎无限的丰富内容。您可以利用目录服务来查找站点。搜索引擎对整个Web上的信息进行分类,并使您可以对其进行查询。高速缓存技术和“内容分布”正在使信息与用户的距离越来越近。 大规模分布系统 3Com有一篇论文,名为“Massively Distributed Systems”,是由Dan Nessett撰写的。该论文谈到了从高成本的集中式系统向低成本分布式的高单元容量的产品发展的趋势,向大规模分布的系统发展的趋势,这些大规模分布系统无处不在并且其运行常常超出人们的正常的知识范围。对于那些想了解分布式计算发展趋势的人们,建议最好阅读一下这篇论文。 Nessett探讨了两种分布式处理方法。一种方法是将数据移到边缘处理器,正如Web和基于Web的文件系统那样。另一种方法是先有处理过程再接收数据,正如活动联网和Java应用小程序那样(如对象在分布式系统中移动,同时携带代码和数据)。如果对象主要包含数据,则它会更接近于再进行处理。如果对象主要包含代码,则它更接近于先有处理过程再接收数据。然而,另一种方法是利用瘦客户机,这种方法是用户在与服务器连接的图形终端进行工作,这些服务器执行所有处理工作并存储用户的数据。 万维网是由欧洲粒子物理实验室(CERN)研制的基于Internet的信息服务系统。WWW以超文本技术为基础,用面向文件的阅览方式替代通常的菜单的列表方式,提供具有一定格式的文本、图形、声音、动画等。它是一个充满着对象的大规模分布的系统,其中各个Web站点所包含的文档都同时包含有对象和对其他对象的索引。 Nessett谈到了要使大规模分布的对象呈现给缺乏技术的用户为何需要新的接口。一个例子是在用户可浏览的虚拟空间中表示这些对象,就好像在三维世界中漫游一样。 分布式和并行处理 分布式计算技术的一个方面是能够在多台计算机上并行运行若干个程序。以分布式计算技术为基础,基于构件的系统体系结构将逐渐取代模块化的系统体系结构。现在主要有两种分布式计算技术的标准,一个是以OMG组织为核心的CORBA标准,另一个是以微软为代表的基于DCOM的ActiveX标准。近年来,OMG组织在CORBA 标准的制定和推广方面付出了巨大的努力,同时许多CORBA标准的产品也在逐渐成熟和发展;同时由于微软在操作系统方面的绝对统治地位,ActiveX标准在Windows系列平台上显得更加实用,相应的工具也更加成熟。 分布式并行处理技术是最适合于在通过LAN或因特网连接的计算机之间发生的多道处理技术;而专用并行处理则是最适合于在本地通过高速接口挂接的系统上发生的多道处理技术。 多个计算机系统间的分布式并行处理需要有一个权威性的调度程序,用来决定何时何地运行程序的一些部分。任务分布可以实时进行,也可以按比较缓和的任务安排来进行。例如,分布式处理已经在破译加密消息上得以使用。Distributed.net项目就是雇用数千名用户和他们的计算机来破译密码的。用户收到一个小程序,该程序可与Distributed.net的主系统进行通信,该系统向用户分布要解决的部分问题。当用户的计算机空闲时该程序即会运行。然后在完成后将其结果返回给主计算机。最后,主计算机对所有计算机提交的全部结果进行编译。Distributed.net宣称,它的用户网拥有“世界上最快的计算机”。 HTC(高吞吐量计算)环境是由许多工作站组成的大集合环境,通常称之为“网格环境”。Globus项目就是一个HTC项目,它可以帮助科研人员利用工作站和超级计算机池中的空闲周期。
❷ 网站常用的几种开发语言NET,php,JSP,各有什么优点缺点
ASP,全称为Active Server Pages
ASP是微软(Microsoft)所开发的一种后台脚本语言,它的语法和Visual BASIC类似,可以像SSI(Server Side Include)那样把后台脚本代码内嵌到HTML页面中。虽然ASP简单易用,但是它自身存在着许多缺陷,最重要的就是安全性问题。目前在微软的 .net 战略中新推出的ASP.net 借鉴了Java技术的优点,使用C Sharp (C#) 语言作为ASP.net的推荐语言,同时改进了以前ASP的安全性差等缺点。但是,使用ASP/ASP.net仍有一定的局限性,因为从某种角度来说它们只能在微软的 Windows NT/2000/XP + IIS的服务器平台上良好运行(虽然像ChilliSoft提供了在UNIX/Linux上运行ASP的解决方案,但是目前ASP在UNIX/Linux上的应用可以说几乎为0)。所以平台的局限性和ASP自身的安全性限制了ASP的广泛应用。
ASP在执行的时候,是由IIS调用程序引擎,解释执行嵌在HTML中的ASP代码,最终将结果和原来的HTML一同送往客户端。
PHP,全称为PHP: Hypertext Preprocessor
PHP 的全名非常有趣,它是一个巢状的缩写名称——“PHP: Hypertext Preprocessor”,打开缩写还是缩写。PHP是一种HTML 内嵌式的语言 (就像上面讲的ASP那样)。而 PHP 独特的语法混合了C,Java,Perl以及 PHP 式的新语法。它可以比 CGI 或者 Perl 更快速地执行动态网页。
PHP的源代码完全公开,在 Open Source 意识抬头的今天,它更是这方面的中流砥柱。不断地有新的函数库加入,以及不停地更新,使得 PHP 无论在 UNIX 或是 Win32 的平台上都可以有更多新的功能。它提供丰富的函数,使得在程式设计方面有着更好的资源。目前PHP的最新版本为4.1.1 ,它可以在Win32以及UNIX/Linux等几乎所有的平台上良好工作。PHP在4.0版后使用了全新的Zend引擎,其在最佳化之后的效率,比较传统 CGI 或者 ASP 等技术有了更好的表现。
平台无关性是PHP的最大优点,但是在优点的背后,还是有一些小小的缺点的。如果在PHP中不使用ODBC,而用其自带的数据库函数(这样的效率要比使用ODBC高)来连接数据库的话, 使用不同的数据库,PHP的函数名不能统一。这样,使得程序的移植变得有些麻烦。不过,作为目前应用最为广泛的一种后台语言,PHP的优点还是异常明显的。
JSP,全称为Java Server Pages / Servlet
JSP和Servlet要放在一起讲,是因为它们都是Sun公司的J2EE(Java 2 platform Enterprise Edition)应用体系中的一部分。
Servlet的形式和前面讲的CGI差不多,它是HTML代码和后台程序分开的。它们的启动原理也差不多,都是服务器接到客户端的请求后,进行应答。不同的是,CGI对每个客户请求都打开一个进程(Process),而Servlet却在响应第一个请求的时候被载入,一旦Servlet被载入,便处于已执行状态。对于以后其他用户的请求,它并不打开进程,而是打开一个线程(Thread),将结果发送给客户。由于线程与线程之间可以通过生成自己的父线程(Parent Thread)来实现资源共享,这样就减轻了服务器的负担,所以,Java Servlet可以用来做大规模的应用服务。
虽然在形式上JSP和ASP或PHP看上去很相似——都可以被内嵌在HTML代码中。但是,它的执行方式和ASP或PHP完全不同。在JSP被执行的时候,JSP文件被JSP解释器(JSP Parser)转换成Servlet代码,然后Servlet代码被Java编译器编译成 .class 字节文件,这样就由生成的Servlet来对客户端应答。所以,JSP可以看做是Servlet的脚本语言(Script Language)版。
由于JSP/Servlet都是基于Java的,所以它们也有Java语言的最大优点——平台无关性,也就是所谓的“一次编写,随处运行(WORA – Write Once, Run Anywhere)”。除了这个优点,JSP/Servlet的效率以及安全性也是相当惊人的。因此,JSP/Servlet虽然在国内目前的应用并不广泛,但是其前途不可限量。
在调试JSP代码时,如果程序出错,JSP服务器会返回出错信息,并在浏览器中显示。这时,由于JSP是先被转换成Servlet后再运行的,所以,浏览器中所显示的代码出错的行数并不是JSP源代码的行数,而是指转换后的Servlet程序代码的行数。这给调试代码带来一定困难。所以,在排除错误时,可以采取分段排除的方法(在可能出错的代码前后输出一些字符串,用字符串是否被输出来确定代码段从哪里开始出错),逐步缩小出错代码段的范围,最终确定错误代码的位置。
JSP和ASP相比较:
运行速度、运行开销、运行平台、扩展性、安全性、函数支持、厂商支持、对XML的支持等等,ASP都不是JSP的对手。COM组件的复杂性实编程实现有一定的难度。而JAVABeans和JAVA的结合却是天衣无缝的。
JSP和ASP.NET相比较:
1.相对C#,JSP的脚本语言JAVA也是面向对象的、分布式的、解释的语言。
2.与C#相似JAVA同样去掉了难以理解的指针等概念,取而代之的是类和对象。
3. JSP有一项全新的技术――Servlet(服务器端程序)很好的节约了服务器资源。
4.JAVABeans是针对ASP.NET的Server Control的技术。只要会JAVA, JavaBeans就很容易写出。
5.再有就是JAVA的JDBC数据库连接技术。
6.JSP对XML同样有十分广泛的支持。
1) 面向对象性:
ASP+将C#作为一种面向对象语言,在很多方面来看,C#将成为微软的与Java相似的语言。
C#另一个有趣的地方是所有对象都自动变成为COM对象。如果C#能取得很大的市场份额,那么它将给ASP+带来类似于Java的功能,并且具备更快的性能,因为它可以和Windows环境紧密集成。
C# 是ASP+开发中一个最重要的功能,微软会将C#发展成为Java的强劲对手。这也是他们.Net框架的一个重要组成部分。我认为C#是微软在编程市场上击败对手的主要工具。我期待着微软能在这个产品后面倾注全力,这样,C#可以成为许多程序员的又一种选择。C#产生的结果是将进一步加固微软和Sun产品的战线。这对用户是有利的,他们可以选择两者之一来开发新的应用。
2) 数据库连接:
ASP另一个亮点是它使用ADO对象,ODBC, OLE-DB和事务处理管理器。因此ASP Web数据库应用开发特别简单。ASP+发展了更多的功能,因为有了ADO+!ADO+带来了更强大更快速的功能。JSP和JDBC目前在易用性和性能上同ASP/ADO相比已有些落后,当新版本ASP+/ADO+出现后这样的差别会更明显。我个人希望SUN应尽快能花大力气来追赶ASP+/ADO+的组合。
3) 大型站点应用:
ASP+将对大型站点(web farms)有更好的支持。事实上,微软在这方面付出了巨大的努力。 ASP+可以让你考虑到多服务器(multiple servers)的场合,当你需要更强大的功能时,仅仅只需要增加一台服务器。整个.Net框架已经充分地提供了这个方法。ASP+提供了外部会话状态(external session state)来提供内置式web farm的支持。另外,由于请求的各组件相互间经过了充分的优化,所以速度很快。
于是ASP+现在可以在大型项目方面与JSP一样具有等同的能力。 而ASP+还有价格方面的优势,因为所有的组件将是服务器操作系统的一部分。对于JSP,你需要购买昂贵的应用服务器群来达到同样的目的。
4) ASP+还提供更多的其它方面的新特性,例如:
*内置的对象缓存和页面结果缓存。
*内置的XML支持,可用于XML数据集的简单处理。
*服务器控制提供了更充分的交互式控制。
ASP+确实对ASP进行了较大的发展。
❸ 如何 配置 NET 下的 分布式系统
至开发上的一个巨大进步,.net程序员以对象方式操作数据,以类sql语法在程序里查询数据,大大减少了繁琐的构造SQL语句的工作,可以更加专注于编写业务逻辑代码。但是在多层架构的分布式应用系统中,实体对象通过远程序列化到客户端时,这些实体会与其数据上下文(也就是实体容器)分离,在客户端无法对实体直接进行查询以及CUD(Create,Update,Delete)操作,下面以SQL Server为数据库,Remoting+Entity Framework3.5作为数据服务层,WinForm作为客户端,讲述一下如何使用EF框架搭建多层分布式应用系统。 二、 技术分析 1. 通过远程客户端传输过来的实体,都是处于分离状态(EntityState属性值为Detached),所以在多层应用程序中的服务端实现实体的更新或删除时,关键是如何把实体附加回实体容器中。MSDN上关于对分离实体的查询和CUD操作描述如下: 1) 附加对象(实体框架) 在实体框架的某个对象上下文内执行查询时,返回的对象会自动附加到该对象上下文。还可以将从源而不是从查询获得的对象附加到对象上下文。您可以附加以前分离的对象、由 NoTracking 查询返回的对象或从对象上下文的外部获取的对象。还可以附加存储在 ASP.NET 应用程序的视图状态中的对象或从远程方法调用或 Web 服务返回的对象。 使用下列方法之一将对象附加到对象上下文: · 调用 ObjectContext 上的 AddObject 将对象附加到对象上下文。当对象为数据源中尚不存在的新对象时采用此方法。 · 调用 ObjectContext上的Attach 将对象附加到对象上下文。当对象已存在于数据源中但当前尚未附加到上下文时采用此方法。有关更多信息,请参见如何:附加相关对象(实体框架)。 · 调用 ObjectContext的AttachTo,以将对象附加到对象上下文中的特定实体集。如果对象具有 null(在 Visual Basic 中为 Nothing)EntityKey 值,也可以执行此操作。 · 调用 ObjectContext上的ApplyPropertyChanges。当对象已存在于数据源中,并且分离的对象具有您希望保存的属性更新时采用此方法。如果简单地附加该对象,则属性更改将丢失。有关更多信息,请参见如何:应用对已分离对象的更改(实体框架)。 2) 应用对已分离对象的更改(实体框架)示例代码 View Code 2. 实现动态条件查询。在本地环境中,对于Linq,我们可以通过动态构造Lambda表达式树来实现动态条件查询,但是在远程环境中,Lamdba表达式不支持远程序列化传输,只能通过ObjectContext的CreateQuery方法实现,但幸好微软后来又提供了一个LINQ动态查询扩展库Dynamic.cs,使用起来更方便,于是采用它实现。 3. EF中核心抽象类是ObjectContext,实体容器都从它派生,实体容器上的CUD方法其实都是通过调用ObjectContext的CUD操作方法实现的。1) AddObject(string,object):表示添加实体object到实体容器,只要实体的EntityKey值为空,无论是否Detached状态均可以通过此方法实现添加操作。2) ApplyPropertyChanges(string,object)表示把分离状态的实体object上的所作的修改更新回容器中已存在的对应的实体,执行条件有两个:①实体处于分离状态,②实体容器中存在主键值与其相同的且为Unchanged状态的实体,所以,当我们需要更新一个Detached状态的实体时,可以先把一个具有原始值的相同键值的实体附加回容器中,或者直接执行一下查询,从数据库中取出该实体。3) DeleteObject(object)表示从实体容器中删除一个实体,执行条件是该实体存在于实体容器中,所以删除一个Detach状态的实体之前,需要把它通过Attach方法附加回实体容器中。 4. 实体对象也是基于抽象类EntityObject派生的,由此我们完全可以用ContextObject和EntityObject实现服务端对实体的查询和CUD方法,其实现子类在运行时由客户端注入,从而使服务端和数据库实现松耦合。 5. 下图是MSDN上关于在数据访问层中使用 LINQ to SQL 的 n 层应用程序的基本体系结构图,其实EF的结构也是一样的,不过是把DataContext换成ObjectContext。 三、 动手开发 1. 利用EF建立数据库概念模型新建一个解决方案EFServiceSystem,添加一个新项目,命名为EFModel,添加项目,在项目下添加一个ADO.NET Entity Data Model项,命名为EFModel.edmx,选择从数据库生成(假设我们已经建好了一个SQL Server数据库),一路点击下一步,直至完成。编译项目成功后就算完成。为什么要把数据库模型单独编译成一个dll呢,我将在后面给予解释。 2. 建立数据服务层在解决方案下再添加一个类库项目,命名为EFService。1) 利用外观模式,我们把客户端常用的查询和CUD操作方法简化为3个方法Query<T>,Save(T t),Delete(T t),根据针对接口编程的设计原则,定义一个CUD方法接口供客户端调用。 View Code 2) 实现类EntityHelper的代码。主要思路是通过构造函数注入数据上下文实例名称,在配置文件取出其程序集限定名,通过反射创建实例,调用实例的相应方法实现接口。 View Code 3) 最后,我们创建一个服务工厂类,暴露给客户端,负责以接口方式向客户端提供远程服务对象,数据服务层创建完毕。 View Code 4) 补充一下Dynamic.cs的内容,省得你去网上找了View Code 3. 创建运行服务的宿主程序。实际开发中,通常选择创建一个windows服务程序来运行Remoting,但是服务需要安装才能启动,运行和调试起来都比较繁琐,所以这里创建一个简单的控制台程序来运行它。在解决方案下添加一个控制台程序项目,在program.cs编写如下代码: View Code 配置文件App.Config主要包括数据库连接信息以及自己定义一个数据上下文名称(这里和数据库连接名称相同,事实上不必相同),数据库连接信息可以从EFModel项目中配置文件中直接拷贝过来。内容如下: View Code 编译成功后,拷贝EFModel和和EFService两个项目生成的dll文件至可执行文件EFServiceHost.exe同一目录下,点击运行EFServiceHost.exe。 4. 最后,我们建立一个winform客户端作为测试。在program.cs注册远程服务: View Code 四、 部署应用 1. 至此,整个系统搭建完毕。在本例中,我把所有项目都统一建立在一个解决方案下,其实是为了演示方便,实际开发时候,完全可以各自独立创建。下面我们来分析一下各个项目的职能和相互之间的引用关系。 1) EFModel:由Visual Studio 的数据模型工具生成的数据库实例模型,提供数据的查询以及CUD操作。不需引用其它项目。 2) EFService:使用数据库实例模型以及实体的抽象基类编写完成,代码里不涉及具体数据库模型实例,运行时通过客户端注入参数和读取配置文件动态生成数据库模型实例,并调用实例的查询和CUD方法实现客户端的请求。不需引用其它项目。 3) EFServiceHost:负责运行Remoting服务,如果通过配置文件方式发布服务的话,编译时也不需引用其它项目,我这里引用了EFService项目,是因为使用了代码方式暴露EFSservice的服务类。运行时需要将EFService和EFModel的dll文件拷贝至运行目录下。 4) EFClient:需要引用EFModel和EFService。(注:因为本例中式使用了Remoting作为远程服务,如果是WebService或者WCF则只需添加服务引用,然后在本地生成客户端代理类)。事实上EFService中的实现类EntityHelper也可以独立出去,不必让客户端引用,对于客户端而言,仅仅是使用ServiceFactory和接口IentityHelper就足够了。这样只要接口不变,EntityHelper更新的时候,客户端无须更新引用,而且服务端代码可以完全被隔离开客户端,对一些服务端和客户端之间的保密性比较敏感的项目尤为有利。 2. 通过分析我们发现,在开发下一个新项目的时候,即使整个数据库都变了,从SQL SERVER变成Oracle,数据库服务名变了,表也变了,我们仍然无需修改服务端代码,只需针对新的数据库,生成新的EFModel,然后拷贝DLL文件至EFServiceHost的运行目录下(这也就是我为什么要把EFModel独立成一个项目的原因),再修改一下EFServiceHost的配置文件中的数据库连接和实体容器名称即可完成新系统的部署。对于客户端来说,也就是更新一下EFModel.dll,还是调用服务端提供的那几个API,便可完成查询和CUD操作,不用关心底层的数据库是SQL Server还是Oracle,更不用自己实现对新库新表的查询和CUD操作(本来也不用)。当然,对于正在运行的系统,我们也可以针对新建数据库生成新的实体模型DLL,拷贝至EFServiceHost运行目录下,实现热插拔方式扩展数据库,而对原来的系统毫无影响,即使新加的库是不同类型的库。 五、 系统架构图示 六、 总结 从以上分析可以看出,该系统运用到项目开发中,对服务端来说,实现了最大程度组件重用(零代码修改),对客户端开发来说,高度简化了对数据的操作命令,并封装了实现细节,大大降低了开发的技术难度,提高了开发速度。当然,我这里写的代码仅仅是最简单的演示代码,在实际项目开发中,服务端要处理的细节和扩展的功能要比这复杂得多。比如性能优化,实现复杂查询和批量CUD操作,并发处理,事务控制,日志跟踪,数据缓存等等。另外,如果各层采用不同的技术实现,服务层实现的代码也有差异。比如EF可以选择最新版的更完善更强大的EF4.0,远程服务可以选择Remoting,WebService,WCF等,不同的远程服务,宿主程序也有所不同,Remoting和WCF可以选择winform,控制台程序,IIS,而Web Service只能选择IIS。不同的服务,不同的宿主程序,会有不同的通信通道 (Http,Tcp),不同的数据传输格式 (二进制,XML,JSON)。如果你嫌上面的实现方式涉及的技术太多,开发起来太麻烦,那么,微软现成的具有REST风格的远程数据服务WCF Data Services会是你的最佳选择。
❹ C#.net 主要特点
C#是一个语言,ASP.net是一个平台,上面支持用C#或者VB.Net写代码。
另外,C#不但可以开发基于ASP.net的应用程序,也可以开发基于WinForm的程序,这就是区别。
若是单纯以概念来说,你可以把.net当做一个工作平台一般,它是一个开发环境的基底,提供你开发Windows、Web、Mobile、XML...等应用程式一个共通的平台,若是要了解深一点,则再去了解其运作的相关机制那是有助于你利用它来开发.C#和.NET主要是应用在网际网路.
C#(读做C-sharp)编程语言是由微软公司的Anders Hejlsberg和 Scott Willamette领导的开发小组专门为.NET平台设计的语言,它可以使程序员移植到.NET上。这种移植对于广大的程序员来说是比较容易的,因为C#从C,C++和Java发展而来,它采用了这三种语言最优秀的特点,并加入了它自己的特性。C#是事件的驱动的,完全面向对象的可视化编程语言,我们可以使用集成开发环境来编写C#程序。使用IDE,程序员可以方便的建立,运行,测试和调试C#程序,这就将开发一个可用程序的时间减少到不用IDE开发时所用时间的一小部分。使用IDE迅速建立一个应用程序的过程称为快速反映开发。
C#2.0新特性
1、 泛型:在我看来,泛型就是通过将数据类型参数化从而实现了代码的更为灵活的复用,泛型的出现使得C#能够使用同一段代码来操作多种数据类型。泛型无疑是C#2.0最重大的改进,它的出现赋予了C#代码更强的类型安全,更好的复用,更高的效率和更清晰的约束。
2、 匿名方法:匿名方法允许我们将代码直接与委托实例相关联,使委托实例化工作更加直观和方便。在我看来,这只是C#又多了一种语法格式而已,不再像以前必须将方法名传给委托实例,而是又多了一种选择。
3、 迭代器:迭代器允许我们更加方便的编写用于foreach语句的类型。在我看来,迭代器的出现只不过是改进了1.0中不便的可用foreach语句类型的编写限制,简化了一些接口。
4、 局部类型:局部类型允许我们将一个类的代码分别写在不同的cs文件中。最典型的应用就是使用VS2005创建Form文件时,VS会自动将系统生成的代码与用户代码分开。局部类型通过partial关键字来声明。
5、 空属类型:空属类型是一种像int?一样可以为空的变量类型。本质上是一种泛型的应用,是System .Nullable<>的一种类型实例化。
6、 静态类:静态类是只用于包含静态成员的类型,它既不能实例化,亦不能被继承。
❺ 关于.Net开发下的分布式缓存设计
缓存真是个好东西,在大型的系统中可以有效地提升系统的速度,此乃废话就不多说了,在。Net 平台下面我把缓存从功用大致分为两类,数据对象缓存和页面输出缓存。 对于数据缓存来讲是由System.Web.Caching.Cache这个类来实现,可以从上下文对象Context.Cache 来获取这个对象的引用。而页面/控件输出缓存则是由。Net环境在运行时依据头部的缓存申明来控制缓存策略。 本文主要论证与数据缓存相关的一些应用与问题。文中提到了"无法跨Web园共享数据的问题",虽然提到解决方案就是使用XML文件来存放缓存的键值,这里有一个疑惑,就是。Net的Web园既然是进程独立的又何来共享之说呢,真要是这样的话即便是通过XML文档写入缓存键值缓存的对象也不能同时在两个进程中共享,而这里获得的好处仅是避免了在其它的进程中读到了已在当前进程中失效的“脏”缓存数据,这样的话开几个Web园就会产生几个缓存的对象对系统资源的利用系就比较低了。 如果是用Web场布署的话浪费就更多了,也许是还少有论坛达到这样的规模故不在设计能力的范围中吧。CommunityServer也是使用了这个系统对象,并对它作了一些包装形成了CommunityServer.Components.CSCache这个类,还是不错的,可以在项目中选择使用。
❻ Win7中的Remote Procere Call是什么服务
Win7局域网共享需要开启的服务项,解决局域网无法共享问题!.
开始 > 运行(或者win+R): services.msc,找到以下服务项,并开启。
UPnP Device Host:
允许 UPnP 设备宿主在此计算机上。如果停止此服务,则所有宿主的 UPnP 设备都将停止工作,并且不能添加其他宿主设备。如果禁用此服务,则任何显式依赖于它的服务将都无法启动。
TCP/IP NetBIOS Helper:
提供 TCP/IP (NetBT) 服务上的 NetBIOS 和网络上客户端的 NetBIOS 名称解析的支持,从而使用户能够共享文件、打印和登录到网络。如果此服务被停用,这些功能可能不可用。如果此服务被禁用,任何依赖它的服务将无法启动。
SSDP Discovery:
当发现了使用 SSDP 协议的网络设备和服务,如 UPnP 设备,同时还报告了运行在本地计算机上使用的 SSDP 设备和服务。如果停止此服务,基于 SSDP 的设备将不会被发现。如果禁用此服务,任何依赖此服务的服务都无法正常启动。
Server:
支持此计算机通过网络的文件、打印、和命名管道共享。如果服务停止,这些功能不可用。如果服务被禁用,任何直接依赖于此服务的服务将无法启动。
Network Location Awareness:
当发现了使用 SSDP 协议的网络设备和服务,如 UPnP 设备,同时还报告了运行在本地计算机上使用的 SSDP 设备和服务。如果停止此服务,基于 SSDP 的设备将不会被发现。如果禁用此服务,任何依赖此服务的服务都无法正常启动。
Network Connections:
管理“网络和拨号连接”文件夹中对象,在其中您可以查看局域网和远程连接。
DNS Client:
DNS 客户端服务(dnscache)缓存域名系统(DNS)名称并注册该计算机的完整计算机名称。如果该服务被停止,将继续解析 DNS 名称。然而,将不缓存 DNS 名称的查询结果,且不注册计算机名称。如果该服务被禁用,则任何明确依赖于它的服务都将无法启动。
Computer Browser:
维护网络上计算机的更新列表,并将列表提供给计算机指定浏览。如果服务停止,列表不会被更新或维护。如果服务被禁用,任何直接依赖于此服务的服务将无法启动。
WIN7系统的网络功能比XP有了进一步的增强,使用起来也相对清晰。但是由于做了很多表面优化的工作,使得底层的网络设置对于习惯了XP系统的人来说变得很不适应,其中局域网组建就是一个很大的问题。
默认安装系统后不但同组内的WIN7系统互相不能共享访问,而且最头疼的问题是组内的XP系统计算机更难互访。针对这个问题,从网络上收集了一些这方面的资料,结合自己在调试过程中的情况,通过以下步骤基本能够解决XP与WIN7局域网共享设置的问题。不到之处请网友谅解指正。
一:必要点
1、需要是管理员权限的帐户
2、所有入网的计算机都要在相同的IP段,比如都为192.168.1.X(2≤X≤255)
3、所有入网的计算机都要在相同的工作组,比如都在WORKGROUP组
4、所有入网的计算机都要开启来宾账户,默认账户名为:guest。
5、关闭任何第三方的防火墙软件,或者进行一些相关设置(很重要)。Windows自带的防火墙。如果没有把它关闭的话,也需要进行一些设置才可以。打开Windows防火墙---例外---勾选 文件和打印机共享---确定---保存。 XP系统,在 常规 选项卡中,要去掉不允许例外 前面的勾。
6、所有入网的计算机的操作系统必须有正确的权限设置(这是重点)
7、XP,是指Windows XP Professional 版本。其中所述的部分方法,并不适用于Windows XP Home Edition。8、WIN7,是指Windows 7。不同版本的WIN7可能存在一定的差异。如果你用的是Home Basic版本,就不要再往下看了,因为Home Basic不提供文件共享功能。。
二:必须开启的服务右键点击我的电脑 或计算机—管理----服务和应用程序,打开服务或者用WIN+R打开 运行---输入services.msc回车,打开服务设置将以下服务的[启动类型]选为[自动],并确保[服务状态]为[已启动]
Server
Workstation
Computer Browser
DHCP Client
Remote Procere Call
Remote Procere Call (RPC)
LocatorDNS ClientFunction Discovery Resource PublicationUPnP Device
❼ 并发的并发处理
一个小型的网站,比如个人网站,可以使用最简单的html静态页面就实现了,配合一些图片达到美化效果,所有的页面均存放在一个目录下,这样的网站对系统架构、性能的要求都很简单,随着互联网业务的不断丰富,网站相关的技术经过这些年的发展,已经细分到很细的方方面面,尤其对于大型网站来说,所采用的技术更是涉及面非常广,从硬件到软件、编程语言、数据库、WebServer、防火墙等各个领域都有了很高的要求,已经不是原来简单的html静态网站所能比拟的。
大型网站,比如门户网站。在面对大量用户访问、高并发请求方面,基本的解决方案集中在这样几个环节:使用高性能的服务器、高性能的数据库、高效率的编程语言、还有高性能的Web容器。但是除了这几个方面,还没法根本解决大型网站面临的高负载和高并发问题。
上面提供的几个解决思路在一定程度上也意味着更大的投入,并且这样的解决思路具备瓶颈,没有很好的扩展性,下面我从低成本、高性能和高扩张性的角度来说说我的一些经验。 其实大家都知道,效率最高、消耗最小的就是纯静态化的html页面,所以我们尽可能使我们的网站上的页面采用静态页面来实现,这个最简单的方法其实也是最有效的方法。但是对于大量内容并且频繁更新的网站,我们无法全部手动去挨个实现,于是出现了我们常见的信息发布系统CMS,像我们常访问的各个门户站点的新闻频道,甚至他们的其他频道,都是通过信息发布系统来管理和实现的,信息发布系统可以实现最简单的信息录入自动生成静态页面,还能具备频道管理、权限管理、自动抓取等功能,对于一个大型网站来说,拥有一套高效、可管理的CMS是必不可少的。
除了门户和信息发布类型的网站,对于交互性要求很高的社区类型网站来说,尽可能的静态化也是提高性能的必要手段,将社区内的帖子、文章进行实时的静态化,有更新的时候再重新静态化也是大量使用的策略,像Mop的大杂烩就是使用了这样的策略,网易社区等也是如此。
同时,html静态化也是某些缓存策略使用的手段,对于系统中频繁使用数据库查询但是内容更新很小的应用,可以考虑使用html静态化来实现,比如论坛中论坛的公用设置信息,这些信息目前的主流论坛都可以进行后台管理并且存储再数据库中,这些信息其实大量被前台程序调用,但是更新频率很小,可以考虑将这部分内容进行后台更新的时候进行静态化,这样避免了大量的数据库访问请求。 大型网站都有复杂的应用,这些应用必须使用数据库,那么在面对大量访问的时候,数据库的瓶颈很快就能显现出来,这时一台数据库将很快无法满足应用,于是我们需要使用数据库集群或者库表散列。
在数据库集群方面,很多数据库都有自己的解决方案,Oracle、Sybase等都有很好的方案,常用的MySQL提供的Master/Slave也是类似的方案,您使用了什么样的DB,就参考相应的解决方案来实施即可。
上面提到的数据库集群由于在架构、成本、扩张性方面都会受到所采用DB类型的限制,于是我们需要从应用程序的角度来考虑改善系统架构,库表散列是常用并且最有效的解决方案。我们在应用程序中安装业务和应用或者功能模块将数据库进行分离,不同的模块对应不同的数据库或者表,再按照一定的策略对某个页面或者功能进行更小的数据库散列,比如用户表,按照用户ID进行表散列,这样就能够低成本的提升系统的性能并且有很好的扩展性。sohu的论坛就是采用了这样的架构,将论坛的用户、设置、帖子等信息进行数据库分离,然后对帖子、用户按照板块和ID进行散列数据库和表,最终可以在配置文件中进行简单的配置便能让系统随时增加一台低成本的数据库进来补充系统性能。 缓存一词搞技术的都接触过,很多地方用到缓存。网站架构和网站开发中的缓存也是非常重要。这里先讲述最基本的两种缓存。高级和分布式的缓存在后面讲述。
架构方面的缓存,对Apache比较熟悉的人都能知道Apache提供了自己的缓存模块,也可以使用外加的Squid模块进行缓存,这两种方式均可以有效的提高Apache的访问响应能力。
网站程序开发方面的缓存,Linux上提供的Memory Cache是常用的缓存接口,可以在web开发中使用,比如用Java开发的时候就可以调用MemoryCache对一些数据进行缓存和通讯共享,一些大型社区使用了这样的架构。另外,在使用web语言开发的时候,各种语言基本都有自己的缓存模块和方法,PHP有Pear的Cache模块,Java就更多了,.net不是很熟悉,相信也肯定有。 负载均衡将是大型网站解决高负荷访问和大量并发请求采用的终极解决办法。
负载均衡技术发展了多年,有很多专业的服务提供商和产品可以选择,我个人接触过一些解决方法,其中有两个架构可以给大家做参考。
1.软件四层交换
大家知道了硬件四层交换机的原理后,基于OSI模型来实现的软件四层交换也就应运而生,这样的解决方案实现的原理一致,不过性能稍差。但是满足一定量的压力还是游刃有余的,有人说软件实现方式其实更灵活,处理能力完全看你配置的熟悉能力。
软件四层交换我们可以使用Linux上常用的LVS来解决,LVS就是Linux Virtual Server,他提供了基于心跳线heartbeat的实时灾难应对解决方案,提高系统的鲁棒性,同时可供了灵活的虚拟VIP配置和管理功能,可以同时满足多种应用需求,这对于分布式的系统来说必不可少。
一个典型的使用负载均衡的策略就是,在软件或者硬件四层交换的基础上搭建squid集群,这种思路在很多大型网站包括搜索引擎上被采用,这样的架构低成本、高性能还有很强的扩张性,随时往架构里面增减节点都非常容易。这样的架构我准备空了专门详细整理一下和大家探讨。
对于大型网站来说,前面提到的每个方法可能都会被同时使用到,我这里介绍得比较浅显,具体实现过程中很多细节还需要大家慢慢熟悉和体会,有时一个很小的squid参数或者apache参数设置,对于系统性能的影响就会很大。
2.硬件四层交换
第四层交换使用第三层和第四层信息包的报头信息,根据应用区间识别业务流,将整个区间段的业务流分配到合适的应用服务器进行处理。第四层交换功能就象是虚IP,指向物理服务器。它传输的业务服从的协议多种多样,有HTTP、FTP、NFS、Telnet或其他协议。这些业务在物理服务器基础上,需要复杂的载量平衡算法。在IP世界,业务类型由终端TCP或UDP端口地址来决定,在第四层交换中的应用区间则由源端和终端IP地址、TCP和UDP端口共同决定。
在硬件四层交换产品领域,有一些知名的产品可以选择,比如Alteon、F5等,这些产品很昂贵,但是物有所值,能够提供非常优秀的性能和很灵活的管理能力。Yahoo中国当初接近2000台服务器使用了三四台Alteon就搞定了。
❽ 如何处理大量数据并发操作
处理大量数据并发操作可以采用如下几种方法:
1.使用缓存:使用程序直接保存到内存中。或者使用缓存框架: 用一个特定的类型值来保存,以区别空数据和未缓存的两种状态。
2.数据库优化:表结构优化;SQL语句优化,语法优化和处理逻辑优化;分区;分表;索引优化;使用存储过程代替直接操作。
3.分离活跃数据:可以分为活跃用户和不活跃用户。
4.批量读取和延迟修改: 高并发情况可以将多个查询请求合并到一个。高并发且频繁修改的可以暂存缓存中。
5.读写分离: 数据库服务器配置多个,配置主从数据库。写用主数据库,读用从数据库。
6.分布式数据库: 将不同的表存放到不同的数据库中,然后再放到不同的服务器中。
7.NoSql和Hadoop: NoSql,not only SQL。没有关系型数据库那么多限制,比较灵活高效。Hadoop,将一个表中的数据分层多块,保存到多个节点(分布式)。每一块数据都有多个节点保存(集群)。集群可以并行处理相同的数据,还可以保证数据的完整性。
拓展资料:
大数据(big data),指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。
在维克托·迈尔-舍恩伯格及肯尼斯·库克耶编写的《大数据时代》中大数据指不用随机分析法(抽样调查)这样捷径,而采用所有数据进行分析处理。大数据的5V特点(IBM提出):Volume(大量)、Velocity(高速)、Variety(多样)、Value(低价值密度)、Veracity(真实性)。
❾ 如何进行网站性能优化
一、前端优化
网站性能优化是一个很综合的话题,涉及到服务器的配置和网站前后端程序等各个方面,我只是从实际经历出发,分享一下自己所尝试过的网站性能优化方法。之所以在标题上挂一个web2.0,是因为本文更偏重于中小网站的性能优化,我所使用的系统也是典型web2.0的LAMP架构。
首先讲讲前端的优化,用户访问网页的等待时间,有80%是发生在浏览器前端,特别是页面和页面中各种元素(图片、CSS、Javascript、 flash…)的下载之上。因此在很多情况下,相对于把大量的时间花在艰苦而繁杂的程序改进上,前端的优化往往能起到事半功倍的作用。雅虎最近将内部使用的性能测试工具yslow向第三方公开,并发布了着名的网站性能优化的十三条规则,建议你下载并安装yslow,并作为测评网站优化效果的工具。下面我挑其中特别有价值的具体说明一下优化的方法:
对于第一次访问您网站,尚未在浏览器cache中缓存您网站内容的用户,我们可以做的事情包括:
1)减少一个页面访问所产生的http连接次数
对于第一次访问你网站的用户,页面所产生的http连接次数是影响性能的一个关键瓶颈。
对策:
- 尽量简洁的页面设计,最大程度减少图片的使用,通过放弃一些不必要的页面特效来减少javascript的使用。
- 使用一些优化技巧,比如利用图片的背景位移减少图片的个数;image map技术;使用Inline images将css图片捆绑到网页中。
- 尽量合并js和css文件,减少独立文件个数。
2) 使用gzip压缩网页内容
使用gzip来压缩网页中的静态内容,能够显着减少用户访问网页时的等待时间(据说可达到60%)。主流的web服务器都支持或提供gzip压缩,如果使用apache服务器,只需要在配置文件中开启 mod_gzip(apache1.x)或mod_deflate(apache2.x)即可。凡是静态的页面,使用gzip压缩都能够显着提高服务器效率并减少带宽支出,注意图片内容本身已经是压缩格式了,务必不要再进行压缩。
3)将CSS放在页面顶端,JS文件放在页面底端
CSS的引用要放在html的头部header中,JS文件引用尽量放在页面底端标签的后面,主要的思路是让核心的页面内容尽早显示出来。不过要注意,一些大量使用js的页面,可能有一些js文件放在底端会引起一些难以预料的问题,根据实际情况适当运用即可。
4)使JS文件内容最小化
具体来说就是使用一些javascript压缩工具对js脚本进行压缩,去除其中的空白字符、注释,最小化变量名等。在使用gzip压缩的基础上,对js内容的压缩能够将性能再提高5%。
5)尽量减少外部脚本的使用,减少DNS查询时间
不要在网页中引用太多的外部脚本,首先,一次dns的解析过程会消耗20-120毫秒的时间;其次,如果在页面中引用太多的外部文件(如各种广告、联盟等代码),可能会因为外部文件的响应速度而将你的网站拖得很慢。如果不得不用,那么就尽量将这些脚本放在页脚吧。不过有一点需要提及,就是浏览器一般只能并行处理同一域名下的两个请求,而对于不同子的域名则不受此限制,因此适当将本站静态内容(css,js)放在其他的子域名下(如 static.xxx.com)会有利于提高浏览器并行下载网页内容的能力。
对于您网站的经常性访问用户,主要的优化思路就是最大限度利用用户浏览器的cache来减少服务器的开销。
1)在header中添加过期时间(Expires Header)
在header中给静态内容添加一个较长的过期时间,这样可以使用户今后访问只读取缓存中的文件,而不会与服务器产生任何的交互。不过这样做也存在一些问题,当图片、CSS和js文件更新时,用户如果不刷新浏览器,就无法获得此更新。这样,我们在对图片、css和js文件修改时,必须要进行重命名,才能保证用户访问到最新的内容。这可能会给开发造成不小的麻烦,因为这些文件可能被站点中的许多文件所引用。flickr提出的解决办法是通过url rewrite使不同版本号的URL事实上指向同一个文件,这是一个聪明的办法,因为url级别的操作效率是很高的,可以给开发过程提供不少便利。
要理解为什么这样做,必须要了解浏览器访问url时的工作机制:
a. 第一次访问url时,用户从服务器段获取页面内容,并把相关的文件(images,css,js…)放在高速缓存中,也会把文件头中的expired time,last modified, ETags等相关信息也一同保留下来。
b. 用户重复访问url时,浏览器首先看高速缓存中是否有本站同名的文件,如果有,则检查文件的过期时间;如果尚未过期,则直接从缓存中读取文件,不再访问服务器。
c. 如果缓存中文件的过期时间不存在或已超出,则浏览器会访问服务器获取文件的头信息,检查last modifed和ETags等信息,如果发现本地缓存中的文件在上次访问后没被修改,则使用本地缓存中的文件;如果修改过,则从服务器上获取最新版本。
我的经验,如果可能,尽量遵循此原则给静态文件添加过期时间,这样可以大幅度减少用户对服务器资源的重复访问。
2)将css和js文件放在独立外部文件中引用
将css和js文件放在独立文件中,这样它们会被单独缓存起来,在访问其他页面时可以从浏览器的高速缓存中直接读取。一些网站的首页可能是例外的,这些首页的自身浏览可能并不大,但却是用户访问网站的第一印象以及导向到其他页面的起点,也可能这些页面本身使用了大量的ajax局部刷新及技术,这时可以将 css和js文件直接写在页面中。
3)去掉重复的脚本
在IE中,包含重复的js脚本会导致浏览器的缓存不被使用,仔细检查一下你的程序,去掉重复引用的脚本应该不是一件很难的事情。
4)避免重定向的发生
除了在header中人为的重定向之外,网页重定向常在不经意间发生,被重定向的内容将不会使用浏览器的缓存。比如用户在访问,服务器会通过301转向到/,在后面加了一个“/”。如果服务器的配置不好,这也会给服务器带来额外的负担。通过配置apache的 alias或使用mod_rewrite模块等方法,可以避免不必要的重定向。
还有一些,比如使用CDN分发机制、避免CSS表达式等、避免使用ETags等,因为不太常用,这里就不再赘述了。
做完了上述的优化,可以试着用yslow测试一下网页的性能评分,一般都可以达到70分以上了。
当然,除了浏览器前端和静态内容的优化之外,还有针对程序脚本、服务器、数据库、负载的优化,这些更深层次的优化方法对技术有更高的要求。本文的后半部分将重点探讨后端的优化。
二、后端优化
上次写完web2.0网站前端优化篇之后,一直想写写后端优化的方法,今天终于有时间将思路整理了出来。
前端优化可以避免我们造成无谓的服务器和带宽资源浪费,但随着网站访问量的增加,仅靠前端优化已经不能解决所有问题了,后端软件处理并行请求的能力、程序运 行的效率、硬件性能以及系统的可扩展性,将成为影响网站性能和稳定的关键瓶颈所在。优化系统和程序的性能可以从以下的方面来入手:
1)apache、mysql等软件的配置的优化
尽管apache和mysql等软件在安装后使用的默认设置足以使你的网站运行起来,但是通过调整mysql和apache的一些系统参数,还是可以追求更高的效率和稳定性。这个领域中有很多专业的文章和论坛(比如: ),要想掌握也需要进行深入的研究和实践,这里就不重点讨论了。
2)应用程序环境加速
这里仅以我最常应用的php开发环境为例,有一些工具软件可以通过优化PHP运行环境来达到提速的目的,其基本原理大致是将PHP代码预编译并缓存起来,而不需要改变任何代码,所以比较简单,可以将php的运行效率提升50%以上。比较常用的php加速工具有:APC( http: //pecl.php.net/package-info.php?package=APC)、Turck MMCache( )、php accelebrator(),还有收费的Zend Performance Suite
3)将静态内容和动态内容分开处理
apache是一个功能完善但比较庞大的web server,它的资源占用基本上和同时运行的进程数呈正比,对服务器内存的消耗比较大,处理并行任务的效率也一般。在一些情况下,我们可以用比较轻量级的web server来host静态的图片、样式表和javascript文件,这样可以大大提升静态文件的处理速度,还可以减少对内存占用。我使用的web server是来自俄罗斯的nginx,其他选择方案还包括lighttpd和thttpd等。
4)基于反向代理的前端访问负载均衡
当一台前端服务器不足以应付用户访问时,通过前端机实现web访问的负载均衡是最快速可行的方案。通过apache的mod_proxy可以实现基于反向代理的负载均衡,这里推荐使用nginx做代理服务器,处理速度较apache更快一些。
5)应用缓存技术提高数据库效能,文件缓存和分布式缓存
数据库访问处理并发访问的能力是很多网站应用的关键瓶颈,在想到使用主从结构和多farm的方式构建服务器集群之前,首先应该确保充分使用了数据库查询的缓存。一些数据库类型(如mysql的innoDB)自身内置对缓存的支持,此外,还可以利用程序方法将常用的查询通过文件或内存缓存起来。比如通过 php中的ob_start和文件读写函数可以很方便的实现文件形式的缓存,而如果你拥有多台服务器,可以通过memcache技术通过分布式共享内存来对数据库查询进行缓存,不仅效率高而且扩展性好,memcache技术在livejournal和Craigslist.org等知名网站应用中都得到了检验。
6)服务器运行状态的检测,找到影响性能的瓶颈所在
系统优化没有一劳永逸的方法,需要通过检测服务器的运行状态来及时发现影响性能的瓶颈,以及可能存在的潜在问题,因为网站的性能,永远取决于木桶中的短板。可以编写一些脚本来检测web服务的运行,也有一些开源的软件也提供了很好的功能
7)良好的扩展架构是稳定和性能的基础
一些技巧和窍门可以帮你度过眼前的难关,但要想使网站具备应付大规模访问的能力,则需要从系统架构上进行彻底的规划,好在很多前人无私的把他们架构
网站的经验分享给我们,使我们可以少走甚多弯路。我最近读到的两篇有启发的文章:
- 从LiveJournal后台发展看大规模网站性能优化方法
- Myspace的六次重构
最后不得不提到程序编码和数据库结构对性能的影响,一系列糟糕的循环语句,一个不合理的查询语句、一张设计不佳的数据表或索引表,都足以会使应用程序运行的速度成倍的降低。培养全局思考的能力,养成良好的编程习惯,并对数据库运行机制有所了解,是提高编程质量的基础。
❿ php面试题 memcache和redis的区别
Redis与Memcached的区别
传统MySQL+ Memcached架构遇到的问题
实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访问,很多公司都曾经使用过这样的架构,但随着业务数据量的不断增加,和访问量的持续增长,我们遇到了很多问题:
1.MySQL需要不断进行拆库拆表,Memcached也需不断跟着扩容,扩容和维护工作占据大量开发时间。
2.Memcached与MySQL数据库数据一致性问题。
3.Memcached数据命中率低或down机,大量访问直接穿透到DB,MySQL无法支撑。
4.跨机房cache同步问题。
众多NoSQL百花齐放,如何选择
最近几年,业界不断涌现出很多各种各样的NoSQL产品,那么如何才能正确地使用好这些产品,最大化地发挥其长处,是我们需要深入研究和思考的
问题,实际归根结底最重要的是了解这些产品的定位,并且了解到每款产品的tradeoffs,在实际应用中做到扬长避短,总体上这些NoSQL主要用于解
决以下几种问题
1.少量数据存储,高速读写访问。此类产品通过数据全部in-momery 的方式来保证高速访问,同时提供数据落地的功能,实际这正是Redis最主要的适用场景。
2.海量数据存储,分布式系统支持,数据一致性保证,方便的集群节点添加/删除。
3.这方面最具代表性的是dynamo和bigtable 2篇论文所阐述的思路。前者是一个完全无中心的设计,节点之间通过gossip方式传递集群信息,数据保证最终一致性,后者是一个中心化的方案设计,通过类似一个分布式锁服务来保证强一致性,数据写入先写内存和redo log,然后定期compat归并到磁盘上,将随机写优化为顺序写,提高写入性能。
4.Schema free,auto-sharding等。比如目前常见的一些文档数据库都是支持schema-free的,直接存储json格式数据,并且支持auto-sharding等功能,比如mongodb。
面对这些不同类型的NoSQL产品,我们需要根据我们的业务场景选择最合适的产品。
Redis适用场景,如何正确的使用
前面已经分析过,Redis最适合所有数据in-momory的场景,虽然Redis也提供持久化功能,但实际更多的是一个disk-
backed的功能,跟传统意义上的持久化有比较大的差别,那么可能大家就会有疑问,似乎Redis更像一个加强版的Memcached,那么何时使用
Memcached,何时使用Redis呢?
如果简单地比较Redis与Memcached的区别,大多数都会得到以下观点:
1 Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
2 Redis支持数据的备份,即master-slave模式的数据备份。
3 Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
抛开这些,可以深入到Redis内部构造去观察更加本质的区别,理解Redis的设计。
在
Redis中,并不是所有的数据都一直存储在内存中的。这是和Memcached相比一个最大的区别。Redis只会缓存所有的
key的信息,如果Redis发现内存的使用量超过了某一个阀值,将触发swap的操作,Redis根据“swappability =
age*log(size_in_memory)”计
算出哪些key对应的value需要swap到磁盘。然后再将这些key对应的value持久化到磁盘中,同时在内存中清除。这种特性使得Redis可以
保持超过其机器本身内存大小的数据。当然,机器本身的内存必须要能够保持所有的key,毕竟这些数据是不会进行swap操作的。同时由于Redis将内存
中的数据swap到磁盘中的时候,提供服务的主线程和进行swap操作的子线程会共享这部分内存,所以如果更新需要swap的数据,Redis将阻塞这个
操作,直到子线程完成swap操作后才可以进行修改。
使用Redis特有内存模型前后的情况对比:
VM off: 300k keys, 4096 bytes values: 1.3G used
VM on: 300k keys, 4096 bytes values: 73M used
VM off: 1 million keys, 256 bytes values: 430.12M used
VM on: 1 million keys, 256 bytes values: 160.09M used
VM on: 1 million keys, values as large as you want, still: 160.09M used
当
从Redis中读取数据的时候,如果读取的key对应的value不在内存中,那么Redis就需要从swap文件中加载相应数据,然后再返回给请求方。
这里就存在一个I/O线程池的问题。在默认的情况下,Redis会出现阻塞,即完成所有的swap文件加载后才会相应。这种策略在客户端的数量较小,进行
批量操作的时候比较合适。但是如果将Redis应用在一个大型的网站应用程序中,这显然是无法满足大并发的情况的。所以Redis运行我们设置I/O线程
池的大小,对需要从swap文件中加载相应数据的读取请求进行并发操作,减少阻塞的时间。
如果希望在海量数据的环境中使用好Redis,我相信理解Redis的内存设计和阻塞的情况是不可缺少的。
补充的知识点:
memcached和redis的比较
1 网络IO模型
Memcached是多线程,非阻塞IO复用的网络模型,分为监听主线程和worker子线程,监听线程监听网络连接,接受请求后,将连接描述
字pipe 传递给worker线程,进行读写IO, 网络层使用libevent封装的事件库,多线程模型可以发挥多核作用,但是引入了cache
coherency和锁的问题,比如,Memcached最常用的stats
命令,实际Memcached所有操作都要对这个全局变量加锁,进行计数等工作,带来了性能损耗。
(Memcached网络IO模型)
Redis使用单线程的IO复用模型,自己封装了一个简单的AeEvent事件处理框架,主要实现了epoll、kqueue和select,
对于单纯只有IO操作来说,单线程可以将速度优势发挥到最大,但是Redis也提供了一些简单的计算功能,比如排序、聚合等,对于这些操作,单线程模型实
际会严重影响整体吞吐量,CPU计算过程中,整个IO调度都是被阻塞住的。
2.内存管理方面
Memcached使用预分配的内存池的方式,使用slab和大小不同的chunk来管理内存,Item根据大小选择合适的chunk存储,内
存池的方式可以省去申请/释放内存的开销,并且能减小内存碎片产生,但这种方式也会带来一定程度上的空间浪费,并且在内存仍然有很大空间时,新的数据也可
能会被剔除,原因可以参考Timyang的文章:http://timyang.net/data/Memcached-lru-evictions/
Redis使用现场申请内存的方式来存储数据,并且很少使用free-list等方式来优化内存分配,会在一定程度上存在内存碎片,Redis
跟据存储命令参数,会把带过期时间的数据单独存放在一起,并把它们称为临时数据,非临时数据是永远不会被剔除的,即便物理内存不够,导致swap也不会剔
除任何非临时数据(但会尝试剔除部分临时数据),这点上Redis更适合作为存储而不是cache。
3.数据一致性问题
Memcached提供了cas命令,可以保证多个并发访问操作同一份数据的一致性问题。 Redis没有提供cas 命令,并不能保证这点,不过Redis提供了事务的功能,可以保证一串 命令的原子性,中间不会被任何操作打断。
4.存储方式及其它方面
Memcached基本只支持简单的key-value存储,不支持枚举,不支持持久化和复制等功能
Redis除key/value之外,还支持list,set,sorted set,hash等众多数据结构,提供了KEYS
进行枚举操作,但不能在线上使用,如果需要枚举线上数据,Redis提供了工具可以直接扫描其mp文件,枚举出所有数据,Redis还同时提供了持久化和复制等功能。
5.关于不同语言的客户端支持
在不同语言的客户端方面,Memcached和Redis都有丰富的第三方客户端可供选择,不过因为Memcached发展的时间更久一些,目
前看在客户端支持方面,Memcached的很多客户端更加成熟稳定,而Redis由于其协议本身就比Memcached复杂,加上作者不断增加新的功能
等,对应第三方客户端跟进速度可能会赶不上,有时可能需要自己在第三方客户端基础上做些修改才能更好的使用。
根据以上比较不难看出,当我们不希望数据被踢出,或者需要除key/value之外的更多数据类型时,或者需要落地功能时,使用Redis比使用Memcached更合适。
关于Redis的一些周边功能
Redis除了作为存储之外还提供了一些其它方面的功能,比如聚合计算、pubsub、scripting等,对于此类功能需要了解其实现原
理,清楚地了解到它的局限性后,才能正确的使用,比如pubsub功能,这个实际是没有任何持久化支持的,消费方连接闪断或重连之间过来的消息是会全部丢
失的,又比如聚合计算和scripting等功能受Redis单线程模型所限,是不可能达到很高的吞吐量的,需要谨慎使用。
总的来说Redis作者是一位非常勤奋的开发者,可以经常看到作者在尝试着各种不同的新鲜想法和思路,针对这些方面的功能就要求我们需要深入了解后再使用。
总结:
1.Redis使用最佳方式是全部数据in-memory。
2.Redis更多场景是作为Memcached的替代者来使用。
3.当需要除key/value之外的更多数据类型支持时,使用Redis更合适。
4.当存储的数据不能被剔除时,使用Redis更合适。
谈谈Memcached与Redis(一)
1. Memcached简介
Memcached是以LiveJurnal旗下Danga Interactive公司的Bard
Fitzpatric为首开发的高性能分布式内存缓存服务器。其本质上就是一个内存key-value数据库,但是不支持数据的持久化,服务器关闭之后数
据全部丢失。Memcached使用C语言开发,在大多数像Linux、BSD和Solaris等POSIX系统上,只要安装了libevent即可使
用。在Windows下,它也有一个可用的非官方版本(http://code.jellycan.com/memcached/)。Memcached
的客户端软件实现非常多,包括C/C++, PHP, Java, Python, Ruby, Perl, Erlang,
Lua等。当前Memcached使用广泛,除了LiveJournal以外还有Wikipedia、Flickr、Twitter、Youtube和
WordPress等。
在Window系统下,Memcached的安装非常方便,只需从以上给出的地址下载可执行软件然后运行memcached.exe –d
install即可完成安装。在Linux等系统下,我们首先需要安装libevent,然后从获取源码,make && make
install即可。默认情况下,Memcached的服务器启动程序会安装到/usr/local/bin目录下。在启动Memcached时,我们可
以为其配置不同的启动参数。
1.1 Memcache配置
Memcached服务器在启动时需要对关键的参数进行配置,下面我们就看一看Memcached在启动时需要设定哪些关键参数以及这些参数的作用。
1)-p <num> Memcached的TCP监听端口,缺省配置为11211;
2)-U <num> Memcached的UDP监听端口,缺省配置为11211,为0时表示关闭UDP监听;
3)-s <file> Memcached监听的UNIX套接字路径;
4)-a <mask> 访问UNIX套接字的八进制掩码,缺省配置为0700;
5)-l <addr> 监听的服务器IP地址,默认为所有网卡;
6)-d 为Memcached服务器启动守护进程;
7)-r 最大core文件大小;
8)-u <username> 运行Memcached的用户,如果当前为root的话需要使用此参数指定用户;
9)-m <num> 分配给Memcached使用的内存数量,单位是MB;
10)-M 指示Memcached在内存用光的时候返回错误而不是使用LRU算法移除数据记录;
11)-c <num> 最大并发连数,缺省配置为1024;
12)-v –vv –vvv 设定服务器端打印的消息的详细程度,其中-v仅打印错误和警告信息,-vv在-v的基础上还会打印客户端的命令和相应,-vvv在-vv的基础上还会打印内存状态转换信息;
13)-f <factor> 用于设置chunk大小的递增因子;
14)-n <bytes> 最小的chunk大小,缺省配置为48个字节;
15)-t <num> Memcached服务器使用的线程数,缺省配置为4个;
16)-L 尝试使用大内存页;
17)-R 每个事件的最大请求数,缺省配置为20个;
18)-C 禁用CAS,CAS模式会带来8个字节的冗余;
2. Redis简介
Redis是一个开源的key-value存储系统。与Memcached类似,Redis将大部分数据存储在内存中,支持的数据类型包括:字
符串、哈希表、链表、集合、有序集合以及基于这些数据类型的相关操作。Redis使用C语言开发,在大多数像Linux、BSD和Solaris等
POSIX系统上无需任何外部依赖就可以使用。Redis支持的客户端语言也非常丰富,常用的计算机语言如C、C#、C++、Object-C、PHP、
Python、Java、Perl、Lua、Erlang等均有可用的客户端来访问Redis服务器。当前Redis的应用已经非常广泛,国内像新浪、淘
宝,国外像Flickr、Github等均在使用Redis的缓存服务。
Redis的安装非常方便,只需从http://redis.io/download获取源码,然后make && make
install即可。默认情况下,Redis的服务器启动程序和客户端程序会安装到/usr/local/bin目录下。在启动Redis服务器时,我们
需要为其指定一个配置文件,缺省情况下配置文件在Redis的源码目录下,文件名为redis.conf。