<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>状态管理 on Dapr 文档库</title><link>https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/state-management/</link><description>Recent content in 状态管理 on Dapr 文档库</description><generator>Hugo</generator><language>zh-hans</language><atom:link href="https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/state-management/index.xml" rel="self" type="application/rss+xml"/><item><title>状态管理概述</title><link>https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/state-management/state-management-overview/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/state-management/state-management-overview/</guid><description>&lt;p>您的应用程序可以利用Dapr的状态管理API在&lt;a href="https://v1-18.docs.dapr.io/zh-hans/reference/components-reference/supported-state-stores/">支持的状态存储&lt;/a>中保存、读取和查询键/值对。通过状态存储组件，您可以构建有状态且长时间运行的应用程序，例如购物车或游戏的会话状态。如下图所示：&lt;/p>
&lt;ul>
&lt;li>使用&lt;strong>HTTP POST&lt;/strong>来保存或查询键/值对。&lt;/li>
&lt;li>使用&lt;strong>HTTP GET&lt;/strong>来读取特定键并返回其值。&lt;/li>
&lt;/ul>
&lt;img src="https://v1-18.docs.dapr.io/images/state-management-overview.png" width=1000 style="padding-bottom:25px;">
&lt;p>&lt;a href="https://www.youtube.com/live/0y7ne6teHT4?si=2_xX6mkU3UCy2Plr&amp;amp;t=6607">以下视频和演示&lt;/a>概述了Dapr状态管理的工作原理。&lt;/p>
&lt;iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/0y7ne6teHT4?si=2_xX6mkU3UCy2Plr&amp;amp;start=6607" title="YouTube video player" style="padding-bottom:25px;" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen>&lt;/iframe>
&lt;h2 id="功能">功能&lt;/h2>
&lt;p>通过状态管理API模块，您的应用程序可以利用一些通常复杂且容易出错的功能，包括：&lt;/p>
&lt;ul>
&lt;li>设置并发控制和数据一致性的选项。&lt;/li>
&lt;li>执行批量更新操作&lt;a href="https://en.wikipedia.org/wiki/Create,_read,_update_and_delete">CRUD&lt;/a>，包括多个事务操作。&lt;/li>
&lt;li>查询和过滤键/值数据。&lt;/li>
&lt;/ul>
&lt;p>以下是状态管理API的一些功能：&lt;/p>
&lt;h3 id="可插拔的状态存储">可插拔的状态存储&lt;/h3>
&lt;p>Dapr的数据存储被设计为组件，可以在不更改服务代码的情况下进行替换。查看&lt;a href="https://v1-18.docs.dapr.io/zh-hans/reference/components-reference/supported-state-stores/">支持的状态存储&lt;/a>以获取更多信息。&lt;/p>
&lt;h3 id="可配置的状态存储行为">可配置的状态存储行为&lt;/h3>
&lt;p>使用Dapr，您可以在状态操作请求中附加元数据，描述您期望请求如何被处理。您可以附加：&lt;/p>
&lt;ul>
&lt;li>并发性要求&lt;/li>
&lt;li>一致性要求&lt;/li>
&lt;/ul>
&lt;p>默认情况下，您的应用程序应假设数据存储是&lt;strong>最终一致的&lt;/strong>，并使用&lt;strong>最后写入胜出并发模式&lt;/strong>。&lt;/p>
&lt;p>&lt;a href="https://v1-18.docs.dapr.io/zh-hans/reference/components-reference/supported-state-stores/">并非所有存储都是平等的&lt;/a>。为了确保您的应用程序的可移植性，您可以查询存储的元数据能力，并使您的代码适应不同的存储能力。&lt;/p>
&lt;h4 id="并发">并发&lt;/h4>
&lt;p>Dapr支持使用ETags的乐观并发控制（OCC）。当请求状态值时，Dapr总是将ETag属性附加到返回的状态中。当用户代码：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>更新状态&lt;/strong>时，期望通过请求体附加ETag。&lt;/li>
&lt;li>&lt;strong>删除状态&lt;/strong>时，期望通过&lt;code>If-Match&lt;/code>头附加ETag。&lt;/li>
&lt;/ul>
&lt;p>当提供的ETag与状态存储中的ETag匹配时，&lt;code>写入&lt;/code>操作成功。&lt;/p>
&lt;h5 id="为什么dapr选择乐观并发控制occ">为什么Dapr选择乐观并发控制（OCC）&lt;/h5>
&lt;p>在许多应用程序中，数据更新冲突很少见，因为客户端通常根据业务上下文分区以操作不同的数据。然而，如果您的应用程序选择使用ETags，不匹配的ETags可能导致请求被拒绝。建议您在代码中使用重试策略，以在使用ETags时补偿冲突。&lt;/p>
&lt;p>如果您的应用程序在写入请求中省略ETags，Dapr在处理请求时会跳过ETag检查。这使得&lt;strong>最后写入胜出&lt;/strong>模式成为可能，与使用ETags的&lt;strong>首次写入胜出&lt;/strong>模式相比。&lt;/p>


&lt;div class="alert alert-primary" role="alert">
&lt;h4 class="alert-heading">关于ETags的注意事项&lt;/h4>

 对于不原生支持ETags的存储，相应的Dapr状态存储实现应模拟ETags，并在处理状态时遵循Dapr状态管理API规范。由于Dapr状态存储实现技术上是底层数据存储的客户端，模拟应该是直接的，使用存储提供的并发控制机制。

&lt;/div>

