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

概述

Velocity是微软推出的分布式缓存解决方案,为开发可扩展性,可用的,高性能的应用程提供支持,可以缓存各种类型的数据,如CLR对象、XML、二进制数据等,并且支持集群模式的缓存服务器。Velocity也将集成在.NET Framework 4.0中,本文将介绍Velocity中的配置模型、缓存复杂数据和创建分区、使用标签以及ASP.NET SessionState提供者。

配置模型

在本文开始之前,先简单介绍一下Velocity中的配置模型,主要包括三方面的配置,缓存集群的配置,缓存宿主服务器配置以及应用程序的配置,如下图所示:

Velocity_001

缓存集群的配置,可以基于XML、SQL Server CE或者SQL Server数据库来进行存储,包括各个服务器以及所有的命名缓存、是否过期等配置,当我们使用Windows PowerShell管理工具进行配置时,将会修改该配置文件,如下代码所示:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="dcache" type="System.Data.Caching.DCacheSection, 
             CacheBaseLibrary, Version=1.0.0.0, Culture=neutral,
             PublicKeyToken=89845dcd8080cc91" />
  </configSections>
  <dcache cluster="localhost" size="Small">
    <caches>
      <cache type="partitioned" consistency="strong" name="default">
        <policy>
          <eviction type="lru" />
          <expiration defaultTTL="10" isExpirable="true" />
        </policy>
      </cache>
      <cache type="partitioned" consistency="strong" name="other">
        <policy>
          <eviction type="lru" />
          <expiration defaultTTL="10" isExpirable="true" />
        </policy>
      </cache>
    </caches>
    <hosts>
      <host clusterPort="22234" hostId="1319514812" size="1024" quorumHost="true"
          name="TERRYLEE-PC" cacheHostName="DistributedCacheService"
          cachePort="22233" />
    </hosts>
    <advancedProperties>
      <partitionStoreConnectionSettings providerName="System.Data.SqlServerCe.3.5"
          connectionString="D:\CacheShare\ConfigStore.sdf" />
    </advancedProperties>
  </dcache>
</configuration>

在上一篇的示例中,并没有使用应用程序配置文件,事实上使用配置文件是更好的编程实践,首先需要添加一个配置区:

<section name="dcacheClient"
type="System.Data.Caching.DCacheSection, 
      CacheBaseLibrary, Version=1.0.0.0, 
      Culture=neutral, PublicKeyToken=89845dcd8080cc91"/>

配置信息包括部署方式,是否启用本地缓存以及缓存宿主等,如下代码所示:

<dcacheClient>
  <localCache isEnabled="true" sync="TTLBased" ttlValue="300" />
  <hosts>
    <host name="localhost" cachePort="22233" 
          cacheHostName="DistributedCacheService"/>
  </hosts>
</dcacheClient>

现在Velocity CTP2对于应用程序使用配置的支持似乎有些问题。缓存宿主的配置放在DistributedCache.exe.config文件中,可以在Velocity安装目录下找到。

缓存复杂数据类型

在Velocity中,可以缓存任何类型的数据,如CLR对象、XML或者二进制数据等。现在看一个简单的示例,如何缓存复杂类型数据,定义一个如下的Customer类,注意要能够序列化:

[Serializable]
public class Customer
{
    public String ID { get; set; }

    public String FirstName { get; set; }

    public String LastName { get; set; }

    public int Age { get; set; }

    public String Email { get; set; }
}

对应用程序做配置,参考本文的配置模型部分,使用方法与简单数据类型的基本一致,如添加缓存项,使用Customer主键作为缓存键,其中GetCurrentCache()方法的实现请参考上一篇文章:

Cache cache = GetCurrentCache();
Customer customer = new Customer()
{
    ID = "C20081117002",
    FirstName = "Terry",
    LastName = "Lee",
    Age = 25,
    Email = "lhj_cauc[#AT#]163.com"
};

cache.Add(customer.ID, customer);

获取缓存项:

Cache cache = GetCurrentCache();
Customer customer = cache.Get("C20081117002") as Customer;

移除缓存项:

