2011-04-22 231 views
3

在分布式缓存场景中,通常建议使用还是避免存储在缓存中的单片对象?最佳实践缓存:单片缓存数据与细粒度缓存数据

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

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

首先想到的是使用列表或字典来存储分布式缓存中的记录 - 获取整个集合,在本地内存中操作或搜索它,将整个集合放回到缓存中。后来的想法导致了用单独的记录填充缓存的想法,每个记录都以一种方式使它们从缓存中可单独检索/可更新。这导致想知道哪些方法在更新所有数据时会更高效。

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

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

是的,我们将测试和分析每种方法,但我想知道是否有任何超出当前思维范围的内容在此考虑。

+0

在最近的.Net Rocks播客中,有一些关于这个话题的讨论,其中客人是Udi Dahan。播客是关于CQRS的,他们讨论了模式的一个关键优势是如何实现更好的缓存。可能会给你一些想法... – 2011-04-22 00:29:17

回答

3

所以在我们的场景中,似乎单片缓存对象将成为首选。在数据中心使用大型管道时,几乎没有可察觉的时间让大约30 MB的序列化产品数据穿过导线。使用Dictionary<TKey, TValue>,我们能够快速找到收藏中的产品,以便返回或更新单个项目。

由于数以千计的单个实体,都远低于1 MB,在缓存中,批量操作只需要很长时间。网络操作中的延迟太多。

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