如何使用 Azure Redis 缓存

本指南说明如何开始使用 Azure Redis 缓存。 Azure Redis 缓存以常用的开源 Redis 缓存为基础。 这使你能够访问 Azure.cn 管理的安全、专用的 Redis 缓存。 可以通过 Azure 中的任何应用程序访问使用 Azure Redis 缓存创建的缓存。

Azure Redis 缓存提供以下层:

  • 基本 - 单个节点。 多种大小,最大 53 GB。
  • 标准 - 双节点主/副本配置。 多种大小,最大 53 GB。 99.9% SLA。
  • 高级 - 双节点主/副本配置,最多有 10 个分片。 多个大小(从 6 GB 到 530 GB)。 标准层的所有功能加上其他功能,包括支持 Redis 群集Redis 持久性Azure 虚拟网络。 99.9% SLA。

每个级别在功能和定价方面存在差异。 有关定价信息,请参阅缓存定价详细信息

本指南说明如何使用以 C# 代码编写的 StackExchange.Redis 客户端。 涉及的任务包括创建和配置缓存配置缓存客户端,以及在缓存中添加和删除对象。 有关使用 Azure Redis 缓存的详细信息,请参阅后续步骤。 有关构建使用 Redis 缓存的 ASP.NET MVC Web 应用的分步教程,请参阅 How to create a Web App with Redis Cache(如何创建使用 Redis 缓存的 Web 应用)。

开始使用 Azure Redis 缓存

Azure Redis 缓存非常容易上手。 若要开始使用,需要首先设置和配置缓存。 接下来,配置缓存客户端,以便它们可以访问缓存。 在配置了缓存客户端后,就可以开始使用它们。

创建缓存

Note

若要使用中国云环境,以下 Azure PowerShell 命令需要添加“-Environment”参数。
Add-AzureRmAccount
Login-AzureRmAccount

例如,Login-AzureRmAccount 应变为 $china = Get-AzureRmEnvironment -Name AzureChinaCloud; Login-AzureRmAccount -Environment $china(如果使用 Azure PowerShell 1.0.0 或 1.0.1)或 Login-AzureRmAccount -EnvironmentName AzureChinaCloud(如果使用 Azure PowerShell 1.0.2 或更高版本)。

若要创建缓存,请先登录到 Azure 门户,然后单击“新建” > “数据库” > “Redis 缓存”。

Note

如果没有 Azure 帐户,只需花费几分钟就能建立一个 Azure 试用帐户

新建缓存

Note

除了在 Azure 门户中创建缓存以外,也可以使用 Resource Manager 模板、PowerShell 或 Azure CLI 创建。

在“新建 Redis 缓存”中,指定所需的缓存配置。

创建缓存

  • 在“DNS 名称”中,输入用于缓存终结点的唯一缓存名称。 缓存名称必须是包含 1 到 63 个字符的字符串,只能包含数字、字母和 - 字符。 缓存名称的开头或末尾不能是 - 字符,并且连续的 - 字符无效。
  • 对于“订阅”,请选择需要用于缓存的 Azure 订阅。 如果帐户只有一个订阅,则会自动选择该订阅并且不显示“订阅”下拉菜单。
  • 在“资源组” 中,为缓存选择或创建资源组。 有关详细信息,请参阅使用资源组管理 Azure 资源
  • 使用“位置”指定在其中托管缓存的地理位置。 Microsoft 强烈推荐的最佳做法,是在与缓存客户端应用程序相同的区域中创建缓存。
  • 使用“定价层”选择所需的缓存大小和功能。
  • Redis 群集允许你创建大于 53 GB 的缓存,以及将数据分散到多个 Redis 节点。 有关详细信息,请参阅 如何为高级 Azure Redis 缓存配置群集功能
  • Redis 持久性 可让你将缓存保存到 Azure 存储帐户。 有关配置暂留的说明,请参阅 《How to configure persistence for a Premium Azure Redis Cache》(如何为高级 Azure Redis 缓存配置暂留)。
  • 虚拟网络 通过将缓存访问权限限制于指定的 Azure 虚拟网络内的客户端,提供增强的安全性和隔离度。 可以使用 VNet 的所有功能,例如子网、访问控制策略和其他功能,进一步限制对 Redis 的访问。 有关详细信息,请参阅 如何为高级 Azure Redis 缓存配置虚拟网络支持
  • 默认情况下,为新缓存禁用非 SSL 访问。 若要启用非 SSL 端口,请选中“取消阻止端口 6379 (非 SSL 加密)”。

在配置了新的缓存选项后,单击“创建” 。 创建缓存可能耗时几分钟。 要检查的状态,可以监视开始板上的进度。 创建缓存后,新缓存的状态为“正在运行” 并且随时可与 默认设置搭配使用。