Cache cache = GetCurrentCache();
cache.Remove("C20081117002");

更新缓存中数据,可以有两种方法,一是直接使用缓存索引,如果确保缓存键存在:

Cache cache = GetCurrentCache();
Customer customer = new Customer()
{
    ID = "C20081117002",
    FirstName = "Huijui",
    LastName = "Li",
    Age = 26,
    Email = "lhj_cauc[#AT#]163.com"
};
cache["C20081117002"] = customer;

另外一种是使用Put方法,如果缓存键不存在,它将会新增到缓存中,否则会进行覆盖,如下代码所示:

Cache cache = GetCurrentCache();
Customer customer = new Customer()
{
    ID = "C20081117002",
    FirstName = "Huijui",
    LastName = "Li",
    Age = 26,
    Email = "lhj_cauc[#AT#]163.com"
};
cache.Put(customer.ID, customer);

使用分区

在实际部署中,经常会出现多个应用程序共享同一个缓存集群,这不可避免的会出现缓存键冲突,如上面的示例中使用CustomerID作为缓存键,此时可以使用Velocity中的分区功能,它会在逻辑上把各个命名缓存再进行分区,这样可以完全保持数据隔离,如下图所示:

TerryLee_0216

图中共有三个命名缓存,其中在缓存Catalog中又分区为Sports和Arts。在Velocity中对于分区的操作提供了如下三个方法,可以用于创建分区,删除分区以及清空分区中所有的对象:

public void ClearRegion(string region);
public bool CreateRegion(string region, bool evictable);
public bool RemoveRegion(string region);

如下代码所示,创建了一个名为“Customers”的分区,在调用Add方法时可以指定数据将会缓存到哪个分区:

Cache cache = GetCurrentCache();
string regionName = "Customers";
cache.CreateRegion(regionName, false);

Customer customer = new Customer()
{
    ID = "C20081117003",
    FirstName = "Terry",
    LastName = "Lee",
    Age = 25,
    Email = "lhj_cauc[#AT#]163.com"
};

cache.Add(regionName, customer.ID, customer);

可以使用Get-CacheRegion命令在Windows PowerShell中来查看一下当前缓存集群中所有的分区信息,如下图所示:

Velocity_002

同样在检索缓存数据时,仍然可以使用分区名进行检索。

使用标签

在Velocity还允许对加入到缓存中的缓存项设置Tag,可以是一个或者多个,使用了Tag,就可以从多个方面对缓存项进行描述,这样在检索数据时,就可以根据Tag来一次检索多个缓存项。为缓存项设置Tag,如下代码所示:

Cache cache = GetCurrentCache();
string regionName = "Customers";

Customer customer1 = new Customer()
{
    ID = "C20081117004",
    FirstName = "Terry",
    LastName = "Lee",
    Age = 25,
    Email = "lhj_cauc[#AT#]163.com"
};
Customer customer2 = new Customer()
{
    ID = "C20081117005",
    FirstName = "Terry",
    LastName = "Lee",
    Age = 25,
    Email = "lhj_cauc[#AT#]163.com"
};

Tag tag1 = new Tag("Beijing");
Tag tag2 = new Tag("Tianjin");
cache.Add(regionName, customer1.ID, customer1, new Tag[] { tag1, tag2 });
cache.Add(regionName, customer2.ID, customer2, new Tag[] { tag2 });

这样就可以对设置了Tag的缓存项进行检索,根据实际需求选择使用如下三个方法之一:

GetAllMatchingTags(string region, Tag[] tags)
GetAnyMatchingTag(string region, Tag[] tags)
GetByTag(string region, Tag tag)

第一个检索匹配所有Tag的数据,第二个检索匹配所有Tag中的任意一个即可,最后只使用一个Tag,如下代码所示:

string regionName = "Customers";
Tag[] tags = new Tag[] { new Tag("Beijing"), 
           new Tag("Tianjin")};

List<KeyValuePair<string, object>> result
    = cache.GetAllMatchingTags(regionName, tags);

