使用微软分布式缓存服务Velocity Part 3——博客园 Terrylee

本文介绍Velocity分布式缓存的悲观锁定、缓存项版本控制、日志记录、客户端缓存及路由表等功能。Velocity支持多种数据类型缓存,提供版本控制确保数据一致性,支持日志记录便于调试与维护。

概述

Velocity是微软推出的分布式缓存解决方案,为开发可扩展性,可用的,高性能的应用程提供支持,可以缓存各种类型的 数据,如CLR对象、XML、二进制数据等,并且支持集群模式的缓存服务器。Velocity也将集成在.NET Framework 4.0中,本文将介绍Velocity中的悲观锁定,缓存项版本、日志记录、客户端缓存以及路由表等知识。

悲观锁定

在Velocity提供了一套悲观锁定模型,即在某个缓存项数据处理过程中,数据将处于锁定状态,来自于其它客户端应用程序将无法对该缓存项进行处理。提供悲观锁定的方法主要三个,如下代码所示:

GetAndLock():获取缓存项并对数据加锁;

PutAndUnlock():更新加锁的数据并释放锁;

Unlock():释放锁定。

先来看GetAndLock()方法,在获取缓存项时并加锁,此时如果其它客户端试图获取该数据并加锁(即调用GetAndLock方法)将会失败,而不会阻塞;但客户端如果只想获取数据(即调用Get方法),则会返回相应数据,可以用图1形象的来表示:

Velocity_003

图 1

可以看到,ClientA获取数据成功并加锁;ClientB再次想获取数据并加锁时,将会失败;ClientC能够获取数据。

使用GetAndLock()方式可以指定锁过期时间,并且会有输出参数LockHandle,该参数将会在PutAndUnlock()方法或Unlock()中来释放锁,如下代码所示:

Cache cache = GetCurrentCache();
LockHandle handle = new LockHandle();
Customer item = (Customer)cache.GetAndLock("C20081117005",
new TimeSpan(0, 30, 0), out handle);

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

日志记录

Velocity中同样提供了日志记录的功能,我们可以在应用程序配置文件中进行设置,它支持基于控制台、基于文件以及Windows事件跟踪三种方式的记录,在配置文件中首先添加配置区:

<section name="fabric" type="System.Data.Fabric.Common.ConfigFile, FabricCommon"
allowLocation="true" allowDefinition="Everywhere"/>

然后可以进行配置,如设置日志记录级别等:

<fabric>
<
section name="logging" path="">
<
collection name="sinks" collectionType="list">
<
customType className="System.Data.Fabric.Common.EventLogger,FabricCommon"
sinkName="System.Data.Fabric.Common.ConsoleSink,FabricCommon"
sinkParam="" defaultLevel="-1"/>
<
customType className="System.Data.Fabric.Common.EventLogger,FabricCommon"
sinkName="System.Data.Fabric.Common.FileEventSink,FabricCommon"
sinkParam="CacheClientLog" defaultLevel="1"/>
<
customType className="System.Data.Fabric.Common.EventLogger,FabricCommon"
sinkName="System.Data.Caching.ETWSink, CacheBaseLibrary"
sinkParam="" defaultLevel="-1" />
</
collection>
</
section>
</
fabric>

同样也可以在代码中设置,调用CacheFactory的两个静态方法CreateLogSinks和DisableLogSinks,如下代码所示:

private Cache GetCurrentCache()
{
List<LogSink> sinklist = new List<LogSink>(2);
LogSink fileBasedSink = new LogSink(SinkType.FILE,
TraceLevel.Warning, "DCache/dd-hh-mm");
LogSink consoleBasedSink = new LogSink(SinkType.CONSOLE,
TraceLevel.Warning);
sinklist.Add(fileBasedSink);
sinklist.Add(consoleBasedSink);
// 启用
CacheFactory.CreateLogSinks(sinklist);

// 禁用
CacheFactory.DisableLogSinks();

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;
}

缓存项版本

在Velocity中提供了一种基于版本的更新功能,当使用GetCacheItem()方法时将返回一个缓存项,并携带有版本信息,当每次对缓存项做更新时,在内部都会对它的版本增加。如下面的示例,有两个客户应用程序,它们同时获取了同一个缓存项:

ClientA

CacheItem item = cache.GetCacheItem("Customers", "C2008");

ClientB

CacheItem item = cache.GetCacheItem("Customers", "C2008");

并且同时对缓存项做修改:

ClientA

((Customer)item.CacheObject).FirstName = "Huijun";

ClientB

((Customer)item.CacheObject).FirstName = "Terry";

如果ClientA首先提交更改,在提交更改时携带版本信息,由于版本信息与内部的版本一致,所以提交成功:

ClientA

cache.Put("Customers", "C2008", item.CacheObject, item.Version);

此时内部版本将会增加,现在ClientB如果再提交更改,将会失败,因为版本无法匹配,如图2表示:

Velocity_004

图 2

客户端缓存

在Velocity中还支持客户端缓存,如果启用了客户端缓存后,在从缓存集群中取回数据时,将会放在客户端缓存中,这样下次取数据时将会直接从客 户端缓存中取出,能够极大的提高效率,有点像是缓存的缓存。当集群中的数据发生变化时,Velocity将会使用事件通知机制通知客户端缓存刷新数据,如 图3所示:

Velocity_005

图 3

要启用客户端缓存,一是使用配置文件,设置IsEnabled属性为True,如下代码所示:

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

直接指定启用客户端缓存即可,另外也可以在创建CacheFactory时指定,如下代码所示:

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;

路由客户端

Velocity中在缓存客户端,提供了一种路由客户端Routing Client,它能够提供比简单客户端Simple Client更好的性能,在Routing Client中会有一个路由表Routing Table,它用来跟踪缓存对象,它是全局缓存中的分区映射的一个子集,同时分发缓存操作(Put、Get等)到确定的缓存宿主。路由客户端使用此路由表 来优化性能,因为该表可以跟踪缓存对象,所以当有请求到缓存宿主时,可以进行物理上的定位。如图4所示:

Velocity_007

图4

是否在应用程序中启用路由客户端,可以由开发者来确定,如在配置中启用路由客户端,这里可以通过指示deployment来设定是路由客户端(routing)还是简单客户端(simple):

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

另外还可以通过代码来设置,如下面的代码,在创建CacheFactory时指定构造函数参数:

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;

Velocity组成

最后我们再看一幅图,来了解一下Velocity的组成部分,可以看到它可以分为客户端缓存、服务端缓存以及管理工具三部分,如图5所示:

Velocity_006

图 5

总结

本文介绍了Velocity中的悲观锁定,缓存项版本、日志记录、客户端缓存以及路由表等知识,希望对大家有用。至此,关于微软的分布式缓存服务 Velocity就用短短的三篇文章介绍到这里,期待在.NET Framework 4.0中Velocity能够为我们带来更多的惊喜。


本文作者: TerryLee
本文出处: http://terrylee.cnblogs.com
源码链接: https://pan.quark.cn/s/a4b39357ea24 DMA(直接内存访问)是计算机系统中一种关键的数据传输机制,它使得特定的硬件子系统得以直接对系统内存进行读写操作,无需CPU的介入。这种机制对于提高I/O操作的效能具有极其重要的作用,特别是在网络设备、存储设备等驱动程序的编写过程中占据着核心地位。Cache缓存)则是一种用于暂存频繁访问的数据和指令的存储结构,其目的是减少处理器对主存储器的访问次数,进而增强系统的整体性能。然而,DMA和Cache之间存在着一致性的挑战,特别是在部分嵌入式系统中,DMA操作可能绕过Cache机制,从而引发数据不一致的情况,这就需要采取一系列策略来维护Cache的一致性。 在DMA的运作模式中,主要存在两种Cache一致性问题:流式DMA(streaming DMA)与一致性DMA(coherent DMA)。流式DMA通常应用于需要大量数据传输的场景,它不关注Cache的一致性,因此传输速度较快,但要求软件开发者自行管理数据的一致性。而一致性DMA则保证了在DMA传输期间,数据Cache与主内存之间保持同步,通常适用于对一致性要求较高的应用场景。 在Linux内核中,为了有效管理DMA操作,提供了一系列接口函数。其中,一致性DMA接口负责维护数据的一致性,而流式DMA接口则提供了更快的传输速度,但要求开发者自行解决数据一致性的问题。开发者在选用这些接口时,必须依据硬件平台的特点和性能需求,选择合适的DMA模式。 Cache一致性的解决方案通常取决于硬件平台的属性。在某些先进的处理器架构中,Cache对程序员而言是透明的,即处理器与Cache控制器之间的交互对程序员不可见,从而简化了编程的复...
内容概要:本文研究了基于CNN-LSTM混合神经网络模型的轴承故障诊断方法,利用PyTorch框架实现,并采用西储大学公开的轴承振动数据集进行实验验证。该方法深度融合卷积神经网络(CNN)强大的局部特征提取能力与长短期记忆网络(LSTM)对时序动态特征的建模优势,构建了一个端到端的智能故障分类模型,能够有效识别轴承在不同工况下的多种故障类型及其严重程度。文中系统阐述了数据预处理流程、模型架构设计、训练优化策略及性能评估方法,实验结果表明该模型在分类准确率、泛化能力与鲁棒性方面均表现出色,具备较高的工程应用价值与推广潜力。; 适合人群:具备一定Python编程基础和深度学习理论知识的研究生、科研人员及工业界工程技术开发者,尤其适用于从事机械系统状态监测、智能故障诊断、工业大数据分析等领域的专业人士。; 使用场景及目标:①应用于旋转机械装备的智能运维与故障预警系统,提升设备运行安全性与维护效率;②为基于深度学习的智能诊断算法研究提供可复现的完整技术方案与代码实例;③作为高校或科研机构在讲授深度学习模型融合、时间序列分类等课程中的高质量教学案例。; 阅读建议:建议读者结合所提供的Python代码进行动手实践,重点理解时域与频域特征的构造方法、CNN与LSTM的连接机制以及超参数调优策略,同时可尝试将该模型迁移至其他设备的振动数据集,以验证其跨场景适应能力与扩展性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值