C#常见的数据缓存方式详解与实例

在C#开发中,数据缓存是一种优化应用程序性能的常见技术。合理的缓存策略可以减少对数据源的访问次数,提高数据处理速度,从而改善用户体验。下面将详细介绍几种在C#中常见的数据缓存方式,以及相应的实例。

1. 使用System.Runtime.Caching命名空间

.NET Framework 4.0 引入了 System.Runtime.Caching 命名空间,它提供了一个简单的缓存机制。这个缓存是基于内存的,并且提供了缓存的添加、获取、移除和清除等基础操作。

示例

using System.Runtime.Caching;// 创建缓存
MemoryCache cache = new MemoryCache("MyCache");// 设置缓存项
CacheItemPolicy policy = new CacheItemPolicy();
policy.AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(30);cache.Set("key", "value", policy);// 获取缓存项
string result = (string)cache.Get("key");// 移除缓存项
cache.Remove("key");// 清空缓存
cache.Dispose();

2. 使用System.Web.Caching命名空间

对于Web应用程序,System.Web.Caching 提供了基于应用程序池的缓存机制。它适合于存储大量数据,并可以设置缓存生存期。

示例

using System.Web.Caching;// 设置缓存
Cache cache = HttpRuntime.Cache;
cache.Insert("key", "value", null, Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(30), CacheItemPriority.High, null);// 获取缓存项
string result = (string)cache["key"];// 移除缓存项
cache.Remove("key");// 清空缓存
// 注意:这将清空整个应用程序的缓存
HttpRuntime.Cache.Clear();

3. 使用StackExchange.Redis库

对于需要分布式缓存解决方案的场景,可以使用第三方库如StackExchange.Redis来连接Redis数据库,实现高速缓存服务。

示例
首先,在packages.config中添加StackExchange.Redis的NuGet包引用:

<package id="StackExchange.Redis" version="2.0.616" targetFramework="net461" />

然后,使用以下代码连接到Redis并设置缓存:

using StackExchange.Redis;// 连接到Redis
ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost");
IDatabase db = redis.GetDatabase();// 设置缓存项
db.StringSet("key", "value", DateTimeOffset.UtcNow.AddMinutes(30));// 获取缓存项
string result = db.StringGet("key");// 移除缓存项
db.KeyDelete("key");

4. 使用Microsoft.Extensions.Caching.Memory(.NET Core)

在.NET Core中,可以使用Microsoft.Extensions.Caching.Memory命名空间来创建内存缓存。

示例
首先,安装Microsoft.Extensions.Caching.Memory NuGet包:

dotnet add package Microsoft.Extensions.Caching.Memory

然后,使用以下代码设置缓存:

using Microsoft.Extensions.Caching.Memory;IMemoryCache cache = new MemoryCache(new MemoryCacheOptions());// 设置缓存项,并指定过期时间
cache.Set("key", "value", new MemoryCacheEntryOptions().SetAbsoluteExpiration(TimeSpan.FromMinutes(30)));// 获取缓存项
string result = cache.Get<string>("key");// 移除缓存项
cache.Remove("key");

5. 使用Microsoft.Extensions.Caching.Distributed(.NET Core)

对于分布式缓存需求,.NET Core提供了Microsoft.Extensions.Caching.Distributed命名空间,它支持连接到各种分布式缓存提供者,如Redis、Memcached等。

示例
首先,安装Microsoft.Extensions.Caching.Distributed和StackExchange.Redis NuGet包:

dotnet add package Microsoft.Extensions.Caching.Distributed
dotnet add package StackExchange.Redis

然后,配置Redis连接字符串并在Startup.cs中设置分布式缓存:

public void ConfigureServices(IServiceCollection services)
{// 配置Redis连接字符串services.AddStackExchangeRedisCache(options =>options.Configuration = "localhost");// 添加其他服务...
}public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{// 配置中间件...
}

在应用程序中使用分布式缓存:

using Microsoft.Extensions.Caching.Distributed;IDistributedCache cache = app.ApplicationServices.GetRequiredService<IDistributedCache>();// 设置缓存项,并指定过期时间
var options = new DistributedCacheEntryOptions().SetAbsoluteExpiration(TimeSpan.FromMinutes(30));
cache.Set("key", "value", options);// 获取缓存项
string result = cache.GetString("key");// 移除缓存项
cache.Remove("key");

6. 自定义缓存

除了使用内置和第三方库提供的缓存机制外,还可以自定义缓存实现特定的需求。例如,使用ConcurrentDictionary来创建一个简单的线程安全的缓存。

示例

using System.Collections.Concurrent;ConcurrentDictionary<string, string> cache = new ConcurrentDictionary<string, string>();// 设置缓存项
cache[“key”] =value;// 获取缓存项
string result;
if (cache.TryGetValue("key", out result))
{// 使用缓存值
}// 移除缓存项
cache.TryRemove("key", out _);

7. 使用 ASP.NET Core 的分布式缓存

ASP.NET Core 提供了对分布式缓存的支持,可以通过配置来实现。

示例:

public void ConfigureServices(IServiceCollection services)
{services.AddDistributedMemoryCache();// 或者添加其他缓存提供者,如 Redisservices.AddStackExchangeRedisCache(options =>{options.ConnectionString = "localhost";});
}

8. 使用 CacheBuilder

在 .NET 5+ 中,可以使用 System.Runtime.Caching.Memory 命名空间中的 CacheBuilder 类来创建缓存。

示例:

using System.Runtime.Caching;CacheBuilder<string, string> cacheBuilder = CacheBuilder.Instance;
cacheBuilder.SetExpiration(ExpirationMode.Absolute, TimeSpan.FromMinutes(10));
var cache = cacheBuilder.Build();// 设置缓存项
cache.Set("myCacheKey", "缓存的数据");// 获取缓存项
var cachedData = cache.Get("myCacheKey");

在实现自定义缓存时,需要注意缓存的一致性、并发性和过期策略等。

缓存的最佳实践

  • 缓存策略:根据数据的访问模式和重要性选择合适的缓存策略。
  • 缓存大小:限制缓存的大小以避免内存溢出。
  • 缓存过期:合理设置缓存的过期时间,以避免过时的数据被访问。
  • 数据一致性:确保缓存数据与原始数据的一致性,考虑使用缓存标记(cache tags)和缓存刷新策略。
  • 监控和调优:定期监控缓存性能,根据实际应用情况进行调优。

总结

在C#中实现数据缓存有多种方式,开发者可以根据应用程序的需求和运行环境选择合适的缓存策略。无论是内存缓存、分布式缓存还是自定义缓存,合理地使用缓存都能显著提高应用程序的性能和用户体验。在实际应用中,需要根据数据的访问模式、更新频率和系统资源等因素,设计最优的缓存方案。

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

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

相关文章

C 头文件

头文件是扩展名为 .h 的文件&#xff0c;包含了 C 函数声明和宏定义&#xff0c;被多个源文件中引用共享。有两种类型的头文件&#xff1a;程序员编写的头文件和编译器自带的头文件。 在程序中要使用头文件&#xff0c;需要使用 C 预处理指令 #include 来引用它。前面我们已经…

基于一阶微分的图像增强-梯度法(不丢弃任何像素变化--信息的提取作用)

首先我大致说一下前一小节的内容&#xff1a;反锐化掩模与高提升滤波处理 图像的锐化方法&#xff0c;其实有很多。锐化的定义提升突变像素的灰度级&#xff0c;减少变化缓慢像素的灰度级。 为什么可以利用模糊图像来进行锐化呢&#xff1f;因为模糊图像的模糊位置通常都是原…

第十二篇-jQuery理论

jQuery定义 jQuery是一个快速、简洁的JavaScript库&#xff0c;它能够简化HTML文档遍历、事件处理、动画设计和Ajax交互。jQuery的设计目标是通过尽可能少的代码实现更多的功能&#xff0c;并且提供一种优雅的方式来处理HTML文档、处理事件、创建动画效果以及实现Ajax交互。. …

《前端防坑》- JS基础 - 你觉得Boolean(‘false‘) === false吗?

问题 你觉得Boolean(false) false吗&#xff0c; Boolean([]) false吗&#xff1f; 答案 Boolean(false) true, Boolean([]) true 验证 原因 Boolean 对象表示两个值&#xff1a;"true" 或 "false" 但是能使Boolean为flase的只有6种情况&#xff…

科技的成就(五十八)

543、神经网络应用于机器翻译 2003 年 2 月&#xff0c;神经网络开始应用于机器翻译。约书亚本吉奥等发表论文“A Neural Probabilistic Language Model”。他们的研究团队基于神经网络开发出了一个语言模型&#xff0c;改善了统计机器翻译中的问题&#xff0c;这项研究为未来神…

嵌入式单片机入职第二天-EEPROM与IIC

上午&#xff1a; 1.安装Jlink驱动&#xff0c;死活没反应&#xff0c;因为昨天才装完系统&#xff0c;领导让我装电脑主板驱动 领导方法进惠普官网通过查询电脑型号&#xff0c;里面几十个驱动搞得我眼花&#xff0c;领导告诉我进官网就去开会了&#xff0c;可能因为是外网&…

idea如何debug看springsecurity的过滤器顺序

idea如何debug看springsecurity的过滤器顺序 先配置一个Spring启动对象,后续需要根据这个对象来获取SpringSecurity的过滤器链 设置一个输出信息&#xff0c;需要在输出信息这里打上断点&#xff0c;才方便查看过滤器链 public static void main(String[] args) {//此时不…

Qt | 信号与槽 原理、连接、断开(面试无忧)

1、信号和槽是用于对象之间的通信的,这是 Qt 的核心。为此 Qt 引入了一些关键字,他们是slots、signals、emit,这些都不是 C++关键字,是 Qt 特有的,这些关键字会被 Qt 的 moc转换为标准的 C++语句。 2、Qt 的部件类中有一些已经定义好了的信号和槽,通常的作法是子类化部件…

