不想引入Redis,你可以试试MemoryCache实现内存缓存

[系统运维] 时间:2025-11-05 11:25:04 来源:益强IT技术网 作者:域名 点击:104次

System.Runtime.Caching库是不想.NET 4.0引入的缓存库,用于提高应用程序性能。引入它提供了一组API,试试e实用于在内存中存储、现内检索和管理缓存对象,存缓存并包括一些高级功能,不想如回调和过期策略等。引入在.NET 7.0中,试试e实System.Runtime.Caching库进行了进一步改进和优化,现内可用于实现不同级别的存缓存缓存管理。下面我们对其进行详细介绍和分类。不想

以下是引入System.Runtime.Caching库按照不同的功能和用途进行分类,并附有源代码剖析:

System.Runtime.Caching库的试试e实适用场景

System.Runtime.Caching库适用于需要在应用程序中实现内存缓存的场景。以下是现内一些常见的使用场景:

数据库查询结果的缓存:在数据库查询时,如果查询结果重复使用的存缓存概率较高,可以使用MemoryCache类将结果缓存到内存中,减少对数据库的访问次数,提高性能。频繁读取的配置信息:在应用程序中,一些配置信息需要频繁读取,这些配置信息可以通过MemoryCache类缓存起来,云南idc服务商提高应用程序的响应速度。网络请求响应的缓存:在网络请求中,如果某个请求的响应结果较为稳定,可以使用MemoryCache类将响应结果缓存到内存中,提高响应速度和吞吐量。预先加载静态资源:在Web应用程序中,某些静态资源(如CSS、JS等)需要在应用程序启动时预先加载,这些资源可以使用MemoryCache类进行缓存,提高页面渲染速度。业务逻辑计算结果的缓存:在某些业务逻辑中,需要频繁进行计算,如果计算结果稳定,可以使用MemoryCache类缓存计算结果,提高计算速度。

System.Runtime.Caching库的优缺点

System.Runtime.Caching是Microsoft提供的内存缓存方案,封装了一组用于管理缓存的API。它使用MemoryCache类来实现内存缓存,可以用于单个应用程序域或分布式系统中。以下是System.Runtime.Caching的优缺点:

优点:

高性能:System.Runtime.Caching使用内存缓存,相比于其他持久化缓存方案,具有更高的读写速度和更低的亿华云计算响应延迟。简单易用:System.Runtime.Caching提供了易于使用的API,可以方便地创建、访问和管理内存缓存,适用于各种.NET应用程序。可扩展性:System.Runtime.Caching支持多种缓存项过期策略、缓存项优先级和回收策略,可以根据特定需求进行自定义。高可靠性:System.Runtime.Caching支持缓存项压缩、内存监视和回收机制等功能,可以有效提高缓存的可靠性和稳定性。

缺点:

有容量上限:System.Runtime.Caching使用内存缓存,所以缓存的容量受到硬件资源的限制。对于大型的数据集合,需要考虑使用其他缓存方式或增加硬件资源。无法持久化:System.Runtime.Caching只是一个内存缓存方案,不支持将缓存项持久化到磁盘或其他介质中。如果需要实现持久化缓存,需要使用其他缓存方案。可能存在并发访问问题:System.Runtime.Caching默认情况下是线程安全的,但是在高并发环境下,仍然可能存在竞争条件和死锁等问题。需要注意并发访问限制和异常处理。

System.Runtime.Caching库API介绍

System.Runtime.Caching提供了一组用于管理缓存的免费信息发布网API,主要包括以下类型:

MemoryCache类:实现了一个内存缓存,可以用于单个应用程序域或分布式系统中。MemoryCache支持多种缓存项过期策略、缓存项优先级和回收策略,可以根据具体需求进行自定义。常用方法包括Add、Get、Set和Remove等。CacheItem类:表示缓存中的一个项。CacheItem包含缓存键、缓存值和缓存过期策略等属性,可以通过构造函数创建缓存项,也可以通过MemoryCache类的方法管理缓存项。CacheItemPolicy类:表示一个缓存项的过期策略。CacheItemPolicy包含过期时间、优先级、回收处理和缓存移除回调等属性,可以通过构造函数创建缓存项策略,并设置给MemoryCache或CacheItem对象。CacheEntryRemovedArguments类:表示缓存项移除时的参数。CacheEntryRemovedArguments包含了缓存项的键、值、移除原因和移除通知等属性,可以在缓存项移除时进行处理。CacheEntryUpdateArguments类:表示缓存项更新时的参数。CacheEntryUpdateArguments包含了旧的缓存项的键、值和更新通知等属性,可以在缓存项更新时进行处理。CacheEntryChangeMonitor类:表示一个监视缓存项变化的对象。CacheEntryChangeMonitor支持多种变化监视器,例如文件监视器、键依赖监视器和SqlDependency监视器等。MemoryCache类

MemoryCache类是System.Runtime.Caching库中的核心类,它表示一个内存中的缓存集合。MemoryCache类是一个线程安全的、可扩展的、基于键值对的缓存系统。MemoryCache类提供了以下一些方法:

Add(string key, object value, CacheItemPolicy policy):向缓存中添加一个具有指定键和值的缓存项,并使用指定的策略对象指定该缓存项的过期和依赖项信息。Contains(string key):返回一个值,指示指定键是否存在于缓存中。Get(string key):获取指定键的缓存项。Remove(string key):从缓存中移除指定键的缓存项。GetCount():获取当前缓存中的项数。Dispose():释放MemoryCache对象占用的资源。

源代码剖析:

复制[DefaultMember("Item")] public class MemoryCache : ObjectCache, IEnumerable, IDisposable { public MemoryCache(string name, NameValueCollection config = null); public MemoryCache(string name, NameValueCollection config, bool ignoreConfigSection); public override object this[string key] { get; set; } public static MemoryCache Default { get; } public long PhysicalMemoryLimit { get; } public override string Name { get; } public long CacheMemoryLimit { get; } public TimeSpan PollingInterval { get; } public override DefaultCacheCapabilities DefaultCacheCapabilities { get; } // 添加缓存项 public override bool Add(CacheItem item, CacheItemPolicy policy); public override object AddOrGetExisting(string key, object value, DateTimeOffset absoluteExpiration, string regionName = null); public override CacheItem AddOrGetExisting(CacheItem item, CacheItemPolicy policy); public override object AddOrGetExisting(string key, object value, CacheItemPolicy policy, string regionName = null); public override bool Contains(string key, string regionName = null); public override CacheEntryChangeMonitor CreateCacheEntryChangeMonitor(IEnumerable<string> keys, string regionName = null); public void Dispose(); // 获取缓存项 public override object Get(string key, string regionName = null); public override CacheItem GetCacheItem(string key, string regionName = null); public override long GetCount(string regionName = null); public long GetLastSize(string regionName = null); public override IDictionary<string, object> GetValues(IEnumerable<string> keys, string regionName = null); public override object Remove(string key, string regionName = null); // 移除缓存项 public object Remove(string key, CacheEntryRemovedReason reason, string regionName = null); public override void Set(string key, object value, CacheItemPolicy policy, string regionName = null); public override void Set(CacheItem item, CacheItemPolicy policy); public override void Set(string key, object value, DateTimeOffset absoluteExpiration, string regionName = null); public long Trim(int percent); // 遍历缓存 protected override IEnumerator<KeyValuePair<string, object>> GetEnumerator(); }1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41. CacheItem和CacheItemPolicy类

CacheItem表示一个缓存项,包括键、值、过期时间等属性。CacheItemPolicy则表示一个策略对象,用于指定缓存项的一些属性,如过期时间、回收策略、依赖项等。

源代码剖析:

复制public class CacheItem { public CacheItem(string key); public CacheItem(string key, object value); public CacheItem(string key, object value, string regionName); public string Key { get; set; } public object Value { get; set; } public string RegionName { get; set; } } public class CacheItemPolicy { public CacheItemPolicy(); public DateTimeOffset AbsoluteExpiration { get; set; } public Collection<ChangeMonitor> ChangeMonitors { get; } public CacheItemPriority Priority { get; set; } public CacheEntryRemovedCallback RemovedCallback { get; set; } public TimeSpan SlidingExpiration { get; set; } public CacheEntryUpdateCallback UpdateCallback { get; set; } }1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22. CacheEntryChangeMonitor类

CacheEntryChangeMonitor类提供了监视缓存项更改的功能,以便在发生更改时执行回调函数或其他操作。

源代码剖析:

复制public abstract class CacheEntryChangeMonitor : ChangeMonitor { protected CacheEntryChangeMonitor(); public abstract ReadOnlyCollection<string> CacheKeys { get; } public abstract DateTimeOffset LastModified { get; } public abstract string RegionName { get; } }1.2.3.4.5.6.7.8.

缓存对象的管理方式

过期策略

过期策略用于确定何时从缓存中删除对象,以防止缓存过多的对象导致内存泄漏或性能降低。System.Runtime.Caching库中提供了三种基本的过期策略:绝对时间、相对时间和空闲时间。可以通过CacheItemPolicy类中的AbsoluteExpiration、SlidingExpiration属性指定缓存项的过期策略。

源代码剖析:

复制public class CacheItemPolicy { // 设置过期时间(绝对时间) public DateTimeOffset? AbsoluteExpiration { get; set; } // 设置过期时间(相对时间) public TimeSpan? SlidingExpiration { get; set; } }1.2.3.4.5.6.7.8. 依赖关系

依赖关系用于使缓存项具有基于文件、目录、键或其他对象的依赖关系。当这些依赖项更改时,缓存中的项将自动无效。在System.Runtime.Caching库中,可以通过以下类实现依赖关系的管理:

CacheDependency类:表示一个基于文件或目录的依赖项。ChangeMonitor类:表示一个监视缓存项的变化的类,包括CacheDependency、FileChangeMonitor、SqlChangeMonitor等。

源代码剖析:

复制public class CacheDependency : IDisposable { public CacheDependency(string filename); public CacheDependency(string[] filenames); public virtual string GetUniqueID(); public virtual void NotifyDependencyChanged(object sender, EventArgs e); } public abstract class ChangeMonitor : IDisposable { // 标识缓存项是否已过期 public virtual bool HasChanged { get; } }1.2.3.4.5.6.7.8.9.10.11.12.13. 回调函数

回调函数用于在缓存项过期或被删除时执行指定的回调函数。在System.Runtime.Caching库中,可以通过CacheItemPolicy类中的RemovedCallback属性指定当缓存项过期或被删除时要执行的回调函数。

源代码剖析:

复制public class CacheItemPolicy { // 设置缓存项被删除时的回调函数 public int RemovedCallback { get; set; } }1.2.3.4.5.

高级功能

缓存统计信息

缓存统计信息提供了缓存对象的统计数据,如当前缓存项数目、命中率等。在System.Runtime.Caching库中,可以通过MemoryCacheStatistics类获取缓存统计信息。

源代码剖析:

复制public sealed class MemoryCacheStatistics { public int Count { get; } public long Hits { get; } public double HitRatio { get; } public long Misses { get; } public double MissRatio { get; } }1.2.3.4.5.6.7.8. 高级回收策略

高级回收策略提供了自定义的回收策略,以更精细地控制缓存对象的生命周期。在System.Runtime.Caching库中,可以通过以下类实现高级回收策略的管理:

ICachePolicyManager接口:表示一个可自定义的缓存策略管理器。CacheMemoryPressureMonitor类:表示一个监视系统内存压力的对象。BackgroundMemoryMonitor类:表示一个后台线程,用于检测系统内存压力并根据指定的缓存策略来删除缓存项。

源代码剖析:

复制public interface ICachePolicyManager { CacheItemPolicy GetItemPolicy(string key, object value); } public sealed class CacheMemoryPressureMonitor : IDisposable { // 监视系统内存压力,并设置相应的缓存策略 } public sealed class BackgroundMemoryMonitor : IDisposable { public BackgroundMemoryMonitor(ICachePolicyManager policyManager); // 监视系统内存压力,并根据缓存策略来删除缓存项 }1.2.3.4.5.6.7.8.9.10.11.12.13.14.15. 缓存区域

缓存区域允许将缓存项分配到不同的区域,以便更好地管理和组织缓存项。在System.Runtime.Caching库中,可以通过CacheArea类实现缓存区域的管理。

源代码剖析:

复制public class CacheArea : IDisposable { public CacheArea(string name); public string Name { get; } public void Dispose(); public object Get(string key); public bool Contains(string key); public void Add(string key, object value, CacheItemPolicy policy); public void Remove(string key); }1.2.3.4.5.6.7.8.9.10.

完整的示例代码

以下是一个使用System.Runtime.Caching命名空间的示例代码,展示了如何使用MemoryCache类来创建缓存并添加、获取和删除缓存项:

复制using System; using System.Runtime.Caching; namespace MemoryCacheDemo { class Program { static void Main(string[] args) { // 创建一个内存缓存对象 MemoryCache cache = MemoryCache.Default; // 添加一个缓存项 cache.Add("key1", "value1", DateTimeOffset.UtcNow.AddMinutes(30)); // 获取缓存项的值 Object value = cache.Get("key1"); if (value != null) { Console.WriteLine("获取缓存项:", value); } // 删除缓存项 cache.Remove("key1"); // 再次尝试获取已被删除的缓存项 value = cache.Get("key1"); if (value == null) { Console.WriteLine("获取失败,缓存项已被删除"); } // 设置缓存项的属性 CacheItemPolicy policy = new CacheItemPolicy(); policy.AbsoluteExpiration = DateTimeOffset.UtcNow.AddMinutes(30); cache.Set("key2", "value2", policy); Console.ReadKey(); } } }1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.

在这个例子中,我们首先使用MemoryCache.Default静态属性来获取默认的内存缓存对象。然后,我们使用Add方法向缓存中添加一个项,Get方法从缓存中获取一个项,Remove方法从缓存中删除一个项,以及Set方法设置缓存项的属性。注意,我们使用CacheItemPolicy类来指定缓存项的过期时间和其他选项。

以上是System.Runtime.Caching库按照不同的功能和用途进行分类,并提供相应的源代码剖析。根据实际需求,可以选择适当的API和功能进行组合使用,以达到最佳的性能和效果。

(责任编辑:人工智能)

    探索酷派电话的用户体验(了解酷派手机的功能特点与市场反馈)就在几天之前,Canonical公司刚刚发布了Ubuntu 15.10 wily werewolf的稳定版本,而且目前大家已经可以将其下载并安装在自己的计算机当中。在今天的文章中,我们将一同了解Ubuntu 15.10新版本当中值得关注的新特性,同时探讨此次大版更新了哪些重要内容。1.Linux内核4.2Ubuntu 15.10的发布标配为Linux内核4.2。新的内核版本带来了大量变化,包括支持新的AMD GPU驱动程序、NCQ TRIM处理、排队自旋锁、F2FS单一文件加密以及其它多种全新或者经过更新的驱动程序。2.Unity 7.3.2作为Ubuntu 15.10版本的主桌面方案,Unity目前已经更新至7.3.2版本。新版本不仅修复了大量bug,同时也提升了精致水平并带来不少小规模可用性改进。下面一起来看Unity 7.3.2当中的各类新特性:◆允许用户直接从Dash当中将应用拖拽至桌面并为其创建快捷方式。◆在Dash当中按下键盘上的Page up/Page down键可实现滚动效果。◆Dash标题与BFB工具提示将根据用户的隐私设定进行更新。◆会话退出按钮现在拥有了点击特效。◆修正了屏幕锁定可能造成计算机“关闭”的问题。◆活跃应用程序图标现在会在启动器展开时以显示其详情。◆修正全屏菜单栏。◆修正了“显示桌面”可能导致同一应用的两个窗口中某一窗口可能消失的问题。◆Dash:非可扩展类型标题可通过键盘快捷键进行导航。◆Dash:非可扩展类型标题不再在鼠标悬念于其上时以高亮方式显示。◆Dash:修正屏幕阅读器与KeyNav功能。◆新增设定以控制帮助显示延时(在按下Alt键时)。◆进行逻辑调整,避免鼠标从指示图形移动到其菜单时打开相邻菜单。3.GNOME 3.16堆栈此次新版本中的另一大重要调整在于GNOME堆栈中的大部分软件包被更新至3.16.x版本。这不啻为一条好消息,因为这些软件包在更新之后普遍获得了显著改进。不过遗憾的是,Ubuntu 15.10当中的nautilus文件管理器仍然为3.14版本,而Gedit文件编辑器文件仍然为3.10版本。4.引入GNOME Overlay滚动条在Ubuntu 15.10当中,Ubuntu开发人员已经决定采用GNOME Overlay滚动条,并利用其替代面向GTK3应用程序的Unity堆叠滚动条。其本质功能与后者并无区别,不过GNOME Overlay滚动条在设计上更加鲜明,其会始终显示以提醒用户当前浏览位置,而不再像过去那样需要将鼠标移动至对应位置才能查看到其存在。5.Ubuntu Make作为一款命令行工具,Ubuntu Make允许用户以更为轻松的方式在Ubuntu之上下载各大人气开发者工具的最新版本。其现在甚至能够支持更多平台、框架与服务,其中包括一套完整的Android开发环境。6.持久网络接口名称Ubuntu开发人员还在Ubuntu 15.10版本当中引入了无状态持久网络接口名称机制,这意味着我们无需再将网络接口命名为eth0或者eth1,而能够采用更为全面的描述名称。另外,即使我们进行设备重启或者硬件移除,上述名称仍将继续生效。7.Steam手柄支持能力在此次最新版本当中,Ubuntu开发人员还在Ubuntu 15.10当中添加了对Steam手柄的支持能力。现在,经过更新的Steam软件包似乎只能运行在Ubuntu 15.10版本之上,不过未来我们也许能够利用更新补丁使其它早期版本与之相兼容。这意味着Ubuntu 15.10用户将能够接入新型手柄,开启Steam,而后在无需使用任何咨询教程的前提下顺畅进行游戏。8.新的默认壁纸Ubuntu 15.10提供一张新的默认壁纸,据称该壁纸的设计概念源自折纸工艺品。另外,新版本还包含有一组来自社区的全新壁纸。9.核心应用程序更新Ubuntu 15.10还对核心应用程序进行了更新,具体包括:◆火狐41◆Chromium 45◆LibreOffice 5.0.2◆Totem (即原本的‘视频’) 3.16◆Nautilus (即原本的‘文件’) 3.14.2◆Rhythmbox 3.2.1◆GNOME Terminal 3.16◆Eye of GNOME 3.16◆Empathy 3.12.10◆Shotwell 0.22下载Ubuntu 15.10最终版本Ubuntu 15.10的完整镜像目前已经可供大家下载与安装。其提供64位与32位两种版本,二者皆可通过以下链接通过官方ISO下载页面进行获取:下载Ubuntu 15.10
    相关内容
    精彩推荐
    热门点击
    友情链接