使用微软分布式缓存服务Velocity Part 1

概述

Velocity是微软推出的分布式缓存解决方案,为开发可扩展性,可用的,高性能的应用程提供支持,可以缓存各种类型的数据,如CLR对象、XML、二进制数据等,并且支持集群模式的缓存服务器。Velocity也将集成在.NET Framework 4.0中,本文将介绍Velocity的一些预备知识、安装配置以及开发一个简单的示例。

简介

既然是分布式的缓存平台,客户端应用程序能够与缓存服务器集群中的任何一台服务器通信,并且执行缓存操作,如新增缓存项,移除缓存项等。在Velocity中,提供了一套统一的API,开发者可以使用任何一种.NET语言来访问这些API,如图1所示:

TerryLee_0212

图 1

物理模型

在整个Velocity分布式缓存解决方案中,从物理模型上来看,主要涉及到如下几个元素:缓存宿主,缓存集群,Velocity提供的基于Windows PowerShell的管理工具,对于服务器集群配置的存储。缓存宿主是指一个或者多个以Windows服务形式运行的服务器,每台服务器都可以运行缓存宿主服务;缓存集群是一个或者多个缓存宿主实例的集合;当缓存集群启动时,它将从集群配置存储位置处来获取配置信息,Velocity提供了多种方式的集群配置信息存储,可以基于XML文件、SQL Server数据库或者SQL Server CE等;基于PowerShell的管理工具后面会详细讲到。 如图2所示:

TerryLee_0213 

图 2

逻辑模型

从逻辑模型上来看,在Velocity中主要有命名缓存,在命名缓存中我们还可以继续分区,命名缓存,可以理解为内存中的一个独立的存储结构单元,它们之间完全互相隔离,互不干扰,当有多个应用程序共享同一个缓存集群时,可以为每个应用程序分别建立命名缓存;在同一个命名缓存中,还可以对命名缓存进行分区,这样即可以解决数据冲突的问题,再配合Velocity中的“标签”功能,可以极大的提高检索效率。如图3所示:

TerryLee_0216  

图 3

安装

Velocity当前最新的版本是CTP 2,大家可以到微软官方站点下载,由于Velocity中提供了一套基于Windows PowerShell的管理工具,所以在安装之前需要首先安装Windows PowerShell。在安装过程中,其中有一步需要进行服务器集群的配置,如图4所示:

TerryLee_0214

图 4

需要设置服务及集群端口号,集群配置的存储位置,集群配置存储的Provider,可以基于XML存储或者基于SQL Server CE存储等。另外可以访问如下站点获得一些资源:

团队博客:http://blogs.msdn.com/velocity/ 

示例代码:http://code.msdn.microsoft.com/velocity

安装完成后,请在Windows Service中启动Microsoft project code named "Velocity"服务。

管理工具

Velocity提供了基于Windows PowerShell的管理工具,对于Windows PowerShell不熟悉的可以参考《回归Dos操作的快感,进入PowerShell世界》这篇文章。使用Windows PowerShell可以非常方便的对Velocity缓存集群、缓存宿主等进行管理。使用如下命令金额图对启动、停止、重启服务器集群:

Start-CacheCluster 
Stop-CacheCluster 
Restart-CacheCluster 

使用如下命令可以启动、停止缓存宿主、获取命名缓存、获取缓存分区等:

Get-CacheHost 
Get-CacheConfig 
Set-CacheConfig 
Start-CacheHost 
Stop-CacheHost 
Get-CacheStatistics 
Get-Cache 
Get-CacheRegion 

如使用Get-CacheHost命令获取缓存宿主的信息,如图5所示,可以看到宿主对应的服务名以及服务状态等:

TerryLee_0217

图 5

使用Get-Cache命名查看所有的命名缓存,如图6所示:

TerryLee_0218

图 6

使用该管理工具还可以创建、移除命名缓存等,这里不再叙述。

简单示例

经过前面一大堆的理论介绍,现在来看一个最简单的示例。首先要把CacheBaseLibrary和ClientLibrary这两个程序集添加到应用程中,在Velocity安装目录下可以找到,并且引入命名空间:

using System.Data.Caching;

在使用Velocity缓存数据时,首先需要创建一个命名缓存,它可以通过CacheFactory来创建,如下代码所示:

private Cache GetCurrentCache()
{
    Cache dCache;
    ServerEndPoint[] servers = new ServerEndPoint[1];
    servers[0] = new ServerEndPoint("localhost", 22233, "DistributedCacheService");
    bool routingClient = true;
    bool localCache = false;
    var factory = new CacheFactory(servers, routingClient, localCache);
    dCache = factory.GetCache("default");

    return dCache;
}

此处首先指定了所有的服务器信息,当然这些都可以放在应用程序配置文件中,将会在下篇中介绍,有了Cache对象,其它的使用就非常方便了,如我们可以使用Add、Put、Remove、Get等方法来对缓存项进行操作,

添加缓存项:

Cache dCache = GetCurrentCache();

String key = keyTextbox.Text;
String val = valueTxtBox.Text;

if (key == "" || val == "") return;

dCache.Add(key, val);
statusLabel.Text =
    String.Format("Successfully added key {0} to cache.", key);

获取缓存项:

Cache dCache = GetCurrentCache();
String key = keyTextbox.Text;

if (key == "") return;

String val = dCache.Get(key).ToString();
valueTxtBox.Text = val;
statusLabel.Text =
    String.Format("Successfully did Get of key {0} from cache", key);

运行程序可以测试,数据被正确的缓存,如图7所示:

TerryLee_0219

图 7

总结

本文简单介绍了微软的分布式缓存解决方案Velocity的一些概念以及开发了一个简单的示例,希望对大家有用。在下篇文章中,我们将会更深入学习缓存复杂数据类型以及Velocity的编程模型和配置模型。

相关文章:

1. 使用微软分布式缓存服务Velocity Part 2

作者:TerryLee
出处:http://terrylee.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
posted @ 2008-11-20 00:01 TerryLee 阅读(7837) 评论(80)  编辑 收藏 网摘 所属分类: [01]  .NET大本营

  回复  引用  查看    
#1楼2008-11-20 00:02 | Anytao      
怎么有是你?
  回复  引用  查看    
#2楼[楼主]2008-11-20 00:03 | TerryLee      
@Anytao
怎么就不是我?:)

  回复  引用  查看    
#3楼[楼主]2008-11-20 00:05 | TerryLee      
@Anytao
这玩意儿是个好东西,呵呵

  回复  引用  查看    
#4楼2008-11-20 00:06 | Anytao      
@TerryLee
嘿嘿,明天看看,太快了,受不了,睡觉。

  回复  引用  查看    
#5楼2008-11-20 00:13 | Astar      
支持,即使看不懂.....,问下文章中的图片阴影是用什么软件做的?不是PS吧
  回复  引用    
#6楼2008-11-20 00:20 | 亮晶晶[未注册用户]
你老哥从哪获得这么多信息?真受不了了,唉,佩服你
多大了你?精力如此旺盛?

  回复  引用  查看    
#7楼[楼主]2008-11-20 00:28 | TerryLee      
@Astar
谢谢支持,呵呵,其实不难,主要是使用,因为会集成在.NET Framework 4.0中,所以还是要看看的:)

//就是PS的

  回复  引用  查看    
#8楼[楼主]2008-11-20 00:29 | TerryLee      
@亮晶晶
呵呵,获取信息的地方有很多啊,最好的办法就是多关注老外的Blog和一些国外好的站点。

// 具体年龄嘛这里就不透露了:)

  回复  引用  查看    
#9楼2008-11-20 00:46 | zhaorui      
把cache放到服务器或者是集群上有什么特别的好处么?分享cache?
  回复  引用  查看    
#10楼2008-11-20 01:50 | volnet(可以叫我大V)      
@亮晶晶
lee兄就是派出去的间谍……:)

@TerryLee
又出新系列了,Lee比微软还快,我倒~

  回复  引用    
#11楼2008-11-20 08:23 | 路人甲1088[未注册用户]
Lee的文章都是精华,,吸收吸收。。
  回复  引用  查看    
#12楼2008-11-20 08:24 | 高海东      
在集群中,各个服务器之间的缓存会同步吗?
  回复  引用  查看    
#13楼2008-11-20 08:28 | 丁学      
to 1-4楼:
怎么又是你俩?!
不行了,我也得写,不能老看你俩搞

  回复  引用  查看    
#14楼2008-11-20 08:42 | 阿不      
王-李-丁 三个男人一台戏,哈哈。
分布式缓存,做大了,会不会变成数据库?那在大数据量的时候,如何检索缓项是个问题。

  回复  引用  查看    
