This is the multi-page printable view of this section. Click here to print.
使用后端状态存储
- 1: Azure Cosmos DB
- 2: Redis
- 3: SQL Server
1 - Azure Cosmos DB
Dapr 在保存和检索状态时不会转换状态值。Dapr 要求所有状态存储实现遵守特定的键格式方案(参见[状态管理规范](https://docs.dapr.io/zh-hans/reference/api/state_api/)。您可以直接与底层存储交互来操作状态数据,例如:
- 查询状态。
- 创建聚合视图。
- 制作备份。
注意
Azure Cosmos DB 是一个支持多种 API 的多模态数据库。默认的 Dapr Cosmos DB 状态存储实现使用 Azure Cosmos DB SQL API。连接到 Azure Cosmos DB
要连接到您的 Cosmos DB 实例,您可以:
- 使用 Azure 管理门户上的数据资源管理器。
- 使用各种 SDK 和工具。
注意
当您为 Dapr 配置 Azure Cosmos DB 时,请指定要使用的确切数据库和集合。以下 Cosmos DB SQL API 示例假设您已经连接到正确的数据库和一个名为 “states” 的集合。按 App ID 列出键
要获取与应用程序 “myapp” 关联的所有状态键,请使用以下查询:
SELECT * FROM states WHERE CONTAINS(states.id, 'myapp||')
上述查询返回 id 包含 “myapp-” 的所有文档,这是状态键的前缀。
获取特定状态数据
要获取应用程序 “myapp” 中键为 “balance” 的状态数据,请使用以下查询:
SELECT * FROM states WHERE states.id = 'myapp||balance'
读取返回文档中的 value 字段。要获取状态版本/ETag,请使用以下命令:
SELECT states._etag FROM states WHERE states.id = 'myapp||balance'
读取 Actor 状态
要获取应用程序 ID 为 “mypets” 中 Actor 类型为 “cat” 且实例 ID 为 “leroy” 的 Actor 关联的所有状态键,请使用以下命令:
SELECT * FROM states WHERE CONTAINS(states.id, 'mypets||cat||leroy||')
而要获取特定的 Actor 状态(如 “food”),请使用以下命令:
SELECT * FROM states WHERE states.id = 'mypets||cat||leroy||food'
警告
不应手动更新或删除存储中的状态。所有写入和删除操作应通过 Dapr 运行时完成。唯一的例外: 通常需要删除状态存储中的 Actor 记录,一旦您知道这些记录已不再使用,以防止未使用的 Actor 实例堆积而可能永远无法再次加载。2 - Redis
Dapr 在保存和检索状态时不会转换状态值。Dapr 要求所有状态存储实现都遵循一定的键格式方案(参见状态管理规范)。您可以直接与底层存储交互来操作状态数据,例如:
- 查询状态。
- 创建聚合视图。
- 进行备份。
Dapr 提供了一个 Redis state store component 作为可插拔组件。
注意
以下示例使用 Redis CLI 针对使用默认 Dapr 状态存储实现的 Redis 存储进行操作。连接到 Redis
您可以使用官方的 redis-cli 或任何其他兼容 Redis 的工具连接到 Redis 状态存储,直接查询 Dapr 状态。如果您是在容器中运行 Redis,使用 redis-cli 的最简单方法是通过容器:
docker run --rm -it --link <Redis 容器的名称> redis redis-cli -h <Redis 容器的名称>
按应用 ID 列出键
要获取与应用 “myapp” 关联的所有状态键,请使用命令:
KEYS myapp*
上述命令返回现有键的列表,例如:
1) "myapp||balance"
2) "myapp||amount"
获取特定状态数据
Dapr 将状态值保存为哈希值。每个哈希值包含一个 “data” 字段,其中包含:
- 状态数据。
- 一个 “version” 字段,其中包含一个持续递增的版本,用作 ETag。
例如,要获取应用 “myapp” 的键 “balance” 对应的状态数据,请使用命令:
HGET myapp||balance data
要获取状态版本/ETag,请使用命令:
HGET myapp||balance version
读取 Actor 状态
要获取与应用 ID “mypets” 中 actor 类型为 “cat” 且实例 ID 为 “leroy” 的 actor 关联的所有状态键,请使用命令:
KEYS mypets||cat||leroy*
要获取特定的 actor 状态(如 “food”),请使用命令:
HGET mypets||cat||leroy||food value
警告
您不应手动更新或删除存储中的状态。所有写入和删除操作都应通过 Dapr 运行时完成。**唯一例外:**通常需要删除状态存储中的 actor 记录,一旦您知道这些 actor 不再使用,以防止可能永远不会再加载的未使用 actor 实例积累。3 - SQL Server
Dapr 在保存和检索状态时不会转换状态值。Dapr 要求所有状态存储实现都遵守一定的键格式方案(请参阅状态管理规范)。你可以直接与底层存储交互来操作状态数据,例如:
- 查询状态。
- 创建聚合视图。
- 进行备份。
连接到 SQL Server
连接 SQL Server 实例最简单的方式是使用:
- Azure Data Studio(Windows、macOS、Linux)
- SQL Server Management Studio(Windows)
注意
为 Dapr 配置 Azure SQL 数据库时,需要指定要使用的确切表名。以下 Azure SQL 示例假设你已经连接到正确的数据库,且表中有一个名为 “states” 的表。按 App ID 列出键
要获取与应用程序 “myapp” 关联的所有状态键,请使用以下查询:
SELECT * FROM states WHERE [Key] LIKE 'myapp||%'
上述查询返回所有 ID 包含 “myapp||” 的行,这是状态键的前缀。
获取特定状态数据
要获取应用程序 “myapp” 中键为 “balance” 的状态数据,请使用以下查询:
SELECT * FROM states WHERE [Key] = 'myapp||balance'
读取返回行的 Data 字段。要获取状态版本/ETag,请使用以下命令:
SELECT [RowVersion] FROM states WHERE [Key] = 'myapp||balance'
获取过滤后的状态数据
要获取 JSON 数据中 “color” 值等于 “blue” 的所有状态数据,请使用以下查询:
SELECT * FROM states WHERE JSON_VALUE([Data], '$.color') = 'blue'
读取 Actor 状态
要获取属于应用程序 ID 为 “mypets”、Actor 类型为 “cat”、实例 ID 为 “leroy” 的所有 Actor 状态键,请使用以下命令:
SELECT * FROM states WHERE [Key] LIKE 'mypets||cat||leroy||%'
要获取特定的 Actor 状态(如 “food”),请使用以下命令:
SELECT * FROM states WHERE [Key] = 'mypets||cat||leroy||food'