你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
快速入门:将 Azure Cache for Redis 与 .NET 应用配合使用
在本快速入门中,你会将 Azure Cache for Redis 合并到 .NET 应用中,以便访问 Azure 中的任何应用程序都可以访问的安全专用缓存。 你专门在 .NET 控制台应用中将 StackExchange.Redis 客户端与 C# 代码配合使用。
跳到 GitHub 上的代码
本文介绍如何修改示例应用的代码,以创建连接到 Azure Cache for Redis 的工作应用。
如果要直接转到代码,请参阅 GitHub 上的 .NET 快速入门示例。
先决条件
- Azure 订阅。 免费创建一个
- Visual Studio 2019
- .NET Framework 4 或更高版本,这是 StackExchange.Redis 客户端所必需的
创建缓存
若要创建缓存,请登录到 Azure 门户。 在门户菜单上,选择“创建资源”。
在“入门”窗格上的搜索栏中输入“Azure Cache for Redis”。 在搜索结果中找到“Azure Cache for Redis”,然后选择“创建”。
在“新建 Redis 缓存”窗格的“基本信息”选项卡上,配置缓存的以下设置:
设置 操作 说明 订阅 选择 Azure 订阅。 用于创建 Azure Cache for Redis 的新实例的订阅。 资源组 选择一个资源组,或者选择“新建”并输入新的资源组名称。 要在其中创建缓存和其他资源的资源组的名称。 将所有应用资源放入一个资源组可以轻松地统一管理或删除这些资源。 DNS 名称 输入唯一名称。 缓存名称必须是长度为 1 到 63 个字符的字符串,只能包含数字、字母和连字符。 该名称必须以数字或字母开头和结尾,且不能包含连续的连字符。 缓存实例的主机名为 \<DNS name>.redis.cache.windows.net
。位置 选择一个位置。 一个靠近其他使用缓存的服务的 Azure 区域。 缓存 SKU 选择 SKU。 此 SKU 决定可用于缓存的大小、性能和功能参数。 有关详细信息,请参阅 Azure Cache for Redis 概述。 缓存大小 选择缓存大小。 有关详细信息,请参阅 Azure Cache for Redis 概述。 选择“网络”选项卡,或者选择“下一步: 网络”。
在“网络”选项卡上,选择用于缓存的连接方法。
选择“高级”选项卡,或者选择“下一步: 高级”。
在“高级”窗格上,根据以下信息验证或选择身份验证方法:
- 默认情况下,对于新的“基本”、“标准”或“高级”缓存,“Microsoft Entra 身份验证”将处于启用状态,而“访问密钥身份验证”则处于禁用状态。
- 对于“基本”或“标准”缓存,可以选择非 TLS 端口的选项。
- 对于“标准”和“高级”缓存,可以选择启用可用性区域。 创建缓存后,无法禁用可用性区域。
- 对于“高级”缓存,请配置非 TLS 端口、群集、托管标识和数据持久性的设置。
重要
为了获得最佳安全性,我们建议你在可能的情况下使用 Microsoft Entra ID 和托管标识来授权针对缓存的请求。 与共享访问密钥授权相比,使用 Microsoft Entra ID 和托管标识进行授权提供了更高的安全性和易用性。 若要详细了解如何将托管标识与缓存配合使用,请参阅使用 Microsoft Entra ID 进行缓存身份验证。
(可选)选择“标记”选项卡或选择“下一步: 标记”。
(可选)如果希望对缓存资源进行分类,请在“标记”选项卡中输入标记名称和值。
选择“查看 + 创建”按钮。
在“查看 + 创建”选项卡上,Azure 会自动验证你的配置。
显示绿色的“已通过验证”消息后,选择“创建” 。
新的缓存部署需要几分钟的时间。 可以在 Azure Cache for Redis 的“概述”窗格上监视部署进度。 如果“状态”显示为“正在运行”,则表示该缓存可供使用。
获取主机名、端口和访问密钥
若要连接到你的 Azure Cache for Redis 服务器,缓存客户端需要该缓存的主机名、端口和访问密钥。 在某些客户端中,这些项的名称可能略有不同。 可以在 Azure 门户中获取主机名、端口和密钥。
若要获取缓存的访问密钥,请执行以下操作:
- 在 Azure 门户中转到自己的缓存。
- 在服务菜单上的“设置”下,选择“身份验证”。
- 在“身份验证”窗格上,选择“访问密钥”选项卡。
- 若要复制访问密钥的值,请选择密钥字段中的“复制”图标。
若要获取缓存的主机名和端口,请执行以下操作:
- 在 Azure 门户中转到自己的缓存。
- 在服务菜单中,选择“概述”。
- 在“概要”下,对于“主机名”,请选择“复制”图标以复制主机名值。 主机名值的形式为
<DNS name>.redis.cache.windows.net
。 - 对于“端口”,请选择“复制”图标以复制端口值。
在计算机上创建名为 CacheSecrets.config 的文件。将其放置在 **C:\AppSecrets 文件夹中。
编辑 CacheSecrets.config 文件,添加以下内容:
<appSettings> <add key="CacheConnection" value="<host-name>,abortConnect=false,ssl=true,allowAdmin=true,password=<access-key>"/> </appSettings>
将
<host-name>
替换为缓存主机名。将
<access-key>
替换缓存的主密钥。
保存文件。
配置缓存客户端
在本部分,你将准备控制台应用程序,以便将 StackExchange.Redis 客户端用于 .NET。
在 Visual Studio 中,选择“工具”>“NuGet 包管理器”>“包管理器控制台” 。 在“包管理器控制台”窗口中,运行以下命令:
Install-Package StackExchange.Redis
完成安装后,StackExchange.Redis 缓存客户端就可以在项目中使用了。
连接到 Secrets 缓存
在 Visual Studio 中,打开 App.config 文件,验证其中是否包含引用 CacheSecrets.config 文件的 appSettings
file
属性:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
</startup>
<appSettings file="C:\AppSecrets\CacheSecrets.config"></appSettings>
</configuration>
切勿将凭据存储在源代码中。 为使本示例简单易懂,我们使用外部密码配置文件。 更好的方法是将 Azure Key Vault 与证书配合使用。
使用 RedisConnection 连接到缓存
与缓存的连接由 RedisConnection
类管理。 首先,在 Program.cs 的以下语句中建立连接:
_redisConnection = await RedisConnection.InitializeAsync(connectionString: ConfigurationManager.AppSettings["CacheConnection"].ToString());
CacheConnection 应用设置的值用于从 Azure 门户中引用缓存连接字符串作为密码参数。
在 RedisConnection.cs 中,StackExchange.Redis 命名空间作为 using
语句出现,这是 RedisConnection
类所需的:
using StackExchange.Redis;
RedisConnection
类代码可确保始终与缓存建立正常的连接。 该连接通过来自 StackExchange.Redis 的 ConnectionMultiplexer
实例进行管理。 当连接断开且无法自动重新连接时,RedisConnection
类会重新创建连接。
有关详细信息,请参阅 StackExchange.Redis 以及 StackExchange.Redis GitHub 存储库中的代码。
执行缓存命令
在 Program.cs 中,可以看到控制台应用程序的 Program
类中 RunRedisCommandsAsync
方法的以下代码:
private static async Task RunRedisCommandsAsync(string prefix)
{
// Simple PING command
Console.WriteLine($"{Environment.NewLine}{prefix}: Cache command: PING");
RedisResult pingResult = await _redisConnection.BasicRetryAsync(async (db) => await db.ExecuteAsync("PING"));
Console.WriteLine($"{prefix}: Cache response: {pingResult}");
// Simple get and put of integral data types into the cache
string key = "Message";
string value = "Hello! The cache is working from a .NET console app!";
Console.WriteLine($"{Environment.NewLine}{prefix}: Cache command: GET {key} via StringGetAsync()");
RedisValue getMessageResult = await _redisConnection.BasicRetryAsync(async (db) => await db.StringGetAsync(key));
Console.WriteLine($"{prefix}: Cache response: {getMessageResult}");
Console.WriteLine($"{Environment.NewLine}{prefix}: Cache command: SET {key} \"{value}\" via StringSetAsync()");
bool stringSetResult = await _redisConnection.BasicRetryAsync(async (db) => await db.StringSetAsync(key, value));
Console.WriteLine($"{prefix}: Cache response: {stringSetResult}");
Console.WriteLine($"{Environment.NewLine}{prefix}: Cache command: GET {key} via StringGetAsync()");
getMessageResult = await _redisConnection.BasicRetryAsync(async (db) => await db.StringGetAsync(key));
Console.WriteLine($"{prefix}: Cache response: {getMessageResult}");
// Store serialized object to cache
Employee e007 = new Employee("007", "Davide Columbo", 100);
stringSetResult = await _redisConnection.BasicRetryAsync(async (db) => await db.StringSetAsync("e007", JsonSerializer.Serialize(e007)));
Console.WriteLine($"{Environment.NewLine}{prefix}: Cache response from storing serialized Employee object: {stringSetResult}");
// Retrieve serialized object from cache
getMessageResult = await _redisConnection.BasicRetryAsync(async (db) => await db.StringGetAsync("e007"));
Employee e007FromCache = JsonSerializer.Deserialize<Employee>(getMessageResult);
Console.WriteLine($"{prefix}: Deserialized Employee .NET object:{Environment.NewLine}");
Console.WriteLine($"{prefix}: Employee.Name : {e007FromCache.Name}");
Console.WriteLine($"{prefix}: Employee.Id : {e007FromCache.Id}");
Console.WriteLine($"{prefix}: Employee.Age : {e007FromCache.Age}{Environment.NewLine}");
}
可以使用 StringSetAsync
和 StringGetAsync
方法来存储和检索缓存项。
在示例中,你可以看到 Message
密钥设置为值。 应用更新了该缓存值。 应用还执行了 PING
和命令。
处理缓存中的 .NET 对象
Redis 服务器将大多数数据存储为字符串,但这些字符串可能包含许多类型的数据,包括序列化的二进制数据,可在缓存中存储 .NET 对象时使用。
Azure Cache for Redis 可以缓存 .NET 对象以及基元数据类型,但在缓存 .NET 对象之前,必须将其序列化。
这种 .NET 对象序列化应由应用程序开发人员负责。 你可以灵活选择序列化程序。
将对象序列化的一种简单方式是使用 System.text.Json 中的 JsonConvert
序列化方法。
在 Visual Studio 中添加 System.text.Json 命名空间:
选择“工具”>“NuGet 包管理器”>“包管理器控制台”。
然后在“包管理器控制台”窗口中,运行以下命令:
Install-Package system.text.json
在 Program.cs 中定义了以下 Employee
类,因此示例可以显示如何获取和设置序列化对象:
class Employee
{
public string Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public Employee(string employeeId, string name, int age)
{
Id = employeeId;
Name = name;
Age = age;
}
}
运行示例
若要生成并运行控制台应用以测试 .NET 对象的序列化,请选择 Ctrl+F5。
清理资源
要继续使用在本文中创建的资源,请保留资源组。
否则,为了避免与资源相关的费用,若已用完资源,可以删除创建的 Azure 资源组。
警告
删除资源组的操作不可逆。 删除一个资源组时,该资源组中的所有资源都会被永久删除。 请确保不会意外删除错误的资源组或资源。 如果在现有资源组内创建了资源,并且该资源组中还有想要保留的资源,可以逐个删除这些资源,而不是删除资源组。
删除资源组
登录到 Azure 门户,然后选择“资源组”。
选择要删除的资源组。
如果有多个资源组,请在“筛选任何字段”中,输入为完成本文创建的资源组的名称。 在搜索结果列表中,选择该资源组。
选择“删除资源组”。
在“删除资源组”窗格中,输入资源组的名称进行确认,然后选择“删除”。
很快就会删除该资源组及其所有资源。