#15楼2008-11-20 08:56 | 重典      
果然又是李、、、
  回复  引用  查看    
#16楼[楼主]2008-11-20 08:58 | TerryLee      
@zhaorui
好处非常多了,呵呵
1. 如果有足够的硬件设备,使用集群做缓存跟一台服务器做缓存在效率上的提升不言而喻;
2. 如果有了缓存集群,可以多个应用程序共享缓存集群;
3. 在Velocity中,使用了一系列的方法,极大的提高了缓存项的检索速度:)

  回复  引用  查看    
#17楼[楼主]2008-11-20 08:59 | TerryLee      
@volnet(可以叫我大V)
呵呵,这个Velocity系列非常短,可能只有3-4篇:)

  回复  引用  查看    
#18楼[楼主]2008-11-20 08:59 | TerryLee      
@路人甲1088
呵呵,谢谢支持:)

  回复  引用  查看    
#19楼[楼主]2008-11-20 09:00 | TerryLee      
@高海东
会的,无需考虑缓存项具体在哪台服务器上,看上面的逻辑模型图就可以知道,每个命名缓存在各个服务器中都可能存在:)

  回复  引用  查看    
#20楼[楼主]2008-11-20 09:00 | TerryLee      
@丁学
快点写吧,呵呵,我顶你:)

  回复  引用  查看    
#21楼2008-11-20 09:01 | Indigo Dai      
@阿不
你的回复第一句话说得对

  回复  引用  查看    
#22楼[楼主]2008-11-20 09:02 | TerryLee      
@阿不
检索缓存项方面,在Velocity方面做了一些考虑,如使用分区,为缓存项设置“标签”,这样可以极大的提高检索速度。
当然了,在后面的版本中,也许还有更多的改进,呵呵

  回复  引用  查看    
#23楼[楼主]2008-11-20 09:02 | TerryLee      
@重典
:-)

  回复  引用    
#24楼2008-11-20 09:07 | ourlife[未注册用户]
非常喜欢看老兄的文章,发现老兄文章的配图都非常清楚漂亮,不知道是什么工具画的?
  回复  引用  查看    
#25楼2008-11-20 09:14 | Artech      
几个月前本打算将它用到项目中去的,考虑到只是CTP。所以通过SQL Dependency的原理写了一个支持分布式、负载均衡的缓存实现。
  回复  引用  查看    
#26楼2008-11-20 09:20 | West      
产量高,质量好。。。。
  回复  引用  查看    
#27楼2008-11-20 09:23 | 余寅槎      
有经过大环境的测试吗,对于Volicity。

memercached可是顶的住200台3G群。

微软有没有相关的测试报告。

  回复  引用    
#28楼2008-11-20 09:24 | 帮助翻译文档[未注册用户]
快点写,大哥
  回复  引用    
#29楼2008-11-20 09:26 | WiliamsWu[未注册用户]
MS版MemCache,间断性的在关注,没想到就要集成到.net framework4.0了
  回复  引用  查看    
#30楼2008-11-20 09:29 | 栖山      
写得很好,支持一下!
  回复  引用  查看    
#31楼2008-11-20 09:35 | G yc {Son of VB.NET}      
发布速度太快了~~


  回复  引用  查看    
#32楼2008-11-20 09:36 | 生鱼片      
不错 不错
  回复  引用  查看    
#33楼2008-11-20 09:51 | 代震军      
不错,有时间研究一下:)
  回复  引用  查看    
#34楼2008-11-20 09:55 | Figo Yang      
与memcached对比,无论从性能,易用性,扩展性等等方面。。velocity都有很长一段路要走啊。。暂时还是安分一点继续用memcached了。。
  回复  引用  查看    
#35楼[楼主]2008-11-20 10:03 | TerryLee      
--引用--------------------------------------------------
Indigo Dai: @阿不
你的回复第一句话说得对
--------------------------------------------------------
-_-

  回复  引用  查看    
#36楼[楼主]2008-11-20 10:04 | TerryLee      
@ourlife
谢谢,有些是从其它资料上找的,有些使用Visio画的,边框效果是PS的:)

  回复  引用  查看    