使用Tag功能对于检索缓存项提供了极大的灵活性,对于任何一个数据,都可以使用多个Tag从很多方面去描述它。

ASP.NET SessionState提供者

Velocity还提供了对于ASP.NET SessionState提供者的支持,可以通过配置把Session信息缓存到缓存集群中,添加Velocity配置区:

<section name="dcacheClient"
         type="System.Data.Caching.DCacheSection, 
         CacheBaseLibrary, Version=1.0.0.0, 
         Culture=neutral, PublicKeyToken=89845dcd8080cc91"/>

配置缓存客户端信息:

<dcacheClient>
  <localCache isEnabled="true" sync="TTLBased" ttlValue="300" />
  <hosts>
    <host name="localhost" cachePort="22233" 
          cacheHostName="DistributedCacheService"/>
  </hosts>
</dcacheClient>

配置SessionState信息:

<sessionState mode="Custom" customProvider="Velocity">
  <providers>
    <add name="Velocity" 
         type="System.Data.Caching.SessionStoreProvider,ClientLibrary"
         cacheName="default"/>
  </providers>
</sessionState>

需要指定使用哪个命名缓存,但是该功能似乎到目前还存在问题,无法测试通过L

总结

本文简单介绍了Velocity的配置模型,以及如何缓存复杂数据类型,对命名缓存分区,为缓存项设置Tag,以及对于ASP.NET SessionState的支持,希望对大家有用。

相关文章:

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

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

 回复 引用 查看   
#1楼 2008-11-21 00:11 Astar      
支持,2008-11-21 00:00 等到这一时间发布的吧,呵呵.
 回复 引用 查看   
#2楼[楼主] 2008-11-21 00:25 TerryLee      
@Astar
多谢支持。

// 如有雷同,纯属巧合,呵呵

 回复 引用 查看   
#3楼 2008-11-21 00:46 Jeffrey Zhao      
不错不错,老兄是如何保持写作热情的阿,我堕落了。
 回复 引用 查看   
#4楼 2008-11-21 03:57 怪怪      
@Jeffrey Zhao
俺都快忘了你是谁啦哈哈 =D

2008-11-20 00:01
上次可能是dudu的服务器阻塞了一分钟,呵呵

 回复 引用 查看   
#6楼 2008-11-21 08:35 李永京      
哎!现在白天了,老李一般都喜欢晚上写作文?不知道现在起来没有?
 回复 引用 查看   
#7楼 2008-11-21 08:49 玉开      
不知微软的这个性能如何
 回复 引用 查看   
#8楼 2008-11-21 09:19 小庄      
"现在Velocity CTP2对于应用程序使用配置的支持似乎有些问题。"
"需要指定使用哪个命名缓存,但是该功能似乎到目前还存在问题,无法测试通过L "
一篇文章两个地方都有问题!看来还得等!

 回复 引用   
#9楼 2008-11-21 09:20 迷惘[未注册用户]
连这个都集成到.NET Framework 4.0,真是有点担心.NET Framework 4.0安装包有多大...
 回复 引用 查看   
#10楼[楼主] 2008-11-21 09:31 TerryLee      
@Jeffrey Zhao
呵呵,其实有一段时间我也堕落了,主要是感觉好多东西,不学习就跟不上了:)

 回复 引用 查看   
#11楼[楼主] 2008-11-21 09:33 TerryLee      
@怪怪
睡的这么晚?还是已经起床了,呵呵

 回复 引用 查看   
#12楼[楼主] 2008-11-21 09:34 TerryLee      
@共同学习,共同进步
:)

 回复 引用 查看   
#13楼[楼主] 2008-11-21 09:35 TerryLee      
@李永京
白天要上班啊,没时间写,只好晚上写了

// 我们上班晚,可以晚一些起:)

 回复 引用 查看   
#14楼[楼主] 2008-11-21 09:35 TerryLee      
@玉开
现在无法测试,也没看到微软有相关的测试报告:)

 回复 引用 查看   
