使用 c# 的 AppFabric 缓存示例 [关闭]

Posted

技术标签:

【中文标题】使用 c# 的 AppFabric 缓存示例 [关闭]【英文标题】:AppFabric caching examples using c# [closed] 【发布时间】:2011-06-11 23:48:23 【问题描述】:

我目前正在研究将 AppFabirc 缓存集成到我的 .net c# 应用程序中,并寻找一些这样的代码示例。 AppFabric 缓存中是否有任何可用的开源或代码示例可供我查看?

【问题讨论】:

AppFabric 缓存的任何方面是否有您特别想查看的演示代码? 添加、删除、从缓存中获取等基本操作。使用它的一些示例以及 c# 代码中的一般 appfabric 设置也会有所帮助。 有一个 ZIP 下载,其中包含 Microsoft 提供的许多示例,只需 google 即可。 【参考方案1】:

缓存操作 处理 AppFabric 缓存时要创建的第一个对象是 DataCacheFactory。这可以使用硬编码的配置数据来创建,告诉工厂如何联系缓存服务器,或者没有配置,在这种情况下,它会从您的 web.config/app.config 文件中读取配置。我的建议是您将配置信息保存在 .config 文件中,否则当您想要更改缓存设置中的某些内容时,您需要重新编译和重新分发您的应用程序。关于 DataCacheFactory 要记住的重要一点是创建它昂贵 - 您绝对不想为每个缓存操作都创建一个。考虑使用单例模式 - 请参阅 this question 了解更多详细信息。

// Create a factory reading the config info from the .config file
DataCacheFactory factory = new DataCacheFactory();

缓存的主要接口是通过Cache 对象。从DataCacheFactory的GetCache方法中获取一个Cache,传入缓存的名字:

DataCache myCache = factory.GetCache("myCache");

向缓存中添加项目 缓存中的每个项目都有一个键,它是一个字符串。密钥对缓存必须是唯一的——如果你传入一个已经存在的密钥,你会得到一个异常。要缓存的项目必须是可序列化的,以便 AppFabric 可以在内部将其传递给缓存中的服务器。在最基本的层面上,使用Add 方法将项目添加到缓存中。

object myCachedItem = new Object();
string myCachedItemKey = "MyCacheKey";
myCache.Add(myCachedItemKey, myCachedItem);

从缓存中删除一个项目

myCache.Remove(myCachedItemKey);

简单。

从缓存中获取项目 从缓存中获取项目时,我们使用缓存侧模式。这意味着我们在缓存中查看所需的项目是否存在(使用密钥)。如果项目在缓存中,我们获取缓存的项目(可能将其转换为不同的类型);否则我们会采取措施从头开始获取项目,例如从数据库中读取,然后将其缓存起来,以便我们下次使用。

object cachedObject;
string myImportantDataKey = "MyImportantDataTable";
DataTable myImportantData;

// This is an object because everything is returned from the cache as an object
cachedObject = myCache.Get(myImportantDataKey);
// Check to see if we got something from the cache
if (cachedObject == null)

    // The requested item wasn't in the cache - a cache miss
    // Go get the data from the db
    myImportantData = getMyImportantDataFromMyDatabase();

    // Add the item to the cache so we've got it for next time
    myCache.Add(myImportantDataKey, myImportantData);

else

    // We have the cached object so cast it to a DataTable
    myImportantData = (DataTable)cachedObject;

更新缓存中的项目

// Put can be used to update an existing item in the cache
// If the item does not exist then it functions like Add
myCache.Put(myImportantDataKey, myUpdatedImportantData);

这是基本的 CRUD 操作,但处理并发还有很多其他内容!


Windows Server AppFabric 培训工具包可以在here 下载,它有一个关于 缓存。继续关注 appfabric 标签,因为我相信随着时间的推移会有更多的代码示例为人们解决问题。

【讨论】:

想知道该模式是否安全,例如一台服务器是否可以观察到密钥不存在,尝试添加条目然后失败,因为另一台服务器已经在构建条目以准备添加条目。 @locster 这是对这段代码的有效批评,尽管在我的(有限的)辩护中,它的目的是作为演示代码,而不是生产质量。当您开始查看并发机制时,它也很容易解决; AppFabric 的一大优点是您可以GetAndLock 缓存中当前不存在的项目。因此,服务器 1 看到该项目不存在,因此将其锁定以准备进行数据库调用。服务器 2 看到该项目不存在,尝试GetAndLock 它并失败,因为服务器 1 已经拥有锁。见tinyurl.com/c5t6w45【参考方案2】:

另外值得补充的是,如果您使用 Azure AppFabric 缓存服务,则单例模式非常重要,因为 DataCacheFactory 的每个实例都会创建与 Azure AppFabric 缓存服务的新连接。由于连接数受缓存大小的限制(128MB 缓存包括 5 个连接),如果您不重复使用同一个工厂,您将很快锁定所有连接!

【讨论】:

128MB 缓存现在包括 10 个连接

以上是关于使用 c# 的 AppFabric 缓存示例 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Windows Server AppFabric分布式缓存研究

用于从 Appfabric 缓存中删除项目的 Powershell 命令

设置可用于 AppFabric 缓存的内存量

AppFabric 缓存配置和主机

Windows Server AppFabric 缓存

缓存解决方案