NCache 是一个键值存储。 它通过键快速检索缓存的项目。 但它也可以通过其他属性搜索缓存的条目。 例如,我们可以不按关键字搜索缓存的产品,而是按类别、价格范围和重量搜索它们。 让我们学习如何索引缓存项以使其可搜索。
搜索
除了通过密钥查找项目外, NCache,我们可以使用类似 SQL 的语法查询缓存的条目。 我们可以编写 SELECT 和 DELETE 查询来查找和删除条目。 NCache 不支持 INSERT 或 UPDATE 查询。 与数据库 SELECT 查询一样,我们可以检索投影、整个缓存对象或仅检索键。 还, NCache 支持 基本查询和逻辑运算符以及聚合函数.
例如,如果我们要存储产品,我们可以编写类似 SELECT FROM Product WHERE UnitPrice <= 5.00` 的查询来查找价格小于 5 的所有缓存产品。有关如何搜索项目以及使用运算符和聚合函数的更多示例, 检查使用 使用分布式缓存的 SQL 查询.
索引
与关系数据库不同,通过其他属性查找项目, NCache 需要索引。 否则,它将不得不扫描整个缓存以查找项目及其相关属性。 它将使 NCache 慢的。 有了索引,我们的搜索操作就更快了。 要在类似 SQL 的搜索查询中使用对象的属性,我们需要先对其进行索引。 我们可以索引对象的所有公共、私有和受保护的原始字段和属性。 请注意,我们无法索引引用类型的字段或属性。 一次 NCache 将一个项目添加到索引中,如果它符合我们的搜索查询条件,它将作为查询结果返回。
有两种机制来定义索引 NCache: 静态和动态索引。
静态索引
要搜索自定义对象,我们需要先对它们进行索引。 我们可以通过配置更改或以编程方式定义索引。
通过配置创建索引
我们可以使用创建索引 NCache 管理器或 Powershell cmdlet。 首先,我们应该停止我们的缓存,创建我们的索引,然后重新启动它。 这 NCache 经理要求我们用我们的类上传程序集并选择要索引的属性和字段。 在那之后, NCache 自动索引新条目。 有关的更多详细信息 NCache 管理器和 Powershell Add-QueryIndex
cmdlet,检查 配置查询索引.
以编程方式创建索引
要以编程方式创建索引,我们需要注释对象的字段以对其进行索引。 NCache 有 QueryIndexed
索引字段和属性的属性。
例如,要索引一个产品名称和单价,我们需要注释它 Name
和 UnitPrice
特性。 像这样,
1 2 3 4 5 6 7 8 9 10 11 |
public class Product { public int ID { get; set } [QueryIndexed] public string Name { get; set } [QueryIndexed] public decimal UnitPrice { get; set } public decimal Weight { get; set } } |
默认情况下, NCache 在注释的属性之后命名索引。 但是我们可以指定一个不同的名字 QueryIndexed
属性。 当处理两个对我们要索引的属性使用不同名称的客户端应用程序时,此功能很有用。 例如,如果一个应用程序使用 UnitPrice
还有一个 pricePerUnit
; 我们可以用 price
作为两个应用程序中的索引名称,并使用编写类似 SQL 的搜索查询 price
代替。
除了注释单个属性之外,我们还可以使用以下注释来注释类 QueryIndexable
属性。 这边走, NCache 自动索引所有公共属性和字段。 但是我们需要用 QueryIndexed
. 如果我们不想索引某些属性,我们需要用 NonQueryIndexed
. 如果我们需要索引所有属性,我们只索引一个类。 但是,让我们采用仅索引搜索所需属性的方法,因为添加太多索引会增加内存和性能开销。
例如,索引产品的所有属性,不包括 Weight
,我们需要注释类和 Weight
财产。 像这样,
1 2 3 4 5 6 7 8 9 10 11 12 |
[QueryIndexable] public class Product { public int ID { get; set } public string Name { get; set } public decimal UnitPrice { get; set } [NonQueryIndexed] public decimal Weight { get; set } } |
有关索引注释的更多详细信息,请检查 以编程方式定义索引.
动态索引
我们在运行时使用 NCache 客户。 我们不能使用注释来索引这些属性。 对于运行时属性, NCache 使用动态索引。 动态索引分为三种类型:组索引、标签索引和命名标签索引。
集团指数
使用组,我们可以逻辑地划分我们的条目以提高效率。 组就像逻辑类别一样工作。 例如,我们可以为“最重要的客户”和“经常购买的产品”使用群组。 我们可以检索并删除属于同一组的所有条目。 此外,我们可以使用组编写类似 SQL 的 SELECT 查询。 NCache 自动索引组。 当我们向不存在的组添加条目时, NCache 为组创建索引,并将属于同一组的所有条目存储在同一索引中。 要了解有关群组的更多信息,请查看 组缓存数据:概述.
标签索引
标签是我们与条目关联的字符串标识符。 使用标签,我们可以更好地组织数据,因为我们可以根据标签检索和删除条目。 与组不同,我们可以将一个或多个标签关联到我们的缓存条目。 例如,我们可以使用“东海岸客户”和“西海岸客户”作为标签,根据他们的位置对客户进行分类。 NCache 支持使用标签名称或类似 SQL 的查询语法搜索和删除条目。 我们可以找到包含一个或多个标签的所有项目,例如:对于每个新标签, NCache 创建一个标签索引并使用该索引保存所有相关的缓存项。
命名标签索引
命名标签是增强的标签。 与仅支持字符串作为标识符的组和标签不同,使用命名标签,我们可以将原始数据类型、字符串和日期与我们的条目相关联。 命名标签是在运行时附加到我们的条目的键值对列表。
例如,我们可以使用命名标签来存储我们给常客的折扣。
要使用标签名称或类似 SQL 的语法搜索和删除条目, NCache 当我们添加带有不存在的命名标签的条目时,它会自动创建一个索引。 还, NCache 将所有相关的缓存项存储在该索引中。 由于命名标签索引不仅支持字符串,还支持所有原始类型,因此我们可以选择搜索具有更广泛数据类型的项目。
要了解标签和命名标签,请查看 标记缓存数据 和 带有缓存数据的命名标签 指南。
结论
多亏了索引和分布式查询, NCache 使用类似 SQL 的语法提供实时搜索功能。 没有索引, NCache 必须扫描整个缓存才能找到我们的条目。 这就是为什么 NCache 需要索引。 让我们记住,我们需要首先索引我们项目的所有可搜索属性。 我们可以通过配置、以编程方式或结合两种方法来定义我们的索引。 让我们只索引我们查询中需要的属性。 索引有内存和性能成本。
有关如何创建索引以及 SQL 查询如何工作的更多详细信息,请查看 索引指南 和 SQL 查询:行为和用法概述.