#37楼[楼主]2008-11-20 10:06 | TerryLee      
@Artech
厉害啊,呵呵,CTP版本确实会带来很多问题,等Velocity RTM出来之后,也就是集成在.NET Framework 4.0以后,应该可以完全满足分布式缓存的需要。

  回复  引用  查看    
#38楼[楼主]2008-11-20 10:06 | TerryLee      
@West
谢谢支持:)

  回复  引用  查看    
#39楼[楼主]2008-11-20 10:07 | TerryLee      
@余寅槎
现在还只是CTP版本,没有看到相应的测试报告:)

  回复  引用  查看    
#40楼[楼主]2008-11-20 10:07 | TerryLee      
@帮助翻译文档
尽量加快:)

  回复  引用  查看    
#41楼[楼主]2008-11-20 10:08 | TerryLee      
@WiliamsWu
嗯,我关注Velocity有一段时间了,最近看到.NET Framework 4.0的一些介绍时,才注意到集成到.NET Framework 4.0中了:)

  回复  引用  查看    
#42楼[楼主]2008-11-20 10:09 | TerryLee      
@栖山
谢谢支持:)

  回复  引用  查看    
#43楼[楼主]2008-11-20 10:09 | TerryLee      
@G yc {Son of VB.NET}
呵呵:)

  回复  引用  查看    
#44楼[楼主]2008-11-20 10:09 | TerryLee      
@生鱼片
多谢:)

  回复  引用  查看    
#45楼[楼主]2008-11-20 10:10 | TerryLee      
@代震军
呵呵,绝对要看看,这东西不错:)

  回复  引用  查看    
#46楼[楼主]2008-11-20 10:12 | TerryLee      
@Figo Yang
性能方面还不知道,但是易用性方面没觉的有什么差的,毕竟还只是CTP啊:)

  回复  引用  查看    
#47楼2008-11-20 10:22 | PerfectDesign      
老李,我一直在等您的ucenter啊,呵呵
  回复  引用  查看    
#48楼2008-11-20 11:00 | 李永京      
晕倒!老李又玩新花样了~~~
  回复  引用  查看    
#49楼2008-11-20 11:31 | Jeffrey Zhao      
这些东西用起来都是很容易的……
  回复  引用  查看    
#50楼[楼主]2008-11-20 12:34 | TerryLee      
@PerfectDesign
现在更名为Ezsocio,可以读为“Easy Social”,最近开发团队成员比较忙,我们正在讨论一些细节问题:)

  回复  引用  查看    
#51楼[楼主]2008-11-20 12:34 | TerryLee      
@李永京
呵呵,其实Velocity CTP1出来很久了:)

  回复  引用  查看    
#52楼[楼主]2008-11-20 12:35 | TerryLee      
@Jeffrey Zhao
对的,Velocity API设计的比较简单,使用起来很方便:)

  回复  引用    
#53楼2008-11-20 13:19 | pzrr[未注册用户]
用是其次,关键是能达到生产环境使用的级别。

出来有段时间了,也关注了,但是毕竟没 正式发布,所以也不敢在项目中使用。

  回复  引用  查看    
#54楼2008-11-20 14:11 | City22      
velocity的keyword的功能很方便
  回复  引用  查看    
#55楼2008-11-20 14:41 | Tony Zhou      
very good
  回复  引用  查看    
#56楼2008-11-20 16:38 | xjb      
不知道运行速度如何?
  回复  引用  查看    
#57楼2008-11-20 19:14 | 一舟      
不错,学到老,活到老

KiloNet.CN技术服务网
http://www.kilonet.cn/
http://bbs.kilonet.cn/

  回复  引用  查看    
#58楼2008-11-20 19:53 | 侯垒      
来晚了,也得顶呀!
  回复  引用  查看    
#59楼2008-11-20 20:45 | 戏水      
这东东确实很好。 希望会军兄的这个系列,多着笔墨。细致入微。深入浅出。

  回复  引用  查看    
#60楼2008-11-20 22:35 | canbeing      
现在.net framework做得越来越好了,把常用的东西都集成了
会军兄学习得真前沿

  回复  引用  查看    
#61楼[楼主]2008-11-20 23:43 | TerryLee      
@pzrr
现在还只是CTP 2,测试了一下,也发现还有很多问题,所以还是等正式版发布后再使用吧:)

  回复  引用  查看    
#62楼[楼主]2008-11-20 23:43 | TerryLee      
@City22
你说的KeyWords指的是Tag吗?

  回复  引用  查看    
