一.介绍
在现代 Web 应用程序中,性能和可扩展性至关重要。提高性能的有效方法之一是使用缓存。Memcached 是一种开源、高性能、分布式内存缓存系统,被广泛使用。本文将引导您在 C# ASP.NET MVC 项目中实现 Memcached。
二.什么是 Memcached?
Memcached 是一个分布式内存对象缓存系统,旨在通过减少数据库负载来加速动态 Web 应用程序。它将数据存储在内存中,与从数据库检索数据相比,访问速度更快。
三.使用示例
假设有一个拥有大量产品目录的电子商务网站。每次用户搜索产品时,应用程序都会查询数据库,由于数据量大且查询复杂,查询速度可能会很慢。通过使用 Memcached,应用程序可以缓存常见查询的结果。当用户搜索经常请求的产品时,应用程序会从 Memcached 而不是数据库中检索数据,从而大大缩短响应时间。
四.Memcached 如何工作?
- 内存数据存储: Memcached 将数据直接存储在内存 (RAM) 中,与传统的基于磁盘的存储选项(例如数据库或文件系统)相比,其访问速度明显更快。这种方法允许近乎即时地检索缓存数据,从而大大提高需要快速访问常用信息的应用程序的性能。通过利用内存存储的速度,Memcached 有助于减少延迟并增强整体用户体验。
- 分布式架构: Memcached 的分布式架构使其能够部署在多台服务器上,从而创建强大且可扩展的缓存解决方案。此设置允许 Memcached 高效处理大量数据,同时提供容错能力。如果发生服务器故障,Memcached 的分布式特性可确保集群中的其他服务器能够继续不间断地处理请求。这种冗余和可扩展性使 Memcached 成为高可用性环境的理想选择。
- 键值存储:从本质上讲,Memcached 是一个简单的键值存储。数据使用唯一键存储,然后可以使用该键快速检索相关值。这种简单的机制是 Memcached 速度快、效率高的主要原因。键值存储模型的简单性降低了开销和复杂性,实现了快速的数据访问和管理,这对于需要高性能缓存解决方案的应用程序尤其有利。
- 缓存驱逐策略: Memcached 采用 LRU 驱逐策略来帮助管理内存。LRU 策略用于在缓存已满时删除最近最少使用的项目,以便为新数据腾出空间。通过使用此方法,只有相关且经常访问的信息才会保留在内存中,从而提高其效率和功效。通过不断控制内存使用量,即使数据集不断扩大并随时间变化,Memcached 也能发挥最佳性能。
五.Memcached 的使用案例
- 数据库查询缓存:缓存昂贵的数据库查询的结果可以显著减少获取不经常更改的数据所需的时间。
- 会话存储:将会话数据存储在 Memcached 中可提高用户身份验证和会话管理过程的性能。
- API 响应缓存:通过缓存 API 响应,应用程序可以避免冗余调用并减少延迟,从而提高整体性能。
页面缓存:对于动态网站,缓存整个页面或页面片段可以大大加快页面加载时间。 - 对象缓存:可以缓存经常访问的对象,例如用户配置文件或配置设置,以最大限度地减少数据库访问并提高效率。
六.设置 Memcached 服务器
按照以下步骤在您的系统上设置 Memcached 服务器。
步骤 1.安装
要安装 WSL(Windows 子系统 Linux),请在命令提示符中按照以下命令操作。
sudo apt update
sudo apt install memcached
步骤 2. 运行 Memcached 服务器
要在 WSL 上运行 Memcached 服务器,请在命令提示符中输入以下命令。
memcached
步骤 3.检查 Memcached 的状态
要检查 Memcached 的状态,请在命令提示符中输入以下命令。
ps aux | grep memcached
现在,我们已经设置了 Memcached 服务器,是时候在我们的项目中设置 Memcached 了。
七.在 ASP.NET MVC 项目中设置 Memcached
您可以在新项目中进行设置,也可以创建一个新项目来设置 Memcached。
步骤 1. 添加 Memcached 客户端库
要使用 Memcached,我们需要一个客户端库。“EnyimMemcached” 是一个流行的选择。因此,我们将在我们的项目中使用它。
现在,让我们在我们的项目中安装这个包。
- 单击“项目”并选择“管理 NuGet 包”。
- 在“浏览”中,在搜索框中输入“EnyimMemcached”。
- 选择它并单击“安装”。
- 将会打开一个弹出窗口,单击“我接受”。安装后,它将显示在依赖项下的包中。
步骤 2.配置 Memcached 客户端
在 program.cs 文件中,添加以下代码
builder.Services.AddEnyimMemcached(options =>
{
options.AddServer("localhost", 11211);
...
});
您可以将上述内容替换为您的 Memcached 服务器详细信息,如果您有 Memcached 集群,还可以添加更多服务器。此配置指定 Memcached 服务器在本地主机上运行并监听端口“11211”。
步骤 3. 初始化和使用 Memcached
添加以下使用语句。
using Enyim.Caching;
using Enyim.Caching.Memcached;
现在,在构造函数中添加以下代码。
private readonly IMemcachedClient _memcachedClient;
public EmployeeController(IMemcachedClient memcachedClient)
{
.....
_memcachedClient = memcachedClient;
}
在此代码片段中,我定义了一个私有的只读字段“_memcachedClient”,用于处理 Memcached。在“EmployeeController”构造函数中,我注入了一个“IMemcachedClient”实例并将其分配给此字段,确保控制器可以使用缓存服务。
步骤 4. 在控制器中实现缓存
[HttpGet]
public async Task<IActionResult> AllEmployees()
{
try
{
var cachedResult = await _memcachedClient.GetAsync<List<Employees>>("AllEmployees");
List<Employees> employeeList;
if (cachedResult == null || cachedResult.Message == "Not found")
{
using (SqlConnection con = new SqlConnection(_connectionString))
{
await con.OpenAsync();
var result = await con.QueryAsync<Employees>("GetEmployees", commandType: CommandType.StoredProcedure);
employeeList = result.ToList();
await _memcachedClient.StoreAsync(StoreMode.Set, "AllEmployees", employeeList, TimeSpan.FromMinutes(10));
}
}
else
{
employeeList = cachedResult.Value;
}
return View(employeeList);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
return RedirectToAction("Index", "Home");
}
}
当请求获取所有员工时,我首先检查数据是否已缓存在 Memcached 中。这是使用“_memcachedClient.GetAsync<List>(“AllEmployees”)”完成的。如果缓存为空或表示未找到数据,则连接到 SQL Server。我打开一个连接并执行名为“GetEmployees”的存储过程以从数据库中检索员工数据。获得员工列表后,我将这些数据存储在缓存中,并设置 10 分钟的过期时间,以提高未来请求的性能。
如果在缓存中找到数据,我将跳过数据库查询并直接使用缓存列表。最后,我将员工列表返回到视图以供显示。如果在此过程中发生任何错误,我将捕获异常,将错误消息记录到控制台,并将用户重定向到主页以妥善处理问题。
八.结论
将 Memcached 集成到您的 C# ASP.NET MVC 项目中可以通过减少数据库负载和提供快速数据访问来显著提高应用程序性能。通过遵循本文概述的步骤,您可以在项目中有效地设置和使用 Memcached。在这里,我仅展示了基本功能,但您可以扩展它并根据自己的需要使用它。