&lt;p>阅读&lt;a href="https://v1-18.docs.dapr.io/zh-hans/reference/api/state_api/">API参考&lt;/a>以了解如何设置并发选项。&lt;/p>
&lt;h4 id="一致性">一致性&lt;/h4>
&lt;p>Dapr支持&lt;strong>强一致性&lt;/strong>和&lt;strong>最终一致性&lt;/strong>，最终一致性是默认行为。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>强一致性&lt;/strong>：Dapr在确认写入请求之前等待所有副本（或指定的法定人数）确认。&lt;/li>
&lt;li>&lt;strong>最终一致性&lt;/strong>：Dapr在底层数据存储接受写入请求后立即返回，即使这只是一个副本。&lt;/li>
&lt;/ul>
&lt;p>阅读&lt;a href="https://v1-18.docs.dapr.io/zh-hans/reference/api/state_api/">API参考&lt;/a>以了解如何设置一致性选项。&lt;/p>
&lt;h3 id="设置内容类型">设置内容类型&lt;/h3>
&lt;p>状态存储组件可能会根据内容类型不同地维护和操作数据。Dapr支持在&lt;a href="https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/state-management/state-management-overview/#state-management-api">状态管理API&lt;/a>中作为请求元数据的一部分传递内容类型。&lt;/p>
&lt;p>设置内容类型是_可选的_，组件决定是否使用它。Dapr仅提供将此信息传递给组件的手段。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>使用HTTP API&lt;/strong>：通过URL查询参数&lt;code>metadata.contentType&lt;/code>设置内容类型。例如，&lt;code>http://localhost:3500/v1.0/state/store?metadata.contentType=application/json&lt;/code>。&lt;/li>
&lt;li>&lt;strong>使用gRPC API&lt;/strong>：通过在请求元数据中添加键/值对&lt;code>&amp;quot;contentType&amp;quot; : &amp;lt;content type&amp;gt;&lt;/code>来设置内容类型。&lt;/li>
&lt;/ul>
&lt;h3 id="多重操作">多重操作&lt;/h3>
&lt;p>Dapr支持两种类型的多读或多写操作：&lt;strong>批量&lt;/strong>或&lt;strong>事务性&lt;/strong>。阅读&lt;a href="https://v1-18.docs.dapr.io/zh-hans/reference/api/state_api/">API参考&lt;/a>以了解如何使用批量和多选项。&lt;/p>
&lt;h4 id="批量读取操作">批量读取操作&lt;/h4>
&lt;p>您可以将多个读取请求分组为批量（或批次）操作。在批量操作中，Dapr将读取请求作为单独的请求提交到底层数据存储，并将它们作为单个结果返回。&lt;/p>
&lt;h4 id="事务性操作">事务性操作&lt;/h4>
&lt;p>您可以将写入、更新和删除操作分组为一个请求，然后作为一个原子事务处理。请求将作为一组事务性操作成功或失败。&lt;/p>
&lt;h3 id="actor状态">actor状态&lt;/h3>
&lt;p>事务性状态存储可用于存储actor状态。要指定用于actor的状态存储，请在状态存储组件的元数据部分中将属性&lt;code>actorStateStore&lt;/code>的值指定为&lt;code>true&lt;/code>。actor状态以特定方案存储在事务性状态存储中，允许进行一致的查询。所有actor只能使用一个状态存储组件作为状态存储。阅读&lt;a href="https://v1-18.docs.dapr.io/zh-hans/reference/api/state_api/">state API参考&lt;/a>和&lt;a href="https://v1-18.docs.dapr.io/zh-hans/reference/api/actors_api/">actors API参考&lt;/a>以了解有关actor状态存储的更多信息。&lt;/p>
&lt;h4 id="actor状态的生存时间ttl">actor状态的生存时间（TTL）&lt;/h4>
&lt;p>在保存actor状态时，您应始终设置TTL元数据字段（&lt;code>ttlInSeconds&lt;/code>）或在您选择的SDK中使用等效的API调用，以确保状态最终被移除。阅读&lt;a href="https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/actors/actors-overview/">actors概述&lt;/a>以获取更多信息。&lt;/p>
&lt;h3 id="状态加密">状态加密&lt;/h3>
&lt;p>Dapr支持应用程序状态的自动客户端加密，并支持密钥轮换。这在所有Dapr状态存储上都支持。有关更多信息，请阅读&lt;a href="https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/state-management/howto-encrypt-state/">如何：加密应用程序状态&lt;/a>主题。&lt;/p></description></item><item><title>操作指南：保存和获取状态</title><link>https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/state-management/howto-get-save-state/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/state-management/howto-get-save-state/</guid><description>&lt;p>状态管理是新应用程序、遗留应用程序、单体应用程序或微服务应用程序的常见需求之一。处理和测试不同的数据库库，以及处理重试和故障，可能既困难又耗时。&lt;/p>
&lt;p>在本指南中，您将学习如何使用键/值状态API来保存、获取和删除应用程序的状态。&lt;/p>
&lt;p>下面的代码示例描述了一个处理订单的应用程序，该应用程序使用Dapr sidecar。订单处理服务通过Dapr将状态存储在Redis状态存储中。&lt;/p>
&lt;img src="https://v1-18.docs.dapr.io/images/building-block-state-management-example.png" width=1000 alt="示例服务的状态管理图示">
&lt;h2 id="设置状态存储">设置状态存储&lt;/h2>
&lt;p>状态存储组件是Dapr用于与数据库通信的资源。&lt;/p>
&lt;p>在本指南中，我们将使用Redis状态存储，但您也可以选择&lt;a href="https://v1-18.docs.dapr.io/zh-hans/reference/components-reference/supported-state-stores/">支持列表&lt;/a>中的其他状态存储。&lt;/p>