#63楼[楼主]2008-11-20 23:43 | TerryLee      
@Tony Zhou
:)

  回复  引用  查看    
#64楼[楼主]2008-11-20 23:44 | TerryLee      
@xjb
呵呵,没有集群服务器去测试,只在本机上做了一些简单的示例

  回复  引用  查看    
#65楼[楼主]2008-11-20 23:44 | TerryLee      
@一舟
:)

  回复  引用  查看    
#66楼[楼主]2008-11-20 23:44 | TerryLee      
@侯垒
多谢支持,呵呵:)

  回复  引用  查看    
#67楼[楼主]2008-11-20 23:45 | TerryLee      
@戏水
这个东东也没有多少东西要介绍的,呵呵,所以也就几篇文章而已:)

  回复  引用  查看    
#68楼[楼主]2008-11-20 23:46 | TerryLee      
@canbeing
.NET Framework 4.0中添加了不少东西,包括本文所说的Velocity,还有MEF以及并行编程等。

// 我只是想尽量跟上:)

  回复  引用  查看    
#69楼2008-11-21 06:17 | 共同学习,共同进步      
集群配制:其中提供了这个集群中有多少台机器提供配制服务的信息
宿主配制:提供缓存的机器的配制信息

Service Port Number 22233
Cluster Port Number 22234

private Cache GetCurrentCache()
{
Cache dCache;
ServerEndPoint[] servers = new ServerEndPoint[1];

//为什么这里的配制不是集群的,而是宿主的计算机的名称和端口
servers[0] = new ServerEndPoint("localhost", 22233, "DistributedCacheService");

bool routingClient = true;
bool localCache = false;
var factory = new CacheFactory(servers, routingClient, localCache);
dCache = factory.GetCache("default");

return dCache;
}
请教一个问题,我的描述是不是正确.谢谢

  回复  引用  查看    
#70楼[楼主]2008-11-21 09:37 | TerryLee      
@共同学习,共同进步
这是两个配置:集群的配置放在集群配置信息中,这里的配置其实是应用程序配置,可以选择使用集群中的某几台服务器。
我在下一篇中有讲到配置模型:)

  回复  引用  查看    
#71楼2008-11-21 22:22 | PerfectDesign      
@TerryLee
很期待啊!
希望easy social快出来,省了我不少工作
为的这个,我都把网站升级成3.5的了

  回复  引用  查看    
#72楼[楼主]2008-11-22 00:07 | TerryLee      
@PerfectDesign
只能尽量,呵呵,你知道大家的业余时间都不是很多:)

  回复  引用    
#73楼2008-11-27 09:34 | 一舟未登陆[未注册用户]
@楼主
我按你写的步骤进行,但程序运行到这一句时就没反应了
dCache = factory.GetCache("default");

谢谢

  回复  引用  查看    
#74楼[楼主]2008-11-30 23:59 | TerryLee      
@一舟未登陆
可能是没有名为default的命名缓存,你可以使用那个管理工具先创建一个:)

  回复  引用  查看    
#75楼2008-12-03 16:25 | yuanws      
还需要 CASBase.dll FabricCommon.dll 的引用
  回复  引用  查看    
#76楼2008-12-03 16:28 | yuanws      
能写个跟memcache比较的文章吗
  回复  引用  查看    
#77楼[楼主]2008-12-08 10:53 | TerryLee      
@yuanws
只有需要记录日志时才会用该组件,并不是一定需要:)

  回复  引用  查看    
#78楼[楼主]2008-12-08 10:54 | TerryLee      
@yuanws
memcached我还不是很了解,回头看一下,然后跟Velocity进行比较一下:)

  回复  引用  查看    
#79楼2009-02-10 13:56 | MasterCai      
很好,很强大!
楼主有没有现成在.net中使用的客户端缓存解决方案?性能要好一些的!


  回复  引用    
#80楼2009-02-23 16:58 | bitwolaiye[未注册用户]
终于配完了.参考了LEE的介绍配的.但最麻烦的是,如果要配多机需要机器在同一个域中,那样共享地址才能访问.
我是用本装了2台虚拟机配的,累啊
一会试试写代码.

发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1337121




历史上的今天:
2006-11-20 AJAX,只是一种过渡技术吗?

相关文章:

相关链接: