你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

快速入门:在 .NET Framework 中使用 Azure Cache for Redis

在本快速入门中,会将 Azure Redis 缓存合并到 .NET Framework 应用中,以便能够访问 Azure 中的任何应用程序都可以访问的安全专用缓存。 你专门在 .NET 控制台应用中将 StackExchange.Redis 客户端与 C# 代码配合使用。

跳到 GitHub 上的代码

从 GitHub 上的 Azure-Samples/azure-cache-redis-samples 克隆存储库。

先决条件

创建缓存

  1. 若要创建缓存,请登录到 Azure 门户。 在门户菜单上,选择“创建资源”。

    屏幕截图显示在 Azure 门户的左侧导航窗格上突出显示的“创建资源”选项。

  2. 在“入门”页上的搜索框中键入“Azure Cache for Redis”。 在搜索结果中找到“Azure Cache for Redis”,然后选择“创建”。

    屏幕截图显示 Azure 市场,其中的搜索框中包含“Azure Cache for Redis”,突出显示了“创建”按钮。

  3. 在“新建 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 概述
  4. 选择“网络”选项卡,或选择“下一步:网络”。

  5. 在“网络”选项卡上,选择用于缓存的连接方法。

  6. 选择“高级”选项卡,或选择“下一步:高级”。

  7. 在“高级”窗格中,根据以下信息验证或选择身份验证方法:

    屏幕截图显示“高级”窗格和可供选择的选项。

    • 默认情况下,对于新的“基本”、“标准”或“高级”缓存,“Microsoft Entra 身份验证”将处于启用状态,而“访问密钥身份验证”则处于禁用状态。
    • 对于“基本”或“标准”缓存,可以选择非 TLS 端口的选项。
    • 对于“标准”和“高级”缓存,可以选择启用可用性区域。 创建缓存后,无法禁用可用性区域。
    • 对于“高级”缓存,请配置非 TLS 端口、群集、托管标识和数据持久性的设置。

    重要

    为了获得最佳安全性,我们建议你在可能的情况下使用 Microsoft Entra ID 和托管标识来授权针对缓存的请求。 与共享访问密钥授权相比,使用 Microsoft Entra ID 和托管标识进行授权提供了更高的安全性和易用性。 若要详细了解如何将托管标识与缓存配合使用,请参阅使用 Microsoft Entra ID 进行缓存身份验证

  8. (可选)选择“标记”选项卡或选择“下一步: 标记”。

  9. (可选)如果希望对缓存资源进行分类,请在“标记”选项卡中输入标记名称和值。

  10. 选择“查看 + 创建”按钮。

    在“查看 + 创建”选项卡上,Azure 会自动验证你的配置。

  11. 显示绿色的“已通过验证”消息后,选择“创建” 。

新的缓存部署需要几分钟的时间。 可以在 Azure Cache for Redis 的“概述”窗格上监视部署进度。 如果“状态”显示为“正在运行”,则表示该缓存可供使用。

在缓存上启用 Microsoft Entra ID 身份验证

如果已有缓存,则需要检查是否已启用 Microsoft Entra 身份验证。 如果未启用,请启用它。 建议为应用使用 Microsoft Entra ID。

  1. 在 Azure 门户中,选择你想要使用基于 Microsoft Entra 令牌的身份验证的 Azure Cache for Redis 实例。

  2. 从“资源”菜单中选择“身份验证”。

  3. 检查工作窗格,查看是否已选中“启用 Microsoft Entra 身份验证”。 如果已启用,可继续操作。

  4. 选择“启用 Microsoft Entra 身份验证”,然后输入有效用户的姓名。 选择“保存”时,系统会自动向你输入的用户默认分配数据所有者访问策略。 还可输入托管标识或服务主体以连接到缓存实例。

    该屏幕截图显示已在资源菜单中选择身份验证且已勾选“启用 Microsoft Entra 身份验证”。

  5. 这会显示一个弹出对话框,询问是否要更新配置,并通知你这需要几分钟时间。 选择

    重要

    启用操作完成后,缓存实例中的节点将重新启动以加载新配置。 建议在维护时段或高峰营业时间外执行此操作。 此操作最多可能需要 30 分钟。