创建的缓存

访问已创建的缓存

可以通过“更多服务”在 Azure 门户中访问缓存。

Azure Redis 缓存浏览边栏选项卡

若要查看缓存,请单击“更多服务”,然后搜索“Redis 缓存”。

选择所需的缓存,查看和配置该缓存的设置。

Azure Redis 缓存浏览缓存列表

可以从“Redis 缓存”边栏选项卡查看和配置缓存。

Redis 缓存的所有设置

有关配置缓存的详细信息,请参阅 如何配置 Azure Redis 缓存

配置缓存客户端

.NET 应用程序可以使用 StackExchange.Redis 缓存客户端,可使用 NuGet 包在 Visual Studio 中进行配置,以简化缓存客户端应用程序的配置。

Note

有关详细信息,请参阅 StackExchange.Redis github 页面和 StackExchange.Redis 缓存客户端文档

若要使用 StackExchange.Redis NuGet 包配置客户端应用程序,请在“解决方案资源管理器”中右键单击项目,然后选择“管理 NuGet 包”。

管理 NuGet 包

在“搜索”文本框中键入 StackExchange.RedisStackExchange.Redis.StrongName,从结果选择所需版本,然后单击“安装”。

Note

如果希望使用 StackExchange.Redis 客户端库强名称版本,请选择 StackExchange.Redis.StrongName;否则选择 StackExchange.Redis

StackExchange.Redis NuGet 程序包

NuGet 程序包会给客户端应用程序下载并添加所需的程序集引用,以访问带 StackExchange.Redis 缓存客户端的 Azure Redis 缓存。

Note

如果以前已将项目配置为使用 StackExchange.Redis,则可以通过 NuGet 包管理器检查该包是否有更新。 若要检查并安装 StackExchange.Redis NuGet 包的更新版本,请在“NuGet 包管理器”窗口中单击“更新”。 如果 StackExchange.Redis NuGet 包有可用更新,则可以更新项目以使用更新后的版本。

也可安装 StackExchange.Redis NuGet 包,方法是:依次单击“工具”菜单中的“NuGet 包管理器”、“包管理器控制台”,然后在“包管理器控制台”窗口中运行以下命令。

Install-Package StackExchange.Redis

配置客户端项目的缓存后,就可以使用以下各节中介绍的方法来使用缓存。

使用缓存

本节中的步骤介绍如何使用缓存执行常见任务。

连接到缓存

若要以编程方式使用缓存,需要引用该缓存。 以下代码添加到想使用 StackExchange.Redis 客户端的任何文件的顶部,以访问 Azure Redis 缓存。

using StackExchange.Redis;

Note

StackExchange.Redis 客户端需要.NET Framework 4 或更高版本。

到 Azure Redis 缓存的连接由 ConnectionMultiplexer 类管理。 此类应共享并在客户端应用程序中重复使用,不需要在每次执行操作的基础上创建。

若要连接到 Azure Redis 缓存并返回连接的 ConnectionMultiplexer 的实例,请调用静态 Connect 方法并传入缓存终结点和密钥。 使用从 Azure 门户生成的密钥作为密码参数。

ConnectionMultiplexer connection = ConnectionMultiplexer.Connect("contoso5.redis.cache.chinacloudapi.cn,abortConnect=false,ssl=true,password=...");

Important

警告:切勿将凭据存储在源代码中。 为了使本示例简单明了,我以源代码来呈现凭据内容。 有关如何存储凭据的详细信息,请参阅应用程序字符串和连接字符串的工作原理

如果不想使用 SSL,请设置 ssl=false 或者省略 ssl 参数。

Note

默认情况下,为新缓存禁用非 SSL 端口。 有关启用非 SSL 端口的说明,请参阅访问端口

共享应用程序中的 ConnectionMultiplexer 实例的一个方法是,拥有返回连接示例的静态属性(与下列示例类似)。 此方法是一种线程安全方法,可仅初始化单一连接的 ConnectionMultiplexer 实例。 在这些示例中, abortConnect 设置为 false,这表示即使未建立 Azure Redis 缓存连接,也可成功调用。 ConnectionMultiplexer 的一个关键功能是,一旦解决网络问题和其他原因,它便会自动还原缓存连接。

private static Lazy<ConnectionMultiplexer> lazyConnection = new Lazy<ConnectionMultiplexer>(() =>
{
    return ConnectionMultiplexer.Connect("contoso5.redis.cache.chinacloudapi.cn,abortConnect=false,ssl=true,password=...");
});

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

有关高级连接配置选项的详细信息,请参阅 StackExchange.Redis 配置模型

