hi,everyone !真的是很久很久没有update blog了,由于最近忙着备考,没有时间对《数据结构与算法》进行研究学习了。因此,blog一直未更新。today is Friday,内心比较轻松,(哈哈,上班族懂个人感觉),有时间写篇技术文章了。正好,最近研究了一些新技术,这篇文章权当对技术的梳理概括吧。子曰:”温故而知新,能够为师也.”对于knowledge,咱们必定要时常复习、thought、概括、practice.只有这样,咱们才能真正的掌握它。Einstein曾经说过:if you can’t explain it simply, you don’t understand it as well enough .判断咱们掌握knowledge的程度的方法是,将knowledge简单清楚的讲给别人听。这也是,写blog的好处,必定要掌握扎实,能本身思考,本身能够讲的明白。好了,废话很少说了,Let’s Go!web
最近在研究公司项目中的缓存模块,在研究缓存模块的过程当中,学到了不少以前没有接触到的东西。以前,本身没有接触过缓存。在学习过公司的缓存模块后,如今对缓存的理解是这样的:算法
缓存就是将咱们在项目中常用的数据,或是常常访问的页面存起来。第一次,会去访问数据库读取数据,在读取数据后,会把数据存入内存中。第二次再访问,直接去内存中读取,而再也不访问数据库。缓存的优势就是能够提升访问效率,优化项目。Note:本身的理解,不必定正确。shell
.net,自己有一套本身的缓存机制,它是把缓存存入内存中的。可是,今天咱们不研究.net的缓存。今天,咱们来一块儿认识一个New Friend, she name is Fabric. APPFABRIC 是Microsoft推出东西。Windows Server AppFabric 扩展了 Windows Server .为 Web 应用程序和中间层服务提供加强的托管、管理和缓存功能。今天咱们只讲她的缓存功能,感兴趣的朋友能够Go http://msdn.microsoft.com/zh-cn/library/ee677312.aspx 研究一下。数据库
你们思考一个场景,五个客户端访问项目,就会生成5份缓存。这些缓存都存在了内存中,这就形成了浪费。那么Fabric 的分布式缓存就是为了解决这个问题出现的。编程
fabric的缓存功能是这样工做的,把多个服务器组成一个缓存群集,这些个服务器存放缓存,程序统一访问这些缓存群集,服务器的缓存是以window server 方式运行的。windows
你们看下图:缓存
上图就是Fabric的组件,我给你们一一来介绍一下他们。服务器
缓存主机:就是安装了Fabric服务的存放缓存用来供程序访问的服务器。数据结构
缓存群集:多个缓存主机构成了缓存群集.Note:同个缓存群集内的缓存主机是共享的。For Example:程序建立了一个缓存,放在了缓存主机A中,那么程序未来访问缓存主机B,也是能够获得缓存的。更新也是同样。分布式
缓存服务器:就是用来承载缓存主机的服务器.
群集配置存储位置:一个缓存群集须要配置,须要配置文件。
PowerShell:Fabric是基于PowerShell来管理缓存服务的。
缓存客户端:就是咱们的项目,就是须要访问缓存的项目。
GO http://www.microsoft.com/zh-cn/download/details.aspx?id=15848 下载Fabric software.
安装很简单的,可是,她要求你的本机必须安装有.net 3.5。这里,重点讲一下她的配置.
安装成功后,咱们能够经过她自带的配置工具,来配置咱们的Fabric。
这个页面是用来配置Fabric的托管、监控功能的。咱们Ignore了,继续下一步.
上图中的Set Caching Service configuration单选框要勾上,这是fabric缓存配置。
Caching Service account,咱们须要指定windows用户来管理缓存服务。这个帐户须要有管理员权限
Caching Service configuration provider:
是选择配置方式,.sdk说,缓存服务器若是是在工做组中,那么就要选择XML。Note:本人也是刚接触,不是特别了解。
File share:须要你在缓存服务器上,建立一个共享文件夹。这个文件夹必须可以另其余缓存服务器访问到。由于,它存放的是咱们缓存群集的XML配置文件。若是是第一次配置缓存群集,就选择New Cluster.未来为其余缓存集成员配置时,就能够选择Join Cluster.
Cluster Size:.它是Limit cache Cluster 的个数的,咱们能够控制缓存集中的缓存主机个数。
配置这些,咱们经过Power shell ,来查看一下咱们的配置。
以管理员身份运行Power shell.输入search command,来看一下缓存服务。Get-CacheHost 获得下图:
从图中,能够看到 Service Status is DOWN, 咱们须要将服务开启。
开始服务命令,须要参数。咱们须要设置参数
$myhost=Get-Cache
Start-CacheHost $myhost.HostName $myhost.portNO
执行完以后,服务已经开启了。咱们查看看一下:
Get-CacheHost
执行后以下图:
Service Status已是UP状态了。说明服务已经开启了。
可是,此时在客户端使用service以前,管理员应当给客户端分配windows帐户的访问权。Note:这个地方不是太懂,本身测试时,只是给本机的windows帐户分配访问权限。就是说,本机是缓存服务器又是客户端服务器。
Get-cacheallowedclientaccounts 命令,查看容许访问Service的客户端帐户有哪些.
咱们是第一次配置,因此当咱们输入命令查看被容许访问的客户端帐户时,会出现警告语。此时,咱们输入分配权限命令:Grant-CacheAllowedClientAccount($env:UserDomain+”\”+$env:UserName)
此时,客户端就能够访问咱们的Service了。
接下来,咱们来经过项目调用Service。首先,咱们须要在缓存服务器上创建一个缓存。New-Cache Default 输入建立缓存的命令 其中Default是缓存名称。客户端经过这个Default来获取缓存信息。
咱们来看一下客户端的代码:
首先咱们须要在web.config中配置一下:
<?xml version="1.0" encoding="utf-8"?> <!-- 有关如何配置 ASP.NET 应用程序的详细信息,请访问 http://go.microsoft.com/fwlink/?LinkId=169433 --> <configuration> <configSections> <!-- required to read the <dataCacheClient> element --><section name="dataCacheClient"
type
="Microsoft.ApplicationServer.Caching.DataCacheClientSection, Microsoft.ApplicationServer.Caching.Core, Version=1.0.0.0
, Culture=neutral, PublicKeyToken=31bf3856ad364e35
" allowLocation="true"
allowDefinition
="Everywhere"/>
</configSections><dataCacheClient requestTimeout="15000" channelOpenTimeout="3000" maxConnectionsToServer="1"> <localCache isEnabled="true" sync="TimeoutBased" ttlValue="300" objectCount="10000"/> <clientNotification pollInterval="300" maxQueueLength="10000"/> <hosts> <!--<host name="10.30.1.145" cachePort="22233"/>--> <host name="192.168.200.1" cachePort="22233"/> </hosts> <securityProperties mode="Transport" protectionLevel="EncryptAndSign" /> <transportProperties connectionBufferSize="131072" maxBufferPoolSize="268435456"
maxBufferSize
="8388608" maxOutputDelay="2" channelInitializationTimeout="60000"
receiveTimeout
="600000"/> </dataCacheClient>
<system.web> <compilation debug="true" targetFramework="4.0" /> </system.web> </configuration>
代码块中高亮部分,就是咱们须要的配置信息。配置完这些信息,咱们还须要引用四个类库。这四个类库是安装完Fabric,就会有的。他们位于\AppFabric 1.1 for Windows Server这个文件夹中:
Microsoft.ApplicationServer.Caching.Core.dll Microsoft.ApplicationServer.Caching.Client.dll Microsoft.WindowsFabric.Data.dll Microsoft.WindowsFabric.Common.dll
咱们的客户端的程序,是这样来测试Fabric缓存的。咱们经过Update、Get、Delete 、Create页面,来建立、修改、获取、删除咱们的缓存信息。缓存中存放的是咱们经过Create的页面建立的Order实体信息。
咱们会用到如下几个类:
ICacheController.cs:
namespace SampleWebApp{ ///<summary> ///缓存类的公共接口,包括了对缓存的增删改查的方法。 ///</summary> public interface ICacheController { ///<summary> ///判断该键值的数据在缓存中是否存在 ///</summary> ///<param name="key">键值</param> ///<returns>存在返回True,不存在返回False</returns> bool HasTheKey(String key); ///<summary> ///将数据插入缓存中,数据会在插入缓存中配置时间以后,自动删除 ///</summary> ///<param name="key">数据在缓存中的键值</param> ///<param name="value">数据</param> ///<param name="timespan">删除数据的时间间隔</param> ///<returns>插入成功,返回True,不然返回False</returns> bool AddDataWithAbsExpire(string key,object value,TimeSpan timespan); ///<summary> ///从缓存中获取数据 ///</summary> ///<param name="key">数据在缓存中的键值</param> ///<returns>有返回要获取的在缓存中的数据,没有则返回NULL</returns> object GetData(string key); ///<summary> ///把内存中键值为key的数据进行更行 ///</summary> ///<param name="key">数据在缓存中的键值</param> ///<param name="value">要更新的数据</param> ///<returns>更新成功返回True,不然返回False</returns> bool UpdateData(string key,object value); ///<summary> ///把内存中键值为key的数据进行删除 ///</summary> ///<param name="key">数据在缓存中的键值</param> ///<returns>删除成功返回True,不然返回False</returns> bool RemoveData(string key); } }
CacheUtil.cs:
public static class CacheUtil { //缓存工厂变量,获取缓存实例。 private static DataCacheFactory _factory=null; //缓存实例变量 private static DataCache _cache=null; public static DataCache GetCache() { if(_cache!=null) return _cache; //定义缓存服务器列表 //List<DataCacheServerEndpoint> servers=new List<DataCacheServerEndpoint>; //web.config文件中已经配置了,这里不须要配置了。客户端配置缓存功能,能够编程配置(实例化配置对象),也能够XML配置.(web.config) //servers.Add(new DataCacheServerEndpoint("10.30.1.145",22233)); //servers.Add(new DataCacheServerEndpoint("10.30.1.146",22233)); //建立缓存配置对象 DataCacheFactoryConfiguration configuration=new DataFactoryConfiguration(); //设置缓存配置的缓存服务器列表 //configuration.servers=servers; //为本地缓存设置默认属性(本地缓存禁用) configuration.LocalCacheProperties=new DataCacheLocalCacheProperies(); //禁用跟踪,以免信息/web页面的详细信息 DataCacheClientLogManager.changelogLevel(System.Diagnostics.TraceLevel.off); _factory=new DataCacheFacotry(configuration); //得到默认命名缓存 _cache=_factory.GetCache("default"); return _cache; } }
CacheFactory.cs
namespace SampleWebApp { //返回ICacheController实例 public class CacheFactory { pubic static ICacheController GetInstance() { ICacheController cacheInterface=new CacheControllerF(); return cacheInterface; } } }
CacheControllerF.cs
namespace SampleWebApp { //实现ICacheController接口 public class CacheControllerF:ICacheController { private DataCache cache; //构造函数 public CacheControllerF() { cache=CacheUtil.GetCache(); } public bool HasTheKey(string key) { if(cache.Get(key)!=null) return true; return false; } public bool AddDataWithAbsExpire(string key,object value,TimeSpan timeout) { if(!HasTheKey(key)) { cache.Add(key,value,timeout); }else { return false; } } public object GetData(string key) { object object=cache.Get(key); return object; } public bool updateData(string key,object value) { cahche.put(key,value); return true; } public bool RemoveData(string key) { return cache.Remove(key); } } }
以上就是我对APPFABRIC的学习认识。只是一点点皮毛,还需继续研究。