若要将 Microsoft Entra ID 与 Azure CLI 配合使用,请查看标识参考页面

  1. 编辑 App.config 文件,并添加以下内容:

    <appSettings>
    
    <add key="RedisHostName" value="your_redis_cache_hostname"/>
    
```
  1. 将“your_Azure_Redis_hostname”替换为 Azure Redis 主机名和端口号。 例如:cache-name.eastus.redis.azure.net:10000 用于 Azure Cache for Redis 企业版,cache-name.redis.cache.windows.net:6380 用于 Azure Cache for Redis 服务。

  2. 保存文件。

配置缓存客户端

在本部分,你将准备控制台应用程序,以便将 StackExchange.Redis 客户端用于 .NET。

  1. 在 Visual Studio 中,选择“工具”>“NuGet 包管理器”>“包管理器控制台”,然后从“包管理器控制台”窗口运行以下命令。

    Install-Package Microsoft.Azure.StackExchangeRedis
    
  2. 完成安装后,StackExchange.Redis 缓存客户端可供与项目一起使用。

使用 RedisConnection 连接到缓存

与缓存的连接由 RedisConnection 类管理。 首先在 Program.cs 中使用此语句建立连接:

     _redisConnection = await RedisConnection.InitializeAsync(redisHostName: ConfigurationManager.AppSettings["RedisHostName"].ToString());

CacheConnection appSetting 的值用于将 Azure 门户中的缓存连接字符串作为密码参数引用。

RedisConnection.cs 中,你会看到带有 using 关键字的 StackExchange.Redis 命名空间。 这是 RedisConnection 类所必需的。

using StackExchange.Redis;

RedisConnection 代码通过管理 StackExchange.Redis 中的 ConnectionMultiplexer 实例来确保始终与缓存建立运行状况正常的连接。 连接丢失且无法自动重新连接时,RedisConnection 类会重新创建该连接。

有关详细信息,请参阅 StackExchange.RedisGitHub 存储库中的代码。

执行缓存命令

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}");
    }


可以使用 StringSetAsyncStringGetAsync 方法来存储和检索缓存项。

在示例中,你可以看到 Message 密钥设置为值。 应用更新了该缓存值。 应用还执行了 PING 和命令。

处理缓存中的 .NET 对象

Redis 服务器将大多数数据存储为字符串,但这些字符串可能包含许多类型的数据,包括序列化的二进制数据,可在缓存中存储 .NET 对象时使用。

Azure Redis 缓存可以缓存 .NET 对象以及基元数据类型,但在缓存 .NET 对象之前,必须将其序列化。

此 .NET 对象序列化是应用程序开发人员的责任,同时赋与开发人员选择序列化程序的弹性。

将对象序列化的一种简单方式是使用 System.text.Json 中的 JsonConvert 序列化方法。

System.text.Json 命名空间添加到 Visual Studio:

  1. 选择“工具”>“NuGet 包管理器”>“包管理器控制台”。

  2. 然后在“包管理器控制台”窗口中,运行以下命令。

    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;
    }
}

运行示例

Ctrl+F5 生成并运行控制台应用,以便测试 .NET 对象的序列化。

已完成的控制台应用

清理资源

要继续使用在本文中创建的资源,请保留资源组。

否则,如果已完成资源,可以删除创建的 Azure 资源组以避免产生费用。

重要

删除资源组的操作不可逆。 删除资源组时,包含在其中的所有资源会被永久删除。 请确保不会意外删除错误的资源组或资源。 如果在现有资源组(其中包含要保留的资源)内创建了此资源,可以逐个删除这些资源,而不是删除资源组。

删除资源组的步骤

  1. 登录到 Azure 门户,然后选择“资源组”。

  2. 选择要删除的资源组。

    如果有多个资源组,请使用“筛选任何字段...”框,键入为本文创建的资源组的名称。 在结果列表中选择资源组。

    在工作窗格中显示要删除的资源组列表的屏幕截图。

  3. 选择“删除资源组”。

  4. 系统会要求确认是否删除资源组。 键入资源组的名称进行确认,然后选择“删除”。

    显示需要资源名称才能确认删除的表单的屏幕截图。

片刻之后,将会删除该资源组及其所有资源。

后续步骤