Redis 性能优化简介





5.00/5 (1投票)
Redis 性能优化简介
引言
您是否曾花费数月开发和大量精力,最终却发现一个性能极差的 Web 应用程序?您是否曾好奇,如果无法向普通用户展示他们期望的快速响应,客户凭什么继续聘请您这位专家?您是否曾听到过与 Google 和 Facebook 的可怕比较?让我告诉您我的客户是如何扭转局面的
我曾在一个 Web 应用程序上工作,该应用程序由于大量的业务规则和 UI 要求,涉及繁重的处理和过滤。此外,还有一个使用过时技术的第三方提供商,对他们来说,速度意味着 15 年的工作付诸东流并需要重新开始。我的应用程序速度并不快,有时一个请求需要大约 6 到 8 秒才能处理、验证业务规则、过滤并格式化响应。这对我的客户来说是完全不可接受的。我被告知,如果 Google 可以做到,我们也可以。顺便说一句,Facebook 也做到了。我没有向客户解释他们背后的硬件和服务器是多么庞大和复杂,才有了那样的速度。我只是回应说,我们可以做得更好,并在心中想着 Redis,我承诺会做到。
因此,在深入了解 Redis 之前,我先来谈谈 NoSQL。
大多数开发人员习惯于关系型数据库。无论是在数据驱动开发(Data Driven Development)还是领域驱动开发(Domain Driven Development)的潮流下(例如 Entity Framework Code First 或 Fluent API NHibernate),关系型数据库的概念依然存在。另一方面,NoSQL 带来了文档式数据存储。在 .NET 社区中,流行的有 MongoDb、RavenDb 和 Redis。我之前写过一篇关于 MongoDb 的教程,您可以在 这里 找到。我曾用它来记录重要的活动、错误和异常等。
同样,在 NoSQL 世界中,所有流行数据库的概念基本相同。基本上,它们是将 JSON 文档存储在您的计算机或服务器上,并通过某种 .NET 客户端或驱动程序来访问和操作。NoSQL 的伟大之处在于它解决了使用关系型数据库结合面向对象语言(如 C# 或 Java)的一个主要缺陷:阻抗不匹配。
Redis 与任何 NoSQL 数据库一样。但它的独特之处在于它驻留在内存中。它是一个内存中的 NoSQL 数据库。
简而言之,Redis 提供了无与伦比的能力来缓存您的对象状态,从而加速您的应用程序。有时,您的应用程序可以快 8 到 10 倍。这不是玩笑,您不需要拥有 Google 或 Facebook 的基础设施。如果您想了解更多关于 Redis 的理念和历史,可以查阅网络资料。有大量的文献可以参考。
Redis 代表远程字典服务(Remote Dictionary Service),它恰如其名。它是一个键值存储,就像 C# 中的字典对象一样。那么,让我们看看如何使用它。
首先,让我们按照以下步骤安装并运行 Redis。
- 访问 redis.io,下载 win64 版本(您需要的版本取决于您的系统)。
- 将下载的内容复制到一个名为Redis 的新文件夹中(您可以随意命名!)。
- 单击redis-server.exe 来运行服务器。
- 单击redis-client.exe 来运行客户端命令行工具。
现在,让我们尝试一些基本命令,以确保一切设置正确。在客户端命令行中,执行以下操作:
- 输入:
set azul "hello world"
来添加一个条目,您应该会收到一个 ok。这意味着您已经创建了一个键为 azul,值为 "hello world!" 的条目(顺便说一句,azul 是卡拜尔语中的问候语)。 - 输入
Get azul
来获取值,您将收到值hello world
。 - 输入
Delete azul
将删除该条目。
由于 Redis 是一个字典,您可以通过键和值进行存储,如下所示:
Set schedule:1 "{'origin':'Montreal','destination':'Toronto'}"
在前面的示例中,值是一个 JSON 对象。这表明您可以将复杂对象添加到 Redis。但故事不止于此,因为您还可以依赖 5 种数据类型来满足您的需求。
您还可以如下方式识别键:
Set schedule: id 1
对于多个 set
和 get
操作,请使用 mset
和 mget
命令。我将不再深入介绍命令。您可以随时查阅文档并随意尝试。
幕后
到目前为止我们所做的很棒,而且开箱即用。但其背后,Redis 客户端通过 Redis 协议将命令发送到服务器。服务器在内存中的数据上执行命令,并将响应发送回来。
仅此而已,没有外键,没有索引,没有表,甚至没有文档。当然,您可以更进一步,将数据存储在磁盘上,但我在这里不介绍。
Redis 作为服务
您可以在物理机、虚拟机或云服务上使用 Redis。许多提供商,如 Digital Ocean 和最近的 Windows Azure,都提供此服务。我们将选择 Digital Ocean(主要是因为价格,而且我认为 Azure 上的 Redis 服务有点贵),并从中进行设置。
要连接到 Digital Ocean,我们使用 PuTTY 通过 SSH(安全的连接方式)。下载 PuTTY 并配置您从创建的 DO Droplet(这是您在 DO 上创建的 Linux 机器)获得的 IP 地址。然后打开 PuTTY,使用 root 帐户和您从 DO 获取的密码登录。为确保您的 Linux 机器是最新的,请运行以下命令:apt-get update
(Linux 用户现在该兴奋了!!!!)
现在您应该已经更新了。然后执行 apt-get install build-essential
来获取您的 Linux 服务器可能缺失的任何实用程序。您就完成了。还有更详细的分步博客可以参考。我必须承认,我花了些力气才把所有东西都设置好,因为我对 Linux 世界不太熟悉。
在 Visual Studio 中
在您的本地开发环境中,添加一个 MVC 项目,并使用 NuGet 包管理器添加 Servicestack.redis。有了它,您就拥有了连接到 Redis 的方式,并可以开始做一些有趣的事情了。
要在控制器中访问 Redis 并获取缓存对象的列表,您需要执行以下操作:
using(IRedisClient client = RedisClient)
{
var scheduleClient= client.GetTypedClient<Schedule>();
var schedules = scheduleClient.GetAll();
}
即使对象很多,这也是一个极快的操作。缓存现成可用的数据到 Redis 是个好主意,以便在可能的情况下避免业务处理(应用规则和规范或其他过滤和格式化)。
多次往返数据库以获取一些(总是相同的)对象是另一个适合使用 Redis 的场景。总的来说,我们过去在仓库(repository)中缓存的所有东西(查阅缓存仓库模式以获取更多详细信息)都可以放到 Redis 中。这样,您就可以快速,非常快速地获得结果,从而提高 Web 应用程序的整体性能。
请注意,scheduleClient
将暴露许多用于添加、追加、删除和使用列表、哈希等的函数。您可以尝试探索更多……
您还可以设置您的 Redis 客户端,以便(无需 Glimpse -;)了解后台发生的事情,只需添加:monitor command
(在最初添加 azul 条目的地方)。
在我结束之前,我还有一件事应该提到,以免那些反“Hello World”式应用程序风格(我承认我就是其中之一!)的战士们跳起来:不建议从控制器直接访问数据库(无论是 Redis!),如果这听起来很奇怪,我认为您需要阅读一些关于设计和架构的内容。我不理解那些微软讲师,他们教导用户,添加一个 MVC 项目就准备好构建一个出色的业务 Web 应用程序了。事实并非如此。
然而,这里有一个如何添加对象的示例,在这个例子中是 schedule(日程):
//domain object
public class Schedule
{
public int Id {get; set;}
public string Origin {get; set;}
public string Destination {get; set;}
}
using(IRedisClient client = RedisClient)
{
var scheduleClient= client.GetTypedClient<Schedule>();
var schedule= new Schedule
{
Id= scheduleClient.GetNextSequence(),
Origin ="Montreal",
Destination = "Quebec"
}
var schedules = scheduleClient.Store(schedule);
}
由于 Redis 是一个缓存服务,可以通过设置超时来使某个条目过期。您甚至可以通过删除超时来撤销此操作。
这只是一个关于 Redis 的入门教程,为您提供了一种可能的方式来提高 Web 应用程序的性能。在某些情况下,Redis 可以为您带来客户或老板可能忽略的、对您构建可靠软件的热情的认可。
希望这对您有所帮助!