&lt;ul class="nav nav-tabs" id="tabs-1" role="tablist">
 &lt;li class="nav-item">
 &lt;button class="nav-link active"
 id="tabs-01-00-tab" data-bs-toggle="tab" data-bs-target="#tabs-01-00" role="tab"
 data-td-tp-persist="self-hosted (cli)" aria-controls="tabs-01-00" aria-selected="true">
 Self-Hosted (CLI)
 &lt;/button>
 &lt;/li>&lt;li class="nav-item">
 &lt;button class="nav-link"
 id="tabs-01-01-tab" data-bs-toggle="tab" data-bs-target="#tabs-01-01" role="tab"
 data-td-tp-persist="kubernetes" aria-controls="tabs-01-01" aria-selected="false">
 Kubernetes
 &lt;/button>
 &lt;/li>
&lt;/ul>

&lt;div class="tab-content" id="tabs-1-content">
 &lt;div class="tab-body tab-pane fade show active"
 id="tabs-01-00" role="tabpanel" aria-labelled-by="tabs-01-00-tab" tabindex="1">
 &lt;p>当您在selfhost模式下运行&lt;code>dapr init&lt;/code>时，Dapr会在您的本地机器上创建一个默认的Redis &lt;code>statestore.yaml&lt;/code>并运行一个Redis状态存储，位置如下：&lt;/p>
&lt;ul>
&lt;li>在Windows上，位于&lt;code>%UserProfile%\.dapr\components\statestore.yaml&lt;/code>&lt;/li>
&lt;li>在Linux/MacOS上，位于&lt;code>~/.dapr/components/statestore.yaml&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>通过使用&lt;code>statestore.yaml&lt;/code>组件，您可以在不更改应用程序代码的情况下轻松更换底层组件。&lt;/p>

 &lt;/div>
 &lt;div class="tab-body tab-pane fade"
 id="tabs-01-01" role="tabpanel" aria-labelled-by="tabs-01-01-tab" tabindex="1">
 &lt;p>要将其部署到Kubernetes集群中，请在下面的YAML中填写您的&lt;a href="https://v1-18.docs.dapr.io/zh-hans/reference/components-reference/supported-state-stores/">状态存储组件&lt;/a>的&lt;code>metadata&lt;/code>连接详细信息，保存为&lt;code>statestore.yaml&lt;/code>，然后运行&lt;code>kubectl apply -f statestore.yaml&lt;/code>。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">apiVersion&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">dapr.io/v1alpha1&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">kind&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">Component&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">metadata&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">name&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">statestore&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">spec&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">type&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">state.redis&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">version&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">v1&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">metadata&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>- &lt;span style="color:#204a87;font-weight:bold">name&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">redisHost&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">value&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">localhost:6379&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>- &lt;span style="color:#204a87;font-weight:bold">name&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">redisPassword&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">value&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&amp;#34;&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>请参阅&lt;a href="https://v1-18.docs.dapr.io/zh-hans/operations/components/setup-state-store/">如何在Kubernetes上设置不同的状态存储&lt;/a>以获取更多信息。&lt;/p></description></item><item><title>操作指南：查询状态</title><link>https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/state-management/howto-state-query-api/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/state-management/howto-state-query-api/</guid><description>&lt;div class="alert alert-warning" role="alert">
&lt;h4 class="alert-heading">alpha&lt;/h4>

 状态查询API目前处于&lt;strong>alpha&lt;/strong>阶段。

&lt;/div>

&lt;p>通过状态查询API，您可以从状态存储组件中检索、过滤和排序键/值数据。查询API并不是完整查询语言的替代品。&lt;/p>
&lt;p>尽管状态存储是键/值存储，&lt;code>value&lt;/code>可能是一个包含自身层次结构、键和值的JSON文档。查询API允许您使用这些键/值来检索相应的文档。&lt;/p>
&lt;h2 id="查询状态">查询状态&lt;/h2>
&lt;p>您可以通过HTTP POST/PUT或gRPC提交查询请求。请求的主体是一个包含以下三个部分的JSON对象：&lt;/p>
&lt;ul>
&lt;li>&lt;code>filter&lt;/code>&lt;/li>
&lt;li>&lt;code>sort&lt;/code>&lt;/li>
&lt;li>&lt;code>page&lt;/code>&lt;/li>
&lt;/ul>
&lt;h3 id="filter">&lt;code>filter&lt;/code>&lt;/h3>
&lt;p>&lt;code>filter&lt;/code>用于指定查询条件，结构类似于树形，每个节点表示一个操作，可能是单一或多个操作数。&lt;/p>
&lt;p>支持以下操作：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>操作符&lt;/th>
 &lt;th>操作数&lt;/th>
 &lt;th>描述&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>EQ&lt;/code>&lt;/td>
 &lt;td>key:value&lt;/td>
 &lt;td>key 等于 value&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>NEQ&lt;/code>&lt;/td>
 &lt;td>key:value&lt;/td>
 &lt;td>key 不等于 value&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>GT&lt;/code>&lt;/td>
 &lt;td>key:value&lt;/td>
 &lt;td>key 大于 value&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>GTE&lt;/code>&lt;/td>
 &lt;td>key:value&lt;/td>
 &lt;td>key 大于等于 value&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>LT&lt;/code>&lt;/td>
 &lt;td>key:value&lt;/td>
 &lt;td>key 小于 value&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>LTE&lt;/code>&lt;/td>
 &lt;td>key:value&lt;/td>
 &lt;td>key 小于等于 value&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>IN&lt;/code>&lt;/td>
 &lt;td>key:[]value&lt;/td>
 &lt;td>key 等于 value[0] 或 value[1] 或 &amp;hellip; 或 value[n]&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>AND&lt;/code>&lt;/td>
 &lt;td>[]operation&lt;/td>
 &lt;td>operation[0] 且 operation[1] 且 &amp;hellip; 且 operation[n]&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>OR&lt;/code>&lt;/td>
 &lt;td>[]operation&lt;/td>
 &lt;td>operation[0] 或 operation[1] 或 &amp;hellip; 或 operation[n]&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>操作数中的&lt;code>key&lt;/code>类似于JSONPath表示法。键中的每个点表示嵌套的JSON结构。例如，考虑以下结构：&lt;/p></description></item><item><title>操作指南：构建有状态服务</title><link>https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/state-management/howto-stateful-service/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/state-management/howto-stateful-service/</guid><description>&lt;p>在本文中，您将学习如何创建一个可以水平扩展的有状态服务，选择性使用并发和一致性模型。状态管理API可以帮助开发者简化状态协调、冲突解决和故障处理的复杂性。&lt;/p>
