如何在 C# ASP.NET MVC 项目中实现 Memcached?

news2024/11/14 23:24:36

一.介绍

在现代 Web 应用程序中,性能和可扩展性至关重要。提高性能的有效方法之一是使用缓存。Memcached 是一种开源、高性能、分布式内存缓存系统,被广泛使用。本文将引导您在 C# ASP.NET MVC 项目中实现 Memcached。

二.什么是 Memcached?

Memcached 是一个分布式内存对象缓存系统,旨在通过减少数据库负载来加速动态 Web 应用程序。它将数据存储在内存中,与从数据库检索数据相比,访问速度更快。

三.使用示例

假设有一个拥有大量产品目录的电子商务网站。每次用户搜索产品时,应用程序都会查询数据库,由于数据量大且查询复杂,查询速度可能会很慢。通过使用 Memcached,应用程序可以缓存常见查询的结果。当用户搜索经常请求的产品时,应用程序会从 Memcached 而不是数据库中检索数据,从而大大缩短响应时间。

四.Memcached 如何工作?

  1. 内存数据存储: Memcached 将数据直接存储在内存 (RAM) 中,与传统的基于磁盘的存储选项(例如数据库或文件系统)相比,其访问速度明显更快。这种方法允许近乎即时地检索缓存数据,从而大大提高需要快速访问常用信息的应用程序的性能。通过利用内存存储的速度,Memcached 有助于减少延迟并增强整体用户体验。
  2. 分布式架构: Memcached 的分布式架构使其能够部署在多台服务器上,从而创建强大且可扩展的缓存解决方案。此设置允许 Memcached 高效处理大量数据,同时提供容错能力。如果发生服务器故障,Memcached 的分布式特性可确保集群中的其他服务器能够继续不间断地处理请求。这种冗余和可扩展性使 Memcached 成为高可用性环境的理想选择。
  3. 键值存储:从本质上讲,Memcached 是一个简单的键值存储。数据使用唯一键存储,然后可以使用该键快速检索相关值。这种简单的机制是 Memcached 速度快、效率高的主要原因。键值存储模型的简单性降低了开销和复杂性,实现了快速的数据访问和管理,这对于需要高性能缓存解决方案的应用程序尤其有利。
  4. 缓存驱逐策略: Memcached 采用 LRU 驱逐策略来帮助管理内存。LRU 策略用于在缓存已满时删除最近最少使用的项目,以便为新数据腾出空间。通过使用此方法,只有相关且经常访问的信息才会保留在内存中,从而提高其效率和功效。通过不断控制内存使用量,即使数据集不断扩大并随时间变化,Memcached 也能发挥最佳性能。

五.Memcached 的使用案例

  1. 数据库查询缓存:缓存昂贵的数据库查询的结果可以显著减少获取不经常更改的数据所需的时间。
  2. 会话存储:将会话数据存储在 Memcached 中可提高用户身份验证和会话管理过程的性能。
  3. API 响应缓存:通过缓存 API 响应,应用程序可以避免冗余调用并减少延迟,从而提高整体性能。
    页面缓存:对于动态网站,缓存整个页面或页面片段可以大大加快页面加载时间。
  4. 对象缓存:可以缓存经常访问的对象,例如用户配置文件或配置设置,以最大限度地减少数据库访问并提高效率。

六.设置 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” 是一个流行的选择。因此,我们将在我们的项目中使用它。

现在,让我们在我们的项目中安装这个包。

  1. 单击“项目”并选择“管理 NuGet 包”。
  2. 在“浏览”中,在搜索框中输入“EnyimMemcached”。
  3. 选择它并单击“安装”。
  4. 将会打开一个弹出窗口,单击“我接受”。安装后,它将显示在依赖项下的包中。

步骤 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。在这里,我仅展示了基本功能,但您可以扩展它并根据自己的需要使用它。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1940011.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot面试高频总结01

1. 什么是SpringBoot&#xff1f; SpringBoot是一个基于Spring框架的快速开发框架&#xff0c;它采用约定大于配置&#xff0c;自动装配的方式&#xff0c;可以快速地创建独立的&#xff0c;生产级别的&#xff0c;基于Spring的应用程序。 相比于传统的Spring框架&#xff0c;S…

真实测评,霍尼韦尔、希喂、352宠物空气净化器性能对比

在快节奏的社会生活中&#xff0c;人们越来越注重精神需要&#xff0c;许多年轻人纷纷选择拥抱宠物&#xff0c;作为生活中的温馨伴侣。宠物们治愈心灵的同时也要付出一定“代价”&#xff0c;日常养护&#xff0c;如清理猫毛、管理气味以及保持宠物环境的清洁&#xff0c;都是…

Agent类型解析:AIGC在不同领域的应用与影响

目录 引言 垂直智能体&#xff08;Vertical Agent&#xff09; 水平智能体&#xff08;Horizontal Agent&#xff09; 混合智能体&#xff08;Hybrid Agent&#xff09; 结论 引言 在人工智能&#xff08;AI&#xff09;领域&#xff0c;智能体&#xff08;Agent&#xf…

更加深入Mysql-04-MySQL 多表查询与事务的操作

文章目录 多表查询内连接隐式内连接显示内连接 外连接左外连接右外连接 子查询 事务事务隔离级别 多表查询 有时我们不仅需要一个表的数据&#xff0c;数据可能关联到俩个表或者三个表&#xff0c;这时我们就要进行夺标查询了。 数据准备&#xff1a; 创建一个部门表并且插入…

JavaWeb day01-HTML入门

Web前端 课程安排 HTML、CSS简介 HTML快速入门 实现标题排版 新闻标题样式

