使用微软分布式缓存服务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 阅读(14800) 评论(81) 编辑 收藏

 回复 引用 查看   
#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?
@亮晶晶
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群。

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

快点写,大哥
 回复 引用   
#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以及并行编程等。

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

集群配制:其中提供了这个集群中有多少台机器提供配制服务的信息
宿主配制:提供缓存的机器的配制信息

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台虚拟机配的,累啊
一会试试写代码.

 回复 引用 查看   
#81楼 2011-03-22 10:39 jeffrey chen      
Cache Host Configuration通不过啊