&lt;h2 id="设置状态存储">设置状态存储&lt;/h2>
&lt;p>状态存储组件是Dapr用来与数据库通信的资源。在本指南中，我们将使用默认的Redis状态存储。&lt;/p>
&lt;h3 id="使用dapr-cli">使用Dapr CLI&lt;/h3>
&lt;p>当您在本地模式下运行&lt;code>dapr init&lt;/code>时，Dapr会创建一个默认的Redis &lt;code>statestore.yaml&lt;/code>并在您的本地机器上运行一个Redis状态存储，位置如下：&lt;/p>
&lt;ul>
&lt;li>在Windows上，位于&lt;code>%UserProfile%\.dapr\components\statestore.yaml&lt;/code>&lt;/li>
&lt;li>在Linux/MacOS上，位于&lt;code>~/.dapr/components/statestore.yaml&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>通过&lt;code>statestore.yaml&lt;/code>组件，您可以轻松替换底层组件而无需更改应用程序代码。&lt;/p>
&lt;p>查看&lt;a href="https://v1-18.docs.dapr.io/zh-hans/reference/components-reference/supported-state-stores/">支持的状态存储列表&lt;/a>。&lt;/p>
&lt;h3 id="kubernetes">Kubernetes&lt;/h3>
&lt;p>查看&lt;a href="https://v1-18.docs.dapr.io/zh-hans/operations/components/setup-state-store/">如何在Kubernetes上设置不同的状态存储&lt;/a>。&lt;/p>
&lt;h2 id="强一致性和最终一致性">强一致性和最终一致性&lt;/h2>
&lt;p>在强一致性模式下，Dapr确保底层状态存储：&lt;/p>
&lt;ul>
&lt;li>在数据写入所有副本后才返回响应。&lt;/li>
&lt;li>在写入或删除状态之前从法定人数接收确认。&lt;/li>
&lt;/ul>
&lt;p>对于读取请求，Dapr确保在副本之间一致地返回最新的数据。默认情况下是最终一致性，除非在请求状态API时另有指定。&lt;/p>
&lt;p>以下示例展示了如何使用强一致性保存、获取和删除状态。示例用Python编写，但适用于任何编程语言。&lt;/p>
&lt;h3 id="保存状态">保存状态&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">import&lt;/span> &lt;span style="color:#000">requests&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">import&lt;/span> &lt;span style="color:#000">json&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">store_name&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;redis-store&amp;#34;&lt;/span> &lt;span style="color:#8f5902;font-style:italic"># 在状态存储组件yaml文件中指定的状态存储名称&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">dapr_state_url&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;http://localhost:3500/v1.0/state/&lt;/span>&lt;span style="color:#4e9a06">{}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">.&lt;/span>&lt;span style="color:#000">format&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">store_name&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">stateReq&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#4e9a06">&amp;#39;[{ &amp;#34;key&amp;#34;: &amp;#34;k1&amp;#34;, &amp;#34;value&amp;#34;: &amp;#34;Some Data&amp;#34;, &amp;#34;options&amp;#34;: { &amp;#34;consistency&amp;#34;: &amp;#34;strong&amp;#34; }}]&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">response&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#000">requests&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">.&lt;/span>&lt;span style="color:#000">post&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">dapr_state_url&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">json&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#000">stateReq&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="获取状态">获取状态&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">import&lt;/span> &lt;span style="color:#000">requests&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">import&lt;/span> &lt;span style="color:#000">json&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">store_name&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;redis-store&amp;#34;&lt;/span> &lt;span style="color:#8f5902;font-style:italic"># 在状态存储组件yaml文件中指定的状态存储名称&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">dapr_state_url&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;http://localhost:3500/v1.0/state/&lt;/span>&lt;span style="color:#4e9a06">{}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">.&lt;/span>&lt;span style="color:#000">format&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">store_name&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">response&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#000">requests&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">.&lt;/span>&lt;span style="color:#000">get&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">dapr_state_url&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">+&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;/key1&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">headers&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#000;font-weight:bold">{&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;consistency&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;strong&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">})&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87">print&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">response&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">.&lt;/span>&lt;span style="color:#000">headers&lt;/span>&lt;span style="color:#000;font-weight:bold">[&lt;/span>&lt;span style="color:#4e9a06">&amp;#39;ETag&amp;#39;&lt;/span>&lt;span style="color:#000;font-weight:bold">])&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="删除状态">删除状态&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">import&lt;/span> &lt;span style="color:#000">requests&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">import&lt;/span> &lt;span style="color:#000">json&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">store_name&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;redis-store&amp;#34;&lt;/span> &lt;span style="color:#8f5902;font-style:italic"># 在状态存储组件yaml文件中指定的状态存储名称&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">dapr_state_url&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;http://localhost:3500/v1.0/state/&lt;/span>&lt;span style="color:#4e9a06">{}&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">.&lt;/span>&lt;span style="color:#000">format&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">store_name&lt;/span>&lt;span style="color:#000;font-weight:bold">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">response&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#000">requests&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">.&lt;/span>&lt;span style="color:#000">delete&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">dapr_state_url&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">+&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;/key1&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#000">headers&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#000;font-weight:bold">{&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;consistency&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#4e9a06">&amp;#34;strong&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">})&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果没有指定&lt;code>concurrency&lt;/code>选项，默认是后写胜出并发模式。&lt;/p>
&lt;h2 id="先写胜出和后写胜出">先写胜出和后写胜出&lt;/h2>
&lt;p>Dapr允许开发者在使用数据存储时选择两种常见的并发模式：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>先写胜出&lt;/strong>：在应用程序的多个实例同时写入同一个键的情况下很有用。&lt;/li>
&lt;li>&lt;strong>后写胜出&lt;/strong>：Dapr的默认模式。&lt;/li>
&lt;/ul>
&lt;p>Dapr使用版本号来确定特定键是否已更新。您可以：&lt;/p>
&lt;ol>
&lt;li>在读取键的数据时保留版本号。&lt;/li>
&lt;li>在更新（如写入和删除）时使用版本号。&lt;/li>
&lt;/ol>
&lt;p>如果自从检索版本号以来版本信息已更改，将抛出错误，要求您执行另一次读取以获取最新的版本信息和状态。&lt;/p>
&lt;p>Dapr利用ETags来确定状态的版本号。ETags从状态请求中以&lt;code>ETag&lt;/code>头返回。使用ETags，您的应用程序知道自上次检查以来资源已更新，因为在ETag不匹配时会出错。&lt;/p>
&lt;p>以下示例展示了如何：&lt;/p>
&lt;ul>
&lt;li>获取ETag。&lt;/li>
&lt;li>使用ETag保存状态。&lt;/li>
&lt;li>删除状态。&lt;/li>
&lt;/ul>
&lt;p>以下示例用Python编写，但适用于任何编程语言。&lt;/p></description></item><item><title>操作指南：启用事务性 Outbox 模式</title><link>https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/state-management/howto-outbox/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/state-management/howto-outbox/</guid><description>&lt;p>事务性 Outbox 模式是一种广为人知的设计模式，用于发送应用程序状态变化的通知。它通过一个跨越数据库和消息代理的单一事务来传递通知。&lt;/p>
&lt;p>开发人员在尝试自行实现此模式时会遇到许多技术难题，通常需要编写复杂且容易出错的中央协调管理器，这些管理器最多支持一种或两种数据库和消息代理的组合。&lt;/p>
&lt;p>例如，您可以使用 Outbox 模式来：&lt;/p>
&lt;ol>
&lt;li>向账户数据库写入新的用户记录。&lt;/li>
&lt;li>发送账户成功创建的通知消息。&lt;/li>
&lt;/ol>
&lt;p>通过 Dapr 的 Outbox 支持，您可以在调用 Dapr 的&lt;a href="https://v1-18.docs.dapr.io/zh-hans/reference/api/state_api/#state-transactions">事务 API&lt;/a>时通知订阅者应用程序的状态何时被创建或更新。&lt;/p>
&lt;p>下图概述了 Outbox 功能的工作原理：&lt;/p>
&lt;ol>
&lt;li>服务 A 使用事务将状态保存/更新到状态存储。&lt;/li>
&lt;li>在同一事务下将消息写入消息代理。当消息成功传递到消息代理时，事务完成，确保状态和消息一起被事务化。&lt;/li>
&lt;li>消息代理将消息主题传递给任何订阅者 - 在此情况下为服务 B。&lt;/li>
&lt;/ol>
&lt;img src="https://v1-18.docs.dapr.io/images/state-management-outbox.png" width=800 alt="显示 Outbox 模式步骤的图示">
&lt;h2 id="要求">要求&lt;/h2>
&lt;p>Outbox 功能可以与 Dapr 支持的任何&lt;a href="https://v1-18.docs.dapr.io/zh-hans/reference/components-reference/supported-state-stores/">事务性状态存储&lt;/a>一起使用。所有&lt;a href="https://v1-18.docs.dapr.io/zh-hans/reference/components-reference/supported-pubsub/">发布/订阅代理&lt;/a>都支持 Outbox 功能。&lt;/p>
&lt;p>&lt;a href="https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/state-management/howto-get-save-state/#perform-state-transactions">了解更多关于您可以使用的事务方法。&lt;/a>&lt;/p>


&lt;div class="alert alert-primary" role="alert">
&lt;h4 class="alert-heading">注意&lt;/h4>

 建议与竞争消费者模式（例如，&lt;a href="https://v1-18.docs.dapr.io/zh-hans/reference/components-reference/supported-pubsub/setup-apache-kafka/">Apache Kafka&lt;/a>）一起使用的消息代理减少重复事件的可能性。

&lt;/div>

&lt;h2 id="启用-outbox-模式">启用 Outbox 模式&lt;/h2>
&lt;p>要启用 Outbox 功能，请在状态存储组件上添加以下必需和可选字段：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">apiVersion&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">dapr.io/v1alpha1&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">kind&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">Component&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">metadata&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">name&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">mysql-outbox&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">spec&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">type&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">state.mysql&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">version&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">v1&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">metadata&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>- &lt;span style="color:#204a87;font-weight:bold">name&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">connectionString&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">value&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&amp;lt;CONNECTION STRING&amp;gt;&amp;#34;&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>- &lt;span style="color:#204a87;font-weight:bold">name&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">outboxPublishPubsub&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#8f5902;font-style:italic"># 必需&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">value&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#4e9a06">&amp;#34;mypubsub&amp;#34;&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>- &lt;span style="color:#204a87;font-weight:bold">name&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">outboxPublishTopic&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#8f5902;font-style:italic"># 必需&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">value&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#4e9a06">&amp;#34;newOrder&amp;#34;&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>- &lt;span style="color:#204a87;font-weight:bold">name&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">outboxPubsub&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#8f5902;font-style:italic"># 可选&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">value&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#4e9a06">&amp;#34;myOutboxPubsub&amp;#34;&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>- &lt;span style="color:#204a87;font-weight:bold">name&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">outboxDiscardWhenMissingState&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#8f5902;font-style:italic"># 可选，默认为 false&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">value&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">false&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="元数据字段">元数据字段&lt;/h3>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>名称&lt;/th>
 &lt;th>必需&lt;/th>
 &lt;th>默认值&lt;/th>
 &lt;th>描述&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>outboxPublishPubsub&lt;/td>
 &lt;td>是&lt;/td>
 &lt;td>N/A&lt;/td>
 &lt;td>设置发布状态更改时传递通知的发布/订阅组件的名称&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>outboxPublishTopic&lt;/td>
 &lt;td>是&lt;/td>
 &lt;td>N/A&lt;/td>
 &lt;td>设置接收在配置了 &lt;code>outboxPublishPubsub&lt;/code> 的发布/订阅上的状态更改的主题。消息体将是 &lt;code>insert&lt;/code> 或 &lt;code>update&lt;/code> 操作的状态事务项&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>outboxPubsub&lt;/td>
 &lt;td>否&lt;/td>
 &lt;td>&lt;code>outboxPublishPubsub&lt;/code>&lt;/td>
 &lt;td>设置 Dapr 用于协调状态和发布/订阅事务的发布/订阅组件。如果未设置，则使用配置了 &lt;code>outboxPublishPubsub&lt;/code> 的发布/订阅组件。如果您希望将用于发送通知状态更改的发布/订阅组件与用于协调事务的组件分开，这将很有用&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>outboxDiscardWhenMissingState&lt;/td>
 &lt;td>否&lt;/td>
 &lt;td>&lt;code>false&lt;/code>&lt;/td>
 &lt;td>通过将 &lt;code>outboxDiscardWhenMissingState&lt;/code> 设置为 &lt;code>true&lt;/code>，如果 Dapr 无法在数据库中找到状态且不重试，则 Dapr 将丢弃事务。如果在 Dapr 能够传递消息之前，状态存储数据因任何原因被删除，并且您希望 Dapr 从发布/订阅中删除项目并停止重试获取状态，此设置可能会很有用&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="其他配置">其他配置&lt;/h2>