若要连接到某个 Azure Redis 缓存实例,缓存客户端需要该缓存的主机名、端口和密钥。 在某些客户端中,这些项的名称可能略有不同。 可以在 Azure 门户中检索该信息,也可以通过命令行工具(例如 Azure CLI)来检索。

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

若要使用 Azure 门户检索主机名、端口和访问密钥,请浏览Azure 门户中的缓存,然后在“设置”中单击“访问密钥”和“属性”。

Redis 缓存设置

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

若要使用 Azure CLI 2.0 检索主机名和端口,可调用 az redis show;若要检索密钥,可调用 az redis list-keys。 以下脚本调用这两个命令,并将主机名、端口和密钥回显到控制台。

#/bin/bash

# Retrieve the hostname, ports, and keys for contosoCache located in contosoGroup

# Retrieve the hostname and ports for an Azure Redis Cache instance
redis=($(az redis show --name contosoCache --resource-group contosoGroup --query [hostName,enableNonSslPort,port,sslPort] --output tsv))

# Retrieve the keys for an Azure Redis Cache instance
keys=($(az redis list-keys --name contosoCache --resource-group contosoGroup --query [primaryKey,secondaryKey] --output tsv))

# Display the retrieved hostname, keys, and ports
echo "Hostname:" ${redis[0]}
echo "Non SSL Port:" ${redis[2]}
echo "Non SSL Port Enabled:" ${redis[1]}
echo "SSL Port:" ${redis[3]}
echo "Primary Key:" ${keys[0]}
echo "Secondary Key:" ${keys[1]}

有关此脚本的详细信息,请参阅获取 Azure Redis 缓存的主机名、端口和密钥。 有关 Azure CLI 2.0 的详细信息,请参阅 Install Azure CLI 2.0(安装 Azure CLI 2.0)和 Get started with Azure CLI 2.0(Azure CLI 2.0 入门)。

建立连接后,通过调用 ConnectionMultiplexer.GetDatabase 方法返回对 Redis 缓存数据库的引用。 从 GetDatabase 方法返回的对象是一个轻型直通对象,不需要存储。

// Connection refers to a property that returns a ConnectionMultiplexer
// as shown in the previous example.
IDatabase cache = Connection.GetDatabase();

// Perform cache operations using the cache object...
// Simple put of integral data types into the cache
cache.StringSet("key1", "value");
cache.StringSet("key2", 25);

// Simple get of data types from the cache
string key1 = cache.StringGet("key1");
int key2 = (int)cache.StringGet("key2");

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

已经知道如何连接到 Azure Redis 缓存实例并返回对缓存数据库的引用,现在让我们看看如何使用缓存。

从缓存添加和检索对象

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

// If key1 exists, it is overwritten.
cache.StringSet("key1", "value1");

string value = cache.StringGet("key1");

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

调用 StringGet 时,如果该对象存在,则返回它,如果该对象不存在,则返回 null。 如果返回 null,则可从所需的数据源检索值,并将其存储在缓存中供后续使用。 此使用模式称为缓存端模式。

string value = cache.StringGet("key1");
if (value == null)
{
    // The item keyed by "key1" is not in the cache. Obtain
    // it from the desired data source and add it to the cache.
    value = GetValueFromDataSource();

    cache.StringSet("key1", value);
}

也可使用 RedisValue,如以下示例所示。 RedisValue 具有隐式运算符,适用于整型数据类型,并可用于 null 是缓存项的预期值的情况。

RedisValue value = cache.StringGet("key1");
if (!value.HasValue)
{
    value = GetValueFromDataSource();
    cache.StringSet("key1", value);
}

要在缓存中指定项的过期时间,请使用 StringSetTimeSpan 参数。

cache.StringSet("key1", "value1", TimeSpan.FromMinutes(90));

处理缓存中的 .NET 对象

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

序列化对象的一种简单方式是使用 Newtonsoft.Json.NET 中的 JsonConvert 序列化方法,并与 JSON 相互序列化。 以下示例演示了使用 Employee 对象实例执行 GET 和 SET。

class Employee
{
    public int Id { get; set; }
    public string Name { get; set; }

    public Employee(int EmployeeId, string Name)
    {
        this.Id = EmployeeId;
        this.Name = Name;
    }
}

// Store to cache
cache.StringSet("e25", JsonConvert.SerializeObject(new Employee(25, "Clayton Gragg")));

// Retrieve from cache
Employee e25 = JsonConvert.DeserializeObject<Employee>(cache.StringGet("e25"));

后续步骤

现在,已学习了基础知识,接下来请打开以下链接了解有关 Azure Redis 缓存的详细信息。