缓存中的数据结构行为和使用
NCache 支持键值对结构,其中键是字符串类型,值可以是任何原始类型、自定义对象、 缓存项,或数据结构。 组别, 标签, 過期, 锁定, 依赖,并且可以为这些值分配更多。
备注
此功能仅在 NCache Enterprise.
然而,更新数据结构中的任何值,比如说一个列表,需要从缓存中获取它,更新它,然后将它添加回缓存中。 这导致了网络上的额外呼叫。 NCache 现在,通过直接在服务器上操作数据来提供对添加/更新数据结构的独家支持,消除了这一限制。 因此,提高整体性能。
NCache 为以下数据结构提供显式支持:
- 清单
- 队列
- 哈希集
- 字典
- Counter
除了原生数据结构接口提供的功能外, NCache 通过提供使用指定元数据的选项来扩展其功能 CacheItem
。 这意味着数据结构可以具有标签、过期和依赖关系,就像缓存的其他对象一样。
重要
整个数据结构将驻留在集群缓存的一个节点中。 例如,如果您创建一个包含 100 项的字典,则整个 100 项的字典将存在于一个节点中,而不会分布在其他节点中。
下图显示了针对驻留在 3 个节点的集群缓存中各自缓存键的各种数据结构:
特征明智的行为
存储
存储在数据结构中的任何项目都经过 JSON 序列化以支持服务器上的本机操作,例如
Contains
.数据结构有自己的大小以及影响缓存大小的元数据。
PrimaryField 注释
[主字段] 注解可以在用户模型类中用于数据结构(包括列表和队列)。 对数据结构的搜索操作,例如 Contains
,可用于序列化并仅发送该属性/属性,而不是序列化并将整个对象传输到服务器。 只有 PrimaryField
属性会发送到服务器并在服务器端进行比较,降低操作成本。
例如 Customer
类包含属性 CustomerId
,这是独一无二的。 这可以标记为 PrimaryField
,而不是比较完整的对象,让我们说 Contains
, 只比较 PrimaryField
可以完成操作。
class Customer
{
[PrimaryField]
public string CustomerId { get; set; }
public string Name { get; set; }
public string Address { get; set; }
}
缓存键
中的数据结构 NCache 被命名,即它们将像其他对象一样根据缓存键存储 NCache. 如果缓存键存在 CacheItem
,它不能用于数据结构。
可搜索的功能
可以在创建数据结构期间针对数据结构指定可搜索的属性,如组、标签和命名标签。 一种 CacheItem
并且一个数据结构可以属于同一个组/标签/命名标签。 有关详细信息,请参阅 配置可搜索属性.
数据失效功能
赶出
如果整个数据结构属于“待逐出”类别,则整个数据结构将从缓存中逐出。 不仅数据结构的创建会导致可能的驱逐,而且对数据结构的任何写操作也可能触发驱逐。 例如,将一个项目添加到列表中以满足驱逐标准。
過期
数据结构可以在指定的时间间隔后从缓存中失效,就像 CacheItem
。 数据结构支持两者, 绝对到期 和 滑动到期.
缓存依赖
数据结构支持所有缓存依赖性。 对于基于键的依赖关系,列表可以依赖于 CacheItem
反之亦然。 有关详细信息,请参阅 配置失效属性.
查询数据结构
可以在缓存中查询数据结构,如果它们有 可搜索属性 配置。 可搜索的属性包括:
- 组别
- 标签
- 命名标签
有关更多详细信息,请参阅 数据结构查询.
支持源提供者
通读
这仅在集合级别。 如果在缓存中找不到数据结构,则可以直接从数据源读取。 不会从数据源读取数据结构的各个项目。 因此,应从数据源获取整个项目列表。
直写
直写在两种情况下被触发:
- 在缓存内创建数据结构(集合级别)。
- 在将数据添加到已经存在的数据结构(项目级别)时。
缓存加载器和刷新器
您可以使用缓存启动加载器功能在缓存启动时自动将数据结构加载到缓存中。 这需要实现一个接口 ICacheLoader
用它的方法。 此外,如果数据有任何更改或更新, Cache Refresher
用于刷新数据。 有关详细信息,请参阅 缓存加载器和刷新器.
客户端缓存
数据结构不存储在客户端缓存中。 任何 积极 操作将从主缓存中获取它,但不会将其存储在客户端缓存中。 有关详细信息,请参阅 客户端缓存。 例如,当我们锁定字典时,整个字典都会被锁定,并且无法进行进一步的操作。
锁定
NCache 为由不同并行客户端更新的缓存存储内的数据同步和完整性提供有效的锁定机制。 NCache内部锁定保证了同一数据结构的每次更新在整个缓存集群中数据结构的一致性。 例如,整个 字典 当我们锁定字典时就被锁定了。
活动通知
缓存级事件和基于键的事件与数据结构级事件一起被支持,并且可以一起注册在数据结构上。 例如:
在缓存中创建一个列表。 这会触发
ItemAdded
缓存级别事件而不是数据结构事件。一个项目被添加到此列表中。 这会触发
ItemUpdated
缓存级别事件,因为列表已更新并且ItemAdded
数据结构事件作为新项目已添加到列表中。
限制
- 尚不支持嵌套数据结构。
-
CacheItem
不能存储在数据结构中。 例如,一个列表CacheItems
尚不支持。 - 尚不支持 HashSet 中的自定义对象。
- 字典键只能是字符串类型。
拓扑明智的行为
镜像拓扑
针对 镜像拓扑,在活动节点上执行操作。 然后将这些操作复制到被动节点。
复制拓扑
针对 复制拓扑,操作在客户端连接的节点上执行,然后将操作复制到所有节点。
分区拓扑
In 分区拓扑,整个数据结构存在于同一个节点上。 它是基于密钥分发的。 这意味着无论字典有多大,它都会存在于一个节点上; 字典本身不会跨节点分区。
分区副本拓扑
In 分区副本拓扑,操作的行为与分区拓扑中的操作相同。 数据结构基于缓存键分布,并且会驻留在同一个节点上。 它的副本将存在于另一个节点上。
参见
列出缓存中的行为和使用
缓存中的队列行为和使用
在缓存中设置行为和使用
缓存中的字典行为和使用
缓存中的计数器行为和使用