&lt;h3 id="在同一状态存储上组合-outbox-和非-outbox-消息">在同一状态存储上组合 Outbox 和非 Outbox 消息&lt;/h3>
&lt;p>如果您希望使用相同的状态存储来发送 Outbox 和非 Outbox 消息，只需定义两个连接到相同状态存储的状态存储组件，其中一个具有 Outbox 功能，另一个没有。&lt;/p></description></item><item><title>操作指南：在应用程序之间共享状态</title><link>https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/state-management/howto-share-state/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/state-management/howto-share-state/</guid><description>&lt;p>Dapr 提供了多种在应用程序之间共享状态的方法。&lt;/p>
&lt;p>不同的架构在共享状态时可能有不同的需求。在某些情况下，您可能会希望：&lt;/p>
&lt;ul>
&lt;li>在特定应用程序中封装所有状态&lt;/li>
&lt;li>让 Dapr 为您管理状态访问&lt;/li>
&lt;/ul>
&lt;p>在其他情况下，您可能需要两个应用程序在同一状态上进行操作，以便获取和保存相同的键。&lt;/p>
&lt;p>为了实现状态共享，Dapr 支持以下键前缀策略：&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>键前缀&lt;/th>
 &lt;th>描述&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>appid&lt;/code>&lt;/td>
 &lt;td>默认策略，允许您仅通过指定 &lt;code>appid&lt;/code> 的应用程序管理状态。所有状态键将以 &lt;code>appid&lt;/code> 为前缀，并限定于该应用程序。&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>name&lt;/code>&lt;/td>
 &lt;td>使用状态存储组件的名称作为前缀。多个应用程序可以共享同一状态存储中的相同状态。&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>namespace&lt;/code>&lt;/td>
 &lt;td>如果设置了命名空间，此策略会将 &lt;code>appid&lt;/code> 键前缀替换为配置的命名空间，生成一个限定于该命名空间的键。这允许在不同命名空间中具有相同 &lt;code>appid&lt;/code> 的应用程序重用相同的状态存储。如果未配置命名空间，则会回退到 &lt;code>appid&lt;/code> 策略。有关 Dapr 中命名空间的更多信息，请参见 &lt;a href="https://v1-18.docs.dapr.io/zh-hans/operations/components/component-scopes/">操作指南：将组件限定到一个或多个应用程序&lt;/a>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>none&lt;/code>&lt;/td>
 &lt;td>不使用任何前缀。多个应用程序可以在不同的状态存储中共享状态，而不受特定前缀的限制。&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="指定状态前缀策略">指定状态前缀策略&lt;/h2>
