快速入门:将 Azure Redis 缓存与 .NET 应用程序配合使用

本快速入门展示了如何开始将 Azure Redis 缓存与 .NET 配合使用。 Azure Redis 缓存基于流行的开源 Redis 缓存。 它让你访问 Microsoft 管理的安全专用的 Redis 缓存。 可以通过 Azure 中的任何应用程序访问使用 Azure Redis 缓存创建的缓存。

在本快速入门中,你将在控制台应用中将 StackExchange.Redis 客户端与 C# 代码配合使用。 你将创建缓存并配置 .NET 客户端应用。 然后,你将在缓存中添加和更新对象。

已完成的控制台应用

如果没有 Azure 订阅,可在开始前创建一个试用帐户

先决条件

创建缓存

  1. 若要创建缓存,请首先登录到 Azure 门户。 然后选择“创建资源” > “数据库” > “Redis 缓存”。

    新建缓存

  2. 在“新建 Redis 缓存”中,配置新缓存的设置。

    设置 建议的值 说明
    DNS 名称 全局唯一名称 缓存名称。 必须是 1 到 63 个字符的字符串,只能包含数字、字母和 - 字符。 缓存名称的开头或末尾不能是 - 字符,并且连续的 - 字符无效。
    订阅 你的订阅 要在其下创建此新 Azure Redis 缓存实例的订阅。
    资源组 TestResources 要在其中创建缓存的新资源组的名称。 通过将应用的所有资源都放在一个组中,可以一起管理它们。 例如,删除资源组会删除与该应用关联的所有资源。
    位置 中国北部 选择将使用缓存的其他服务附近的区域
    定价层 基本 C0(250 MB 缓存) 定价层决定可用于缓存的大小、性能和功能。 有关详细信息,请参阅 Azure Redis 缓存概述
    固定到仪表板 选定 将新缓存固定到仪表板,使其容易被找到。

    创建缓存

  3. 配置了新缓存设置后,选择“创建”。

    创建缓存可能耗时几分钟。 若要检查状态,可以监视仪表板上的进度。 缓存在创建后会显示状态为“正在运行”,可供用户使用。

    创建的缓存

使用 Azure 门户检索主机名、端口和访问密钥

连接到某个 Azure Redis 缓存实例时,缓存客户端需要该缓存的主机名、端口和密钥。 在某些客户端中,这些项的名称可能略有不同。 可以在 Azure 门户中检索此信息。

检索访问密钥和主机名的步骤

  1. 若要使用 Azure 门户检索访问密钥,请浏览到缓存,然后选择“访问密钥”。

    Azure Redis 缓存密钥

  2. 若要检索主机名和端口,请选择“属性”。

    Azure Redis 缓存属性

在计算机上创建名为 CacheSecrets.config 的文件,将其放到不会连同示例应用程序源代码一起签入的位置。 在本快速入门中,CacheSecrets.config 文件的路径为 C:\AppSecrets\CacheSecrets.config

编辑 CacheSecrets.config 文件,添加以下内容:

<appSettings>
    <add key="CacheConnection" value="<cache-name>.redis.cache.chinacloudapi.cn,abortConnect=false,ssl=true,password=<access-key>"/>
</appSettings>

<cache-name> 替换为缓存主机名。

<access-key> 替换缓存的主密钥。

创建控制台应用

在 Visual Studio 中,单击“文件” > “新建” > “项目”。

在“Visual C#”下,单击“Windows 经典桌面”,然后依次单击“控制台应用”和“确定”来创建新的控制台应用程序。

配置缓存客户端

在本部分中,你将配置控制台应用程序来将 StackExchange.Redis 客户端用于 .NET。

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

Install-Package StackExchange.Redis

安装完成后,StackExchange.Redis 缓存客户端可供用于你的项目。

连接到缓存

在 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.1" />
    </startup>

    <appSettings file="C:\AppSecrets\CacheSecrets.config"></appSettings>  

</configuration>

在解决方案资源管理器中,右键单击“引用”并单击“添加引用”。 添加对 System.Configuration 程序集的引用。

Program.cs 中添加以下 using 语句:

using StackExchange.Redis;
using System.Configuration;

到 Azure Redis 缓存的连接由 ConnectionMultiplexer 类管理。 应当在整个客户端应用程序中共享并重复使用此类。 不要为每个操作都创建新连接。

切勿将凭据存储在源代码中。 为了保持简单,此示例仅使用一个外部机密配置文件。 更好的方法是使用包含证书的 Azure Key Vault

Program.cs 中,将以下成员添加到控制台应用程序的 Program 类:

private static Lazy<ConnectionMultiplexer> lazyConnection = new Lazy<ConnectionMultiplexer>(() =>
{
    string cacheConnection = ConfigurationManager.AppSettings["CacheConnection"].ToString();
    return ConnectionMultiplexer.Connect(cacheConnection);
});

public static ConnectionMultiplexer Connection
{
    get
    {
        return lazyConnection.Value;
    }
}

此方式在应用程序中共享 ConnectionMultiplexer 实例,它使用返回所连接的实例的静态属性。 该代码提供了一种线程安全方式,它仅初始化单个已连接的 ConnectionMultiplexer 实例。 abortConnect 设置为 false,这意味着即使未建立 Azure Redis 缓存连接,调用也会成功。 ConnectionMultiplexer 的一个关键功能是,一旦解决网络问题和其他原因,它便会自动还原缓存连接。