Docker核心技术:Docker的基本使用

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 Docker核心技术 系列文章&#xff1a;Docker的基本使用&#xff0c;其他文章快捷链接如下&#xff1a; 应用架构演进容器技术要解决哪些问题Docker的基本使用&#xff08;本文&#xff09;Docker是如何实现的 3…

Spark调优特殊case- Task倾斜

首先我们观察下上面的stage5, Task MaxTime2.4Min, 但是stage5的整体耗时竟然可以达到55Min, 其实分区1000&#xff0c; 300个executor&#xff0c; 按照最大的TaskTime2.4Min来估算所有Task运行完成时间, 那么时间应该是- 2.4Min * 3 2.4Min 9.6Min 也就是最慢也就跑10分钟就…

【时时三省】(C语言基础)函数和数组

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ——csdn时时三省 函数 跟数学里面的函数很相似 数组 一组相同类型的元素的集合 比如把5个整形1-5存起来 int arr&#xff3b;10&#xff3d;&#xff1d;&#xff5b;1&#xff0c;2&#xff0c;3&#x…

StyleGAN——定制人脸生成思路

定制人脸生成思路 控制生成码 ( Z ) 的分布范围&#xff1a;适合粗略控制生成图像的主要特征&#xff08;如性别、人种、年龄&#xff09;&#xff0c;方法简单但精度较低。特定维度特征的替换&#xff1a;适用于细致控制图像的特征&#xff08;如皮肤颜色、发型&#xff09;&…

贪吃蛇超精讲(C语言)

前言 如果你还是个萌新小白&#xff0c;那么该项目的攻克过程一定会十分艰难。虽然作者已经将文章尽可能写的逻辑清晰&#xff0c;内容详细。但所谓“纸上得来终觉浅”&#xff0c;在讲到陌生结构和函数时&#xff0c;大家请一定自己动手去敲一遍代码&#xff0c;这很重要&…

Opencv学习项目3——人脸识别

之前我们获取了一张图像的人脸信息&#xff0c;现在我们来使用特征点分析来匹配两张lyf照片的相似度 获取两张图片的人脸信息 import cv2 import face_recognition# 加载图像文件 img1 face_recognition.load_image_file(lyf1.png) img2 face_recognition.load_image_file(l…

昇思25天学习打卡营第13天 | 模型训练

深入理解模型训练的关键步骤 在深入学习深度学习模型训练的过程中&#xff0c;我获得了宝贵的经验和理解&#xff0c;尤其是在构建数据集、定义模型、调整超参数以及实际的训练和评估过程中。以下是我对这些关键步骤的一些心得体会。 1. 构建数据集 数据集的构建是模型训练成…

(11)Python引领金融前沿:投资组合优化实战案例

1. 前言 本篇文章为 Python 对金融的投资组合优化的示例。投资组合优化是从一组可用的投资组合中选择最佳投资组合的过程&#xff0c;目的是最大限度地提高回报和降低风险。 投资组合优化是从一组可用的投资组合中选择最佳投资组合的过程&#xff0c;目的是最大限度地提高回报…

第四周:机器学习笔记

第四周学习周报 摘要Abstract机器学习任务攻略1.loss on training data1.1 training data的loss过大怎么办&#xff1f;1.2 training data的loss小&#xff0c;但是testing data loss大怎么办&#xff1f; 2. 如何选择一个中最好的模型&#xff1f;2.1 Cross Validation&#x…

前端调试技巧:动态高亮渲染区域

效果&#xff1a; 前端界面的渲染过程、次数&#xff0c;会通过高亮变化来显示&#xff0c;通过这种效果排除一些BUG 高亮 打开方式 F12进入后点击ESC&#xff0c;进入rendering&#xff0c;选择前三个即可&#xff08;如果没有rendering&#xff0c;点击橘色部分勾选上&…

docker compose 容器 编排分组

遇到问题&#xff1a;执行docker compose up -d 后docker compose 创建的容器们 在desktop-docker 中都在docker下一堆 搜索想着能不能把这个docker名字改一下&#xff0c;但是都没有找到这样的一个方案&#xff1b; 最后发现&#xff0c;我执行docker compose up -d 命令所在…

昇思25天学习打卡营第26天 | GAN图像生成

学习心得&#xff1a;GAN 图像生成 在最近完成的项目中&#xff0c;我利用生成对抗网络&#xff08;GAN&#xff09;进行了图像生成的实践学习。通过这一过程&#xff0c;我不仅加深了对GAN的理解&#xff0c;而且对于深度学习在图像处理领域的应用有了更实际的把握。以下是我…

Android屏幕适配度量单位px、ppi、dpi、dp、sp等

目录 0 前言1 屏幕尺寸2 像素 px3 分辨率4 每英寸像素数ppi5 屏幕密度 dpi6 密度无关像素 dp7 缩放无关像素sp 0 前言 我以iphone13举例&#xff0c;说来挺有意思&#xff0c;我们这做Android开发的只有一位平常用的是Android手机。 可以看到下面有6.1英寸、分辨率、ppi等。接…

MQTT micro-ROS:构建高效的机器人应用

什么是 micro-ROS&#xff1f; 在之前的 MQTT & FreeRTOS&#xff1a;打造你的远程控制实时应用 中&#xff0c;我们介绍了如何在 FreeRTOS 中构建你的 MQTT 应用。 FreeRTOS 主要应用在对实时性要求较高的场景中&#xff0c;但这类 RTOS 专注于提供实时任务调度和同步机…

使用Vuepress搭建个人网站

网站地址&#xff1a;bloggo.chat