最佳实践缓存:单片与细粒度缓存数据

时间:2011-04-22 00:26:09

标签: c# .net caching appfabric distributed-caching

在分布式缓存场景中,是否通常建议使用或避免存储在缓存中的单片对象?

我正在使用由EAV架构支持的服务,因此我们正在实施缓存,以最大限度地减少从数据库中检索所有主要记录和相应属性集合时EAV强加的感知性能缺陷。我们将在服务启动时填充缓存。

我们没有特别频繁地调用所有产品 - 客户端在首次使用对象映射填充本地缓存后会调用差异。为了执行该差异,分布式缓存将需要反映对数据库中各个记录的更改,这些记录是在任意基础上执行的,并且会在客户端调用差异时进行更改处理。

首先想到的是使用List或Dictionary将记录存储在分布式缓存中 - 获取整个集合,在本地内部操作或搜索它,将整个集合放回缓存中。然而,后来的思考导致了使用单个记录填充缓存的想法,每个记录的键入方式使它们可以从/可更新地单独检索到缓存。这导致想知道在更新所有数据时哪种方法更具性能。

我们正在使用Windows Server AppFabric,因此我们可以使用BulkGet操作。我不相信有任何批量更新的概念。

是否普遍存在分布式缓存对象大小的想法?如果我们对所有项目有更多请求,我会担心网络带宽,但至少现在,对所有项目的需求应该相当小。

是的,我们将测试和分析每种方法,但我想知道目前的思考范围之外是否还有什么需要考虑。

1 个答案:

答案 0 :(得分:3)

因此,在我们的场景中,似乎首选单片缓存对象。使用数据中心的大型管道,大约30 MB的序列化产品数据通过线路几乎没有可察觉的时间。使用Dictionary<TKey, TValue>,我们可以快速查找集合中的产品,以便返回或更新单个项目。

对于数千个单独的实体,所有这些实体都在1 MB以下,在缓存中,批量操作只需要太长时间。太多的开销,网络操作的延迟。

编辑:我们现在正在考虑维护实体和整体的实体集合,因为对于整体来说,检索单个实体似乎成为一个相当昂贵的生产数据集过程。