快速入门:将 Azure Cache for Redis 与 .NET Core 应用配合使用
在本快速入门中,请将 Azure Cache for Redis 合并到 .NET Core 应用中,以便访问 Azure 中的任何应用程序都可以访问的安全专用缓存。 你专门在 .NET Core 控制台应用中将 StackExchange.Redis 客户端与 C# 代码配合使用。
跳到代码
本文介绍如何修改示例应用的代码,以创建连接到 Azure Cache for Redis 的工作应用。
若要直接转到示例代码,请参阅 GitHub 上的 .NET Core 快速入门示例。
先决条件
- Azure 订阅。 创建一个
- .NET Core SDK
创建缓存
若要创建缓存,请登录到 Azure 门户并选择“创建资源”。
在“入门”页上的搜索框中键入“Azure Cache for Redis”。 然后选择创建。
在“新建 Redis 缓存”页上配置缓存的设置。
设置 选择值 说明 订阅 单击下拉箭头并选择你的订阅。 要在其下创建此新的 Azure Cache for Redis 实例的订阅。 资源组 单击下拉箭头并选择一个资源组,或者选择新建并输入新的资源组名称。 要在其中创建缓存和其他资源的资源组的名称。 将所有应用资源放入一个资源组可以轻松地统一管理或删除这些资源。 DNS 名称 输入唯一名称。 缓存名称必须是包含 1 到 63 个字符的字符串,只能包含数字、字母或连字符。 该名称必须以数字或字母开头和结尾,且不能包含连续的连字符。 缓存实例的主机名是 <DNS name>.redis.cache.chinacloudapi.cn。 位置 单击下拉箭头并选择一个位置。 选择使用缓存的其他服务附近的区域。 缓存 SKU 打开下拉列表并选择一个 SKU。 此 SKU 决定可用于缓存的大小、性能和功能参数。 有关详细信息,请参阅用于 Redis 的 Azure 缓存概述。 缓存大小 打开下拉列表并选择缓存的大小 有关详细信息,请参阅用于 Redis 的 Azure 缓存概述。 选择网络选项卡,或选择网络按钮(位于页面底部) 。
在网络选项卡中,选择你的连接方法。
选择“下一步: 高级”选项卡,或选择页面底部的“下一步: 高级”按钮,以查看“高级”选项卡。
- 对于“基本”或“标准”缓存,请切换非 TLS 端口的选项。 还可以选择是否要启用“Microsoft Entra 身份验证”。
- 对于“高级”缓存,请配置非 TLS 端口、群集、托管标识和数据持久性的设置。 还可以选择是否要启用“Microsoft Entra 身份验证”。
选择下一步: 标记选项卡,或选择页面底部的下一步: 标记按钮 。
或者,在标记选项卡中,如果希望对资源分类,请输入名称或值。
选择查看 + 创建。 随后你会转到“查看 + 创建”选项卡,Azure 将在此处验证配置。
显示绿色的“已通过验证”消息后,选择创建。
创建缓存需要一段时间。 可以在 Azure Cache for Redis 的概述页上监视进度。 如果“状态”显示为“正在运行”,则表示该缓存可供使用。
获取主机名、端口和访问密钥
若要连接到你的 Azure Cache for Redis 服务器,缓存客户端需要该缓存的主机名、端口和访问密钥。 在某些客户端中,这些项的名称可能略有不同。 可以在 Azure 门户中获取主机名、端口和密钥。
若要获取缓存的访问密钥,请执行以下操作:
- 在 Azure 门户中转到自己的缓存。
- 在服务菜单中的“设置”下,选择“身份验证”。
- 在“身份验证”窗格上,选择“访问密钥”选项卡。
- 若要复制访问密钥的值,请选择密钥字段中的“复制”图标。
若要获取缓存的主机名和端口,请执行以下操作:
- 在 Azure 门户中转到自己的缓存。
- 在服务菜单中,选择“概述”。
- 在“Essentials”下,对于“主机名”,请选择“复制”图标以复制主机名值。 主机名值的形式为
<DNS name>.redis.cache.chinacloudapi.cn
。 - 对于“端口”,请选择“复制”图标以复制端口值。
记下“主机名”和“主访问密钥”的值。 稍后你将使用这些值来构造 CacheConnection
机密。
添加连接字符串的本地机密
在命令提示符窗口中,执行以下命令来存储名为 CacheConnection
的新机密。 将占位符(包括尖括号)替换为你的缓存名称 (<cache name>
) 和主访问密钥 (<primary-access-key>
):
dotnet user-secrets set CacheConnection "<cache name>.redis.cache.chinacloudapi.cn,abortConnect=false,ssl=true,allowAdmin=true,password=<primary-access-key>"
使用 RedisConnection 连接到缓存
与缓存的连接由 RedisConnection
类管理。 首先,在 Program.cs 的以下语句中建立连接:
_redisConnection = await RedisConnection.InitializeAsync(connectionString: configuration["CacheConnection"].ToString());
在 RedisConnection.cs 中,StackExchange.Redis 命名空间已添加到代码。 该命名空间是 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 对象序列化是应用程序开发人员的责任。 对象序列化可让开发人员灵活地选择序列化程序。
在 Program.cs 中定义了以下 Employee
类,因此示例还可以显示如何获取和设置序列化对象:
class Employee
{
public string Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public Employee(string id, string name, int age)
{
Id = id;
Name = name;
Age = age;
}
}
运行示例
如果打开了任何文件,请保存这些文件。 然后,使用以下命令生成应用:
dotnet build
若要测试 .NET 对象的序列化,请运行以下命令:
dotnet run
清理资源
要继续使用在本文中创建的资源,请保留资源组。
否则,为了避免与资源相关的费用,若已用完资源,可以删除已创建的 Azure 资源组。
警告
删除资源组的操作不可逆。 删除一个资源组时,该资源组中的所有资源都会被永久删除。 请确保不会意外删除错误的资源组或资源。 如果在现有资源组内创建了资源,并且该资源组中还有想要保留的资源,可以逐个删除这些资源,而不是删除资源组。
删除资源组
登录到 Azure 门户,然后选择“资源组”。
选择要删除的资源组。
如果有多个资源组,请在“筛选任何字段”中,输入为完成本文创建的资源组的名称。 在搜索结果列表中,选择该资源组。
选择“删除资源组”。
在“删除资源组”窗格中,输入资源组的名称进行确认,然后选择“删除”。
很快将会删除该资源组及其所有资源。