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

概述

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

配置模型

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

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

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

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

图中共有三个命名缓存,其中在缓存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 Part 2

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

使用标签

在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

Original: https://www.cnblogs.com/Terrylee/archive/2008/11/21/Microsoft-Distributed-Cache-Velocity-Part2.html
Author: TerryLee
Title: 使用微软分布式缓存服务Velocity Part 2

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/547479/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 当pytest遇上poium会擦出什么火花

    当pytest遇上poium会擦出什么火花 首先,创建一个 test_sample/test_demo.py 文件,写入下面三行代码。 def test_bing(page): p…

    技术杂谈 2023年5月31日
    081
  • RabbitMQGUI客户端工具(RabbitMQAssistant)

    RabbitMQ GUI客户端工具(RabbitMQ Assistant) 平时用控制台或者网页进行管理不免有点不方便,尤其在读取消息的时候不支持过滤和批量发送消息,在此推荐一个漂…

    技术杂谈 2023年7月24日
    073
  • 一个简陋的批量操作zabbix监控项页面

    个人博客地址 http://www.darkghost.life 继上篇zabbix-api,决定简单写一个页面来完成zabbix-api的批量操作 使用django完成 目录如下…

    技术杂谈 2023年7月25日
    0118
  • AOP

    AOP AOP的入门案例: AOP的工作流程 SpringAop的本质是:代理模式 AOP的切入点表达式 重用切入点表达式: ①声明 @Pointcut(“execut…

    技术杂谈 2023年7月24日
    075
  • 【MAT-MemoryAnalyzer】使用快速排查问题

    【MAT-MemoryAnalyzer】使用快速排查问题 引用地址:https://blog.csdn.net/lyd135364/article/details/12144996…

    技术杂谈 2023年5月30日
    088
  • python 类

    class person: name = ‘xxp’ age = 18 def intro(self): print(‘my name is ‘ + self.name) p = …

    技术杂谈 2023年7月25日
    060
  • [学习笔记]Java对象和类

    Java是一种面向对象语言(Object-oriented Programming,OOP); 面向对象编程 面向对象编程与面向过程编程不同,面向过程编程将模型分解为达到最终结果所…

    技术杂谈 2023年7月24日
    081
  • 小孩补脑

    橄榄油、动物的肉、鱼类、坚果:神经髓鞘发育很重要的物质基础。核桃中是含有很多Omega-6和Omega-3脂肪酸,并且DHA也是Omega-3的一种,但并不代表这种成分只有核桃中有…

    技术杂谈 2023年6月1日
    079
  • 设计模式概述(一)

    设计模式(Design Pattern)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是语法规定,而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的…

    技术杂谈 2023年7月11日
    061
  • 5.1SpringBoot整合Kafka(工具安装Kafka+Tools)

    1.工具安装Kafka 上一期我分享了安装zk,下一次我们把Kafka和可视化工具一起搞起来。 注意:这个时候ZK一定要启动成功。zk安装地址:https://www.cnblog…

    技术杂谈 2023年7月24日
    081
  • Mysql 事务(标贝科技)

    @ 事务 InnoDB对ACID的支持 隔离级别 + 不同隔离级别下读读取数据可能出现的情况 不可重复读和幻读区别 redo log (共享表空间) redo log block …

    技术杂谈 2023年7月25日
    097
  • SpringSecurity 自定义表单登录

    SpringSecurity 自定义表单登录 本篇主要讲解 在SpringSecurity中 如何 自定义表单登录 , SpringSecurity默认提供了一个表单登录,但是实际…

    技术杂谈 2023年7月11日
    072
  • Postman 正确使用姿势

    前言: 请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i 简介: Postman是一个接口测试工具,在做接口测试的时候,Postman相当于一个客户端,它可以模拟用户发起的…

    技术杂谈 2023年7月11日
    058
  • K8S-kubeadm安装

    K8S-kubeadmin快速安装K8S集群 1.IP规划 节点 IP 组件 MASTER01(4C/6G,cpu核心数大于2) 192.168.80.20 docker、kube…

    技术杂谈 2023年7月11日
    079
  • NOI2022 题解合集

    视 (n, q, C_l, C_m) 同级。 对于操作 1 和 2,直接用栈维护。 但对于操作 4,栈不支持快速合并,因此考虑双端队列启发式合并,则该部分总复杂度 (\mathca…

    技术杂谈 2023年6月21日
    0106
  • CR和LF

    声明 本文转自:CR和LF – 田野与天 – 博客园 (cnblogs.com) 以下为正文 现在的电脑操作系统主要有windows、unix/linux、…

    技术杂谈 2023年6月1日
    095
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球