&lt;p>要指定前缀策略，请在状态组件上添加名为 &lt;code>keyPrefix&lt;/code> 的元数据键：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">apiVersion&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">dapr.io/v1alpha1&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">kind&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">Component&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">metadata&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">name&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">statestore&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">namespace&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">production&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">spec&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">type&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">state.redis&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">version&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">v1&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">metadata&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>- &lt;span style="color:#204a87;font-weight:bold">name&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">keyPrefix&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">value&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">&amp;lt;key-prefix-strategy&amp;gt;&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="示例">示例&lt;/h2>
&lt;p>以下示例演示了使用每种支持的前缀策略进行状态检索的情况。&lt;/p>
&lt;h3 id="appid默认">&lt;code>appid&lt;/code>（默认）&lt;/h3>
&lt;p>在下面的示例中，具有应用程序 ID &lt;code>myApp&lt;/code> 的 Dapr 应用程序正在将状态保存到名为 &lt;code>redis&lt;/code> 的状态存储中：&lt;/p></description></item><item><title>操作指南：加密应用程序状态</title><link>https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/state-management/howto-encrypt-state/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/state-management/howto-encrypt-state/</guid><description>&lt;p>对静态应用程序状态进行加密，以在企业工作负载或受监管环境中提供更强的安全性。Dapr 提供基于 &lt;a href="https://en.wikipedia.org/wiki/Advanced_Encryption_Standard">AES&lt;/a> 的自动客户端加密，采用 &lt;a href="https://en.wikipedia.org/wiki/Galois/Counter_Mode">Galois/Counter Mode (GCM)&lt;/a>，支持 128、192 和 256 位的密钥。&lt;/p>
&lt;p>除了自动加密，Dapr 还支持主加密密钥和次加密密钥，使开发人员和运维团队更容易启用密钥轮换策略。此功能由所有 Dapr 状态存储支持。&lt;/p>
&lt;p>加密密钥始终从 secret 中获取，不能在 &lt;code>metadata&lt;/code> 部分中以明文形式提供。&lt;/p>
&lt;h2 id="启用自动加密">启用自动加密&lt;/h2>
&lt;p>将以下 &lt;code>metadata&lt;/code> 部分添加到任何 Dapr 支持的状态存储中：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">metadata&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>- &lt;span style="color:#204a87;font-weight:bold">name&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">primaryEncryptionKey&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">secretKeyRef&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">name&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">mysecret&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">key&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">mykey&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#8f5902;font-style:italic"># key 是可选的。&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如，这是一个 Redis 加密状态存储的完整 YAML：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">apiVersion&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">dapr.io/v1alpha1&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">kind&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">Component&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">metadata&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">name&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">statestore&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline">&lt;/span>&lt;span style="color:#204a87;font-weight:bold">spec&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">type&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">state.redis&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">version&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">v1&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">metadata&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>- &lt;span style="color:#204a87;font-weight:bold">name&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">redisHost&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">value&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">localhost:6379&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>- &lt;span style="color:#204a87;font-weight:bold">name&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">redisPassword&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">value&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#4e9a06">&amp;#34;&amp;#34;&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>- &lt;span style="color:#204a87;font-weight:bold">name&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">primaryEncryptionKey&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">secretKeyRef&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">name&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">mysecret&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#204a87;font-weight:bold">key&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline"> &lt;/span>&lt;span style="color:#000">mykey&lt;/span>&lt;span style="color:#f8f8f8;text-decoration:underline">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>现在，您已配置了一个 Dapr 状态存储，以从名为 &lt;code>mysecret&lt;/code> 的 secret 中获取加密密钥，其中包含名为 &lt;code>mykey&lt;/code> 的实际加密密钥。&lt;/p></description></item><item><title>状态生存时间 (TTL)</title><link>https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/state-management/state-store-ttl/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://v1-18.docs.dapr.io/zh-hans/developing-applications/building-blocks/state-management/state-store-ttl/</guid><description>&lt;p>Dapr 允许为每个状态设置生存时间 (TTL)。这意味着应用程序可以为存储的每个状态指定一个生存时间，过期后将无法检索这些状态。&lt;/p>
&lt;p>对于&lt;a href="https://v1-18.docs.dapr.io/zh-hans/reference/components-reference/supported-state-stores/">支持的状态存储&lt;/a>，只需在发布消息时设置 &lt;code>ttlInSeconds&lt;/code> 元数据。其他状态存储将忽略此值。对于某些状态存储，您可以为每个表或容器指定默认的过期时间。&lt;/p>
&lt;h2 id="原生状态-ttl-支持">原生状态 TTL 支持&lt;/h2>
&lt;p>当状态存储组件原生支持状态 TTL 时，Dapr 会直接传递 TTL 配置，而不添加额外的逻辑，从而保持行为的一致性。这在组件以不同方式处理过期状态时尤为有用。&lt;/p>
&lt;p>如果未指定 TTL，将保留状态存储的默认行为。&lt;/p>
&lt;h2 id="显式持久化绕过全局定义的-ttl">显式持久化绕过全局定义的 TTL&lt;/h2>
&lt;p>对于允许为所有数据指定默认 TTL 的状态存储，持久化状态的方式包括：&lt;/p>
&lt;ul>
&lt;li>通过 Dapr 组件设置全局 TTL 值，或&lt;/li>
&lt;li>在 Dapr 之外创建状态存储并设置全局 TTL 值。&lt;/li>
&lt;/ul>
&lt;p>如果未指定特定的 TTL，数据将在全局 TTL 时间段后过期，这不是由 Dapr 直接控制的。&lt;/p>
&lt;p>此外，所有状态存储还支持显式持久化数据的选项。这意味着您可以忽略默认的数据库策略（可能是在 Dapr 之外或通过 Dapr 组件设置的），以无限期保留特定的数据库记录。您可以通过将 &lt;code>ttlInSeconds&lt;/code> 设置为 &lt;code>-1&lt;/code> 来实现，这表示忽略任何设置的 TTL 值。&lt;/p>
&lt;h2 id="支持的组件">支持的组件&lt;/h2>
&lt;p>请参阅&lt;a href="https://v1-18.docs.dapr.io/zh-hans/reference/components-reference/supported-state-stores/">状态存储组件指南&lt;/a>中的 TTL 列。&lt;/p>
&lt;h2 id="示例">示例&lt;/h2>
&lt;p>您可以在状态存储请求的元数据中设置状态 TTL：&lt;/p>