yolov5旋转目标检测遥感图像检测-无人机旋转目标检测(代码和原理)

YOLOv5&#xff08;You Only Look Once version 5&#xff09;是一个流行且高效的实时目标检测深度学习模型&#xff0c;最初设计用于处理图像中的水平矩形边界框目标。然而&#xff0c;对于旋转目标检测&#xff0c;通常需要对原始YOLOv5架构进行扩展或修改&#xff0c;以便能…

达梦数据库安装教程

达梦数据库安装包与常规的数据库安装逻辑一致。 下载安装包 首先&#xff0c;您需要从达梦官方网站下载适用于您的操作系统的达梦数据库安装包&#xff08;这一步要注意区分硬件芯片类型。请注意&#xff0c;选择与您的操作系统和硬件平台相匹配的安装包&#xff0c;以免在安…

ChatGPT之道:发掘AI工具在论文写作中的妙用

ChatGPT无限次数:点击直达 ChatGPT之道&#xff1a;发掘AI工具在论文写作中的妙用 随着人工智能技术的快速发展&#xff0c;ChatGPT作为一款先进的自然语言处理工具&#xff0c;在各个领域展现出了非凡的潜力。本文将探讨ChatGPT在论文写作中的应用&#xff0c;以及如何利用其…

Imagination APXM-6200 CPU:性能卓越,安全可信

随着消费类和工业应用行业的不断发展&#xff0c;对创新性能和效率的需求永不停歇&#xff0c;我们自豪地推出旗下 Catapult CPU 系列的第二款产品&#xff1a;Imagination APXM-6200 CPU 。这款 64 位的高效 RISC-V 应用处理器具有强大的 AI 功能及性能密度&#xff0c;能够为…

阿里云服务器项目部署docker-compose+vue+redis+nginx+minio+springboot

1 阿里云服务器项目部署-单机部署 docker-compose 1.1 搭建背景 服务器 阿里云服务器 前端 vue 后端 springboot 服务 redis 、nginx、minio 都做单机模式部署,不做集群部署 博客内容参考了其他博文&#xff0c;会贴出来 1.2 <重要>端口开放前提说明 任何开放的端…

【迅为iTOP-4412-linux 系统制作(4)】ADB 或者 TF 卡烧写测试

准备工作 编译生成的内核镜像uImage 和设备树 dtb 文件“exynos4412-itop-elite.dtb”已经可以使用了。 把编译生成的uimage和dtb文件。拷贝fastboot工具。官方的u-boot-iTOP-4412.bin 也拷贝到 platform-tools 文件夹目录内。system.img 也拷贝到 platform-tools 文件夹目录…

11 nacos 的 配置获取 和 服务注册

前言 nacos 在微服务体系中有两大个功能, 作为配置中心 和 服务发现 最近碰到了一些 nacos 的相关问题, 整理了一下 这方面的东西 nacos client 的配置读取 这一系列主要是在 NacosManager 这个 bean 的相关业务流程的过程中处理的 NacosManager 初始化的时候, 会向 naco…

iOS 二进制重排

原理&#xff1a;减少page fault次数&#xff0c;将启动用到的代码都放到一个page里。 操作&#xff1a; 统计启动过程中用到的函数。 http://yulingtianxia.com/blog/2019/09/01/App-Order-Files/ Other C flag里加上-fsanitize-coveragefunc,trace-pc-guard&#xff0c;C/C…

力扣HOT100 - 48. 旋转图像

解题思路&#xff1a; 要求原地旋转 可以先上下翻转&#xff0c;再沿主对角线反转&#xff08;左上到右下的对角线&#xff09; class Solution {public void rotate(int[][] matrix) {int n matrix.length;// 上下翻转for (int i 0; i < n / 2; i) {for (int j 0; j &…

软考学习之路-系统集成项目管理工程师-考试要点记录1

软考学习之路-系统集成项目管理工程师-考试要点记录 前言介绍必考知识点1、项目管理五大过程组启动过程组规划规程组执行过程组监控过程组收尾过程组 2、项目整合管理3、项目范围管理4、项目时间管理5、项目成本管理6、项目质量管理7、人力资源管理8、项目沟通管理9、项目风险管…

YOLOv9最新改进系列:YOLOv9融合BoTNet模块,融合CNN+自然语言处理技术的优势,有效提升检测效果!

YOLOv9最新改进系列&#xff1a;YOLOv9融合BoTNet模块&#xff0c;融合CNN自然语言处理技术的优势&#xff0c;有效提升检测效果&#xff01; YOLOv9原文链接戳这里&#xff0c;原文全文翻译请关注B站Ai学术叫叫首er B站全文戳这里&#xff01; 详细的改进教程以及源码&…

LangChain - LLMs

文章目录 一、LLMs vs 聊天模型二、入门1、设置 OpenAI2、__call__: string in -> string out3、generate: batch calls, richer outputs 三、异步 API四、Custom LLM五、Fake LLM六、Human input LLM七、缓存 llm_caching1、内存缓存&#xff08;In Memory Cache&#xff0…