#15楼[楼主] 2008-11-21 09:38 TerryLee      
@小庄
呵呵,也可能是我配置有问题,总之是没有测试成功:(

 回复 引用 查看   
#16楼[楼主] 2008-11-21 09:38 TerryLee      
@迷惘
不用担心,呵呵,这个Velocity其实很小的:)

 回复 引用 查看   
#17楼 2008-11-21 09:39 Jeffrey Zhao      
@TerryLee
我也学啊,不过都不想写,越多东西要学我就越不想写,越想不停学。

 回复 引用 查看   
#18楼[楼主] 2008-11-21 09:44 TerryLee      
@Jeffrey Zhao
的确是,现在有太多的东西要学习-_-,我也只能尽量坚持写一点东西出来:)

 回复 引用 查看   
#19楼 2008-11-21 09:47 Jeffrey Zhao      
@TerryLee
但是其实微软的这些“技术”我觉得可写性不多……都比较简单……

 回复 引用 查看   
#20楼 2008-11-21 09:48 Jeffrey Zhao      
对了,你的代码是怎么着色的啊?好像和VS一样。
 回复 引用 查看   
#21楼[楼主] 2008-11-21 09:52 TerryLee      
@Jeffrey Zhao
我用的是一个Windows Live Writer插件,好像叫做Copy from Visual Studio,可以保持Visual Studio中的着色:)

 回复 引用 查看   
#22楼 2008-11-21 09:53 Artech      
@TerryLee
天天看到你,有点审美疲劳了。
不过还是要支持的,呵呵!
@Jeffrey Zhao
我也想问问你的Blog的洋式很漂亮,怎么做的,由现成的模板,还是你完全通过CSS实现的。

 回复 引用 查看   
#23楼[楼主] 2008-11-21 10:01 TerryLee      
@Artech
-_-我要出去躲几天了,呵呵

老赵的Blog在博客园提供的模板中有这个模板啊:)

 回复 引用   
#24楼 2008-11-21 10:05 亮晶晶[未注册用户]
@Jeffrey Zhao
Jeffrey Zhao现在已经是只顾自己了,已经没有以前的奉献精神了,写Blog无非是技术共享,帮助后进者,其实是一种成就感,工作成就是为了挣钱,这个成就是为了精神的充实,帮助别人是美德

 回复 引用 查看   
#25楼 2008-11-21 10:06 Artech      
@TerryLee
错了,我是说我和老赵一样想问你的Blog的样式怎么实现的:)

 回复 引用 查看   
#26楼 2008-11-21 10:08 无心雨云      
人都很懒(我),只想看看,就不想动手试试
 回复 引用 查看   
#27楼[楼主] 2008-11-21 10:09 TerryLee      
@亮晶晶
呵呵,其实不是每个人都有充足的时间来写Blog,写Blog的前提也要工作,也要挣钱,养活自己。园子里好多同志包括老赵还是很有奉献精神的:)

 回复 引用 查看   
#28楼[楼主] 2008-11-21 10:10 TerryLee      
@Artech
呵呵,理解错误:(

我这个是自定义CSS样式来实现的。如果你需要的话,我可以把css发给你:)

 回复 引用 查看   
#29楼[楼主] 2008-11-21 10:10 TerryLee      
@无心雨云
有些东西还是动手试一下比较好:-)

 回复 引用 查看   
#30楼 2008-11-21 10:14 Artech      
@TerryLee
好呀,给给我吧,我也想弄一个 呵呵。发到我的邮件中 jiangjinnan@gmail.com。
先谢了!

 回复 引用 查看   
#31楼[楼主] 2008-11-21 10:50 TerryLee      
@Artech
已经发给你了:)

 回复 引用   
#32楼 2008-11-21 10:59 St.Z[未注册用户]
跟着学习了段时间,不错,支持下...
 回复 引用 查看   
#33楼 2008-11-21 11:09 李永京      
呵呵,关于文章写作样式,我研究很久了~~~~现在对博客园所有文章的写作样式都清楚了,发现老李的排版最好!唯一就是颜色有点单调~~~强烈大家使用Live插件
 回复 引用 查看   
