软件开发中最常用的模式之一是缓存,这是一个简单但非常有效的概念,想法是重用操作结果,执行繁重的操作时,我们会将结果保存在缓存容器中,下次我们需要该结果时,我们将从缓存容器中取出它,而不是再次执行繁重的操作。
例如,要获得某人的头像,您可能需要前往数据库。我们不会每次都执行那次查询,而是将结果保存在缓存中,每次需要时都将其从内存中删除。
缓存非常适合不经常更改的数据,甚至永远不会改变。不断变化的数据不适合缓存,如当前机器的时间不应缓存,否则您将得到错误的结果。
进程内缓存,持久化缓存和分布式缓存
单线程的缓存
这个简单的代码解决了一个关键问题,要获取test的值,只有***个请求才会实际执行数据库操作,然后将数据保存在进程存储器中,以后有关test的请求都将从内存中提取,从而节省时间和资源。
但是,作为编程中的大多数事情,没有什么是如此简单。由于许多原因,上述解决方案并不好。首先,这种实现不是线程安全的,多个线程使用时可能会发生异常,除此之外,缓存的项目将永远留在内存中,这实际上非常糟糕。
例如:
运行结果7234859,运行 的数据丢失了
这就是为什么我们应该从Cache中删除项目:
为了处理这些问题,缓存框架具有驱逐策略(即删除策略),这些是根据某些逻辑从缓存中删除项目的规则,常见的驱逐政策是:
现在我们知道了我们需要什么,让我们继续寻找更好的解决方案。
改善方案
令我非常沮丧的是,作为博主,微软已经创建了一个很棒的缓存实现,这剥夺了我自己创建类似实现的乐趣,但至少我写这篇博文的工作较少。
我将向您展示Microsoft的解决方案,如何有效地使用它,以及如何在某些情况下改进它。
System.Runtime.Caching / MemoryCache与Microsoft.Extensions.Caching.Memory
微软有2个解决方案,2个不同的NuGet包用于缓存,两者都很棒,根据微软的建议,更喜欢使用Microsoft.Extensions.Caching.Memory因为它与Asp更好地集成.NET核心。它可以很容易地注入到Asp .NET Core的依赖注入机制中。
这是一个基本的例子Microsoft.Extensions.Caching.Memory:
这与我自己非常相似NaiveCache,所以改变了什么?嗯,首先,这是一个线程安全的实现。您可以安全地从多个线程一次调用它。
带有逐出政策的IMemoryCache:
让我们分析一下新增内容:
除了示例中的选项之外,您还可以设置一个RegisterPostEvictionCallback委托,当项目被驱逐时将调用该委托。
这是一个非常全面的功能集。它让你想知道是否还有其他东西要添加,实际上有几件事。
问题和缺失的功能
这个实现中有几个重要的缺失部分。
英文原文中有说明,但是觉得不太好,再次没有翻译。
英文原文地址:
https://michaelscodingspot.com/cache-implementations-in-csharp-net/?utm_source=csharpdigest&utm_medium=web&utm_campaign=featured
代码与所写有所修改,但是大致意思一样,如果感兴趣,可以看看英文。
在当今的科技时代,有两个术语有些神秘并且令人敬畏。首先是数字化转型,人们可...
很多人在租用香港服务器的时候都有考虑过要不要更新系统,在这里,香港服务器小...
2009年12月28日,由中科曙光投资建设的成都云计算中心建成启动仪式在成都市高新...
在一个全球化的企业中,文化是最难改变的,尤其是当它并没有完全统一的时候。巴...
云服务器是面向各类互联网用户提供综合业务能力的服务平台,能为客户提供安全、...
当我们选择某种东西的时候,都会做对比,能被选中的都是因为其存在的绝对优势。...
智能化大潮风起云涌,行业的智能化转型升级正在成为中国经济新旧动能转换的核心...
中小型企业以便控制成本,建立服务器虚拟化,能够应用云主机,即便捷,花费低,...
本文转载自微信公众号「moon聊技术」,作者moon聊技术。转载本文请联系moon聊技...
1 Nginx入门教程 Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/...