CacheConnection appSetting 的值用来将 Azure 门户中的缓存连接字符串引用为 password 参数。

执行缓存命令

为控制台应用程序的 Program 类的 Main 过程添加以下代码:

static void Main(string[] args)
{
    // Connection refers to a property that returns a ConnectionMultiplexer
    // as shown in the previous example.
    IDatabase cache = lazyConnection.Value.GetDatabase();

    // Perform cache operations using the cache object...

    // Simple PING command
    string cacheCommand = "PING";
    Console.WriteLine("\nCache command  : " + cacheCommand);
    Console.WriteLine("Cache response : " + cache.Execute(cacheCommand).ToString());

    // Simple get and put of integral data types into the cache
    cacheCommand = "GET Message";
    Console.WriteLine("\nCache command  : " + cacheCommand + " or StringGet()");
    Console.WriteLine("Cache response : " + cache.StringGet("Message").ToString());

    cacheCommand = "SET Message \"Hello! The cache is working from a .NET console app!\"";
    Console.WriteLine("\nCache command  : " + cacheCommand + " or StringSet()");
    Console.WriteLine("Cache response : " + cache.StringSet("Message", "Hello! The cache is working from a .NET console app!").ToString());

    // Demostrate "SET Message" executed as expected...
    cacheCommand = "GET Message";
    Console.WriteLine("\nCache command  : " + cacheCommand + " or StringGet()");
    Console.WriteLine("Cache response : " + cache.StringGet("Message").ToString());

    // Get the client list, useful to see if connection list is growing...
    cacheCommand = "CLIENT LIST";
    Console.WriteLine("\nCache command  : " + cacheCommand);
    Console.WriteLine("Cache response : \n" + cache.Execute("CLIENT", "LIST").ToString().Replace("id=", "id="));

    lazyConnection.Value.Dispose();
}

Azure Redis 缓存的数据库数目(默认为 16 个)是可以配置的,因此可以通过逻辑方式隔离 Redis 缓存中的数据。 该代码将连接到默认数据库 DB 0。 有关详细信息,请参阅什么是 Redis 数据库?默认 Redis 服务器配置

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

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

Ctrl+F5 生成并运行控制台应用。

在以下示例中可以看到,Message 键事先已包含一个缓存值,该值是使用 Azure 门户中的 Redis 控制台设置的。 应用更新了该缓存值。 应用还执行了 PINGCLIENT LIST 命令。

控制台应用的一部分

处理缓存中的 .NET 对象

Azure Redis 缓存可以缓存 .NET 对象以及基元数据类型,但在缓存 .NET 对象之前,必须将其序列化。 此 .NET 对象序列化是应用程序开发人员的责任,同时赋与开发人员选择序列化程序的弹性。

将对象序列化的一种简单方式是使用 Newtonsoft.Json 中的 JsonConvert 序列化方法,并以 JSON 为源和目标进行序列化。 在本部分中,将向缓存添加一个 .NET 对象。

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

Install-Package Newtonsoft.Json

将下面的 using 语句添加到 Program.cs 的开头:

using Newtonsoft.Json;

将下面的 Employee 类定义添加到 Program.cs 中:

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)
    {
        this.Id = EmployeeId;
        this.Name = Name;
        this.Age = Age;
    }
}

Program.csMain() 过程的底部并且在 Dispose() 调用之前,添加以下代码行来缓存和检索序列化的 .NET 对象:

    // Store .NET object to cache
    Employee e007 = new Employee("007", "Davide Columbo", 100);
    Console.WriteLine("Cache response from storing Employee .NET object : " + 
        cache.StringSet("e007", JsonConvert.SerializeObject(e007)));

    // Retrieve .NET object from cache
    Employee e007FromCache = JsonConvert.DeserializeObject<Employee>(cache.StringGet("e007"));
    Console.WriteLine("Deserialized Employee .NET object :\n");
    Console.WriteLine("\tEmployee.Name : " + e007FromCache.Name);
    Console.WriteLine("\tEmployee.Id   : " + e007FromCache.Id);
    Console.WriteLine("\tEmployee.Age  : " + e007FromCache.Age + "\n");

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

已完成的控制台应用

清理资源

如果想要继续学习下一篇教程,可以保留本快速入门中创建的资源,以便重复使用。

如果已完成快速入门示例应用程序,可以删除本快速入门中创建的 Azure 资源,以免产生费用。

Important

删除资源组的操作不可逆,资源组以及其中的所有资源将被永久删除。 请确保不会意外删除错误的资源组或资源。 如果在现有资源组(其中包含要保留的资源)中为托管此示例而创建了相关资源,可从各自的边栏选项卡逐个删除这些资源,而不要删除资源组。

登录到 Azure 门户,并单击“资源组”。

在“按名称筛选...”文本框中键入资源组的名称。 本文的说明使用了名为 TestResources 的资源组。 在结果列表中的资源组上,单击“...”,然后单击“删除资源组”。

删除

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

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

后续步骤

在本快速入门中,你已学习了如何从 .NET 应用程序中使用 Azure Redis 缓存。 请继续学习下一快速入门来将 Redis 缓存与 ASP.NET Web 应用配合使用。