#34楼 2008-11-21 11:45 Jeffrey Zhao      
--引用--------------------------------------------------
亮晶晶: @Jeffrey Zhao
Jeffrey Zhao现在已经是只顾自己了,已经没有以前的奉献精神了,写Blog无非是技术共享,帮助后进者,其实是一种成就感,工作成就是为了挣钱,这个成就是为了精神的充实,帮助别人是美德
--------------------------------------------------------
乱说,我最有奉献精神了,只是不知道怎么奉献而以。

 回复 引用 查看   
#35楼 2008-11-21 11:45 Jeffrey Zhao      
@TerryLee
好啊好啊

 回复 引用 查看   
#36楼 2008-11-21 11:48 xjb      
收藏研究一下
 回复 引用 查看   
#37楼[楼主] 2008-11-21 12:19 TerryLee      
@St.Z
多谢支持,呵呵:)

 回复 引用 查看   
#38楼[楼主] 2008-11-21 12:20 TerryLee      
@李永京
小李同志研究文章的样式有一套,呵呵,其实单调也好,简单就是美嘛:)

 回复 引用 查看   
#39楼[楼主] 2008-11-21 12:20 TerryLee      
@Jeffrey Zhao
:-)

 回复 引用 查看   
#40楼[楼主] 2008-11-21 12:20 TerryLee      
@xjb
:)

 回复 引用 查看   
#41楼 2008-11-21 12:31 xjb      
--引用--------------------------------------------------
TerryLee: @Jeffrey Zhao
我用的是一个Windows Live Writer插件,好像叫做Copy from Visual Studio,可以保持Visual Studio中的着色:)
--------------------------------------------------------

应该叫:Paste from Visual Studio

 回复 引用 查看   
#42楼 2008-11-21 12:41 montaque      
呵呵,微软很有意思

上次去PDC,有两个Partner,一个是NCache,一个是Scaleout
这两个都是.NET版本的商业方案

他们的特性目前都是Velocity在学习的

我问他们,微软做velocity了,你们怎么办

回答:不做评价,哈哈

 回复 引用 查看   
#43楼 2008-11-21 23:04 阿不      
Terrylee 的排名什么时候超过dudu啊,加油
 回复 引用   
#44楼 2008-11-21 23:23 leo.zhang[未注册用户]
如果是集群,有两个或两个以上的缓存服务器,配置里应该怎么配呢?那么取缓存的时候是不是也要区分服务器,请教一下?谢谢
 回复 引用 查看   
#45楼[楼主] 2008-11-22 00:08 TerryLee      
@xjb
嗯,你说的,我记错了,呵呵

 回复 引用 查看   
#46楼[楼主] 2008-11-22 00:08 TerryLee      
@montaque
呵呵,希望Velocity在正式版的时候更强:)

 回复 引用 查看   
#47楼[楼主] 2008-11-22 00:09 TerryLee      
@阿不
dudu是我的目标,呵呵:)

 回复 引用 查看   
#48楼[楼主] 2008-11-22 00:10 TerryLee      
@leo.zhang
在客户端的配置,可以指定多台服务器,看到<hosts>节点了吗,下面可以添加多个host,取缓存时不用再指定服务器:)

 回复 引用 查看   
#49楼 2008-11-22 09:06 TaranChen      
简直佩服死 Tarrylee 了, 一直坚持,坚持,再坚持.
快超过dudu了

 回复 引用 查看   
#50楼[楼主] 2008-11-22 10:09 TerryLee      
@TaranChen
呵呵,我尽量坚持:)

 回复 引用 查看   
#51楼 2008-11-22 13:46 Mahon      
支持老大,好久都没来了,最近好忙
 回复 引用 查看   
#52楼[楼主] 2008-11-22 17:07 TerryLee      
@Mahon
谢谢支持,欢迎回来,要常回来看看啊:)

 回复 引用 查看   
#54楼[楼主] 2008-12-08 10:51 TerryLee      
@sagacite
看过了:)

 回复 引用 查看   
#55楼 2010-06-17 11:51 lampson      
做个几号,呵呵,
LZ真是牛

 回复 引用 查看   
#56楼 2010-11-18 23:51 manimanihou