概述

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

配置模型

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

缓存集群的配置,可以基于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中的分区功能,它会在逻辑上把各个命名缓存再进行分区,这样可以完全保持数据隔离,如下图所示:

图中共有三个命名缓存,其中在缓存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还允许对加入到缓存中的缓存项设置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的支持,希望对大家有用。

本文出自 “TerryLee技术专栏” 博客,请务必保留此出处http://terrylee.blog.51cto.com/342737/151964

使用微软分布式缓存服务Velocity(Windows Server AppFabric Caching Service)的更多相关文章

  1. Windows Server AppFabric分布式缓存研究

    分享一则先前对Windows Server AppFabric分布式缓存的技术研究. 一. AppFabric 技术架构和原理 AppFabric与Memcached类似,采用C/S的模式,在 ser ...

  2. 如何用分布式缓存服务实现Redis内存优化

    Redis是一种支持Key-Value等多种数据结构的存储系统,其数据特性是“ALL IN MEMORY”,因此优化内存十分重要.在对Redis进行内存优化时,先要掌握Redis内存存储的特性比如字符 ...

  3. 误解了Windows Server AppFabric

    想为自己的流程引擎找一个宿主,选择了几套方案,想先从AppFabric开始,原因主要出于以下几点: 1. 自己用过Windows Service或Form作为一些定时任务等应用的宿主,但苦于学艺不精, ...

  4. Windows Server AppFabric 安装文档

    安装指南 入门标题页 3 Windows Server AppFabric 安装和配置指南 3 版权 3 版权所有 3 简介 3 清单:规划安装 4 硬件要求 4 使计算机作好安装准备 5 本节内容 ...

  5. 浅谈Windows Server APPFABRIC

    hi,everyone !真的是好久好久没有update blog了,因为最近忙着备考,没有时间对<数据结构与算法>进行研究学习了.所以,blog一直未更新.today is Friday ...

  6. SharePoint 2013 必备组件之 Windows Server AppFabric 安装错误

    1.如下图,在使用SharePoint2013产品准备工具的时候,网上下载安装Windows Server AppFabric的时候,报错,点击完成重启计算机,重新安装依然报错. 2.无奈之下,只有选 ...

  7. Windows Server AppFabric

    文章:Windows Server AppFabric简介 介绍了AppFabric强大的功能.

  8. 微软分布式缓存 appfabric

    appfabric为微软自家产的分布式缓存解决方案,随dotnet4.0一起发布.目前版本为1.1

  9. 华为云分布式缓存服务DCS与开源服务差异对比

    华为云分布式缓存DCS提供单机.主备.集群等丰富的实例类型,满足用户高读写性能及快速数据访问的业务诉求.支持丰富的实例管理操作,帮助用户省去运维烦恼.用户可以聚焦于业务逻辑本身,而无需过多考虑部署.监 ...

随机推荐

  1. FVDI Commander products be replaced SVDI tools,really?

    You may have heard that some FVDI Commander products are being replaced by the new SVDI tools. This ...

  2. 2.1.5 用SSS扫描器实施扫描

    SSS(Shadow Security Scaner)是一款著名的系统漏洞扫描器,可对很大范围内的系统漏洞进行安全.高效.可靠的安全检测,其系统扫描的速度与精度足以让用户敢和专业安全机构的人以及那些专 ...

  3. Java线程同步的方式

     java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查),      将会导致数据不准确,相互之间产生冲突,因此加入同步锁以避免在该线程没有完成操作之前,被其他线程的 ...

  4. android开发之路12(android四大组件&Fragment&AsyncTask类)

    一.Activity组件1.简介:Activity组件是Android四大组件之一,通常一个Activity相当于一个用户界面,我们可以通过加载布局文件将Android提供的各种控件及自定义控件显示到 ...

  5. HTML超出文本显示省略号...[text-overflow]

    需要对div或者span同时应用Css: text-overflow:ellipsis; white-space:nowrap; overflow:hidden; 即可实现所想要得到的溢出文本显示省略 ...

  6. find中的 time 参数

    find手册中对time的解释:以 atime 为例: -atime n File was last accessed n*24 hours ago. When find figures out ho ...

  7. 如何导入hadoop源码到eclipse

    需要进一步学习hadoop.需要看看内部源码实现,因此需要将hadoop源码导入都eclipse中. 简单总结一下,具体步骤如下: 首先确保已经安装了git.maven3.protobuf2.5.如果 ...

  8. 你有没有试过“闭上眼”使用:京东、滴滴、QQ、支付宝?

    正在看这篇文章的同学,也许是幸运的. 互联网的发展,让我们的生活越来越便利,但这个“我们”,也许并不包括那些残障人士.正常人眼里来说再简单不过的页面操作,对于盲人来说都是不可攀越的高墙.换句话说,越行 ...

  9. Linux公社资料库地址

    免费下载地址在 http://linux.linuxidc.com/用户名与密码都是http://www.linuxidc.com

  10. BZOJ 1040: [ZJOI2008]骑士 基环加外向树

    1040: [ZJOI2008]骑士 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1190  Solved: 465[Submit][Status] ...