&lt;ul class="nav nav-tabs" id="tabs-2" role="tablist">
 &lt;li class="nav-item">
 &lt;button class="nav-link active"
 id="tabs-02-00-tab" data-bs-toggle="tab" data-bs-target="#tabs-02-00" role="tab"
 data-td-tp-persist="python" aria-controls="tabs-02-00" aria-selected="true">
 Python
 &lt;/button>
 &lt;/li>&lt;li class="nav-item">
 &lt;button class="nav-link"
 id="tabs-02-01-tab" data-bs-toggle="tab" data-bs-target="#tabs-02-01" role="tab"
 data-td-tp-persist=".net" aria-controls="tabs-02-01" aria-selected="false">
 .NET
 &lt;/button>
 &lt;/li>&lt;li class="nav-item">
 &lt;button class="nav-link"
 id="tabs-02-02-tab" data-bs-toggle="tab" data-bs-target="#tabs-02-02" role="tab"
 data-td-tp-persist="go" aria-controls="tabs-02-02" aria-selected="false">
 Go
 &lt;/button>
 &lt;/li>&lt;li class="nav-item">
 &lt;button class="nav-link"
 id="tabs-02-03-tab" data-bs-toggle="tab" data-bs-target="#tabs-02-03" role="tab"
 data-td-tp-persist="http api (bash)" aria-controls="tabs-02-03" aria-selected="false">
 HTTP API (Bash)
 &lt;/button>
 &lt;/li>&lt;li class="nav-item">
 &lt;button class="nav-link"
 id="tabs-02-04-tab" data-bs-toggle="tab" data-bs-target="#tabs-02-04" role="tab"
 data-td-tp-persist="http api (powershell)" aria-controls="tabs-02-04" aria-selected="false">
 HTTP API (PowerShell)
 &lt;/button>
 &lt;/li>
&lt;/ul>

&lt;div class="tab-content" id="tabs-2-content">
 &lt;div class="tab-body tab-pane fade show active"
 id="tabs-02-00" role="tabpanel" aria-labelled-by="tabs-02-00-tab" tabindex="2">
 &lt;!--python-->
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"># 依赖&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">from&lt;/span> &lt;span style="color:#000">dapr.clients&lt;/span> &lt;span style="color:#204a87;font-weight:bold">import&lt;/span> &lt;span style="color:#000">DaprClient&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#8f5902;font-style:italic"># 代码&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">DAPR_STORE_NAME&lt;/span> &lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;statestore&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#204a87;font-weight:bold">with&lt;/span> &lt;span style="color:#000">DaprClient&lt;/span>&lt;span style="color:#000;font-weight:bold">()&lt;/span> &lt;span style="color:#204a87;font-weight:bold">as&lt;/span> &lt;span style="color:#000">client&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000">client&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">.&lt;/span>&lt;span style="color:#000">save_state&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">DAPR_STORE_NAME&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#4e9a06">&amp;#34;order_1&amp;#34;&lt;/span>&lt;span style="color:#000;font-weight:bold">,&lt;/span> &lt;span style="color:#204a87">str&lt;/span>&lt;span style="color:#000;font-weight:bold">(&lt;/span>&lt;span style="color:#000">orderId&lt;/span>&lt;span style="color:#000;font-weight:bold">),&lt;/span> &lt;span style="color:#000">state_metadata&lt;/span>&lt;span style="color:#ce5c00;font-weight:bold">=&lt;/span>&lt;span style="color:#000;font-weight:bold">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#4e9a06">&amp;#39;ttlInSeconds&amp;#39;&lt;/span>&lt;span style="color:#000;font-weight:bold">:&lt;/span> &lt;span style="color:#4e9a06">&amp;#39;120&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000;font-weight:bold">})&lt;/span> 
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>要启动 Dapr sidecar 并运行上述示例应用程序，您可以运行类似以下的命令：&lt;/p></description></item></channel></rss>