.Net C# MemoryCache 缓存

这篇具有很好参考价值的文章主要介绍了.Net C# MemoryCache 缓存。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

缓存是一种开发时常用的性能优化手段,.Net自带内存缓存(MemoryCache)可以很方便的使用,下面列出简单用法。

首先通过NuGet添加 Microsoft.Extensions.Hosting、Microsoft.Extensions.Caching.Memory 这两个包。

添加命令:

Install-Package Microsoft.Extensions.Caching.Memory

Install-Package Microsoft.Extensions.Hosting

向缓存中添加数据:

memoryCache.Set(dog.Name, dog, options);

从缓存获取数据(可以直接使用泛型方法指定返回类型):

memoryCache.Get<Dog>(key);

添加时可以使用 await memoryCache.GetOrCreateAsync()方法完成,该方法可以在缓存中没有数据时另外处理获取数据的方式,并将结果添加进缓存中。

参考代码:

internal class CacheDemo
    {
        //该集合当做数据源
        static IEnumerable<Dog> dogs;
        //全局容器
        static IHost host;
        public static async Task DemoMain()
        {
            //向容器添加缓存服务
            host = Host.CreateDefaultBuilder()
                .ConfigureServices(services => services.AddMemoryCache())
                .Build();

            //向数据源填充数据
            dogs = GetDogs().ToList();
            //缓存配置
            MemoryCacheEntryOptions cacheOptions = new()
            {
                //设置缓存10秒过期
                AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(10)
            };



            //循环查询缓存中是否有对应数据
            foreach (Dog dog in GetDogs())
            {
                var dogResult = await GetDogAsync(dog.Name);
                Console.WriteLine($"查询结果1:{dogResult}");
            }

            var dogResult2 = GetCacheData("泰迪");
            Console.WriteLine($"查询结果2:{dogResult2}");
            Console.WriteLine("等待11秒缓存过期后再获取");
            await Task.Delay(11000);
            var dogResult3 = GetCacheData("泰迪");
            Console.WriteLine($"查询结果3:{dogResult3}");
            //向缓存中添加泰迪
            SetCacheData(new Dog("泰迪", 1), cacheOptions);
            var dogResult4 = GetCacheData("泰迪");
            Console.WriteLine($"查询结果4:{dogResult4}");
            var dogResult5 = GetCacheData("吉娃娃");
            Console.WriteLine($"查询结果5:{dogResult5}");

        }
        /// <summary>
        /// 从缓存中获取数据
        /// 如果没有则从数据源获取并添加至缓存
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        private static async Task<Dog> GetDogAsync(string name)
        {
            //从容器中获取缓存服务
            IMemoryCache memoryCache = host.Services.GetRequiredService<IMemoryCache>();

            //查询缓存数据,没有则从数据源查询并添加至缓存
            var dogResult = await memoryCache.GetOrCreateAsync(name, t =>
            {
                t.AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(10);
                Console.WriteLine($"缓存中没有{name},查询集合数据!");
                Dog dog1 = dogs.SingleOrDefault(d => d.Name.Equals(name));
                return Task.FromResult(dog1);
            });

            return dogResult;
        }
        /// <summary>
        /// 向缓存中添加数据
        /// </summary>
        /// <param name="dog"></param>
        /// <param name="options"></param>
        private static void SetCacheData(Dog dog, MemoryCacheEntryOptions options)
        {
            //从容器中获取缓存服务
            IMemoryCache memoryCache = host.Services.GetRequiredService<IMemoryCache>();

            memoryCache.Set(dog.Name, dog, options);
        }
        /// <summary>
        /// 缓存中获取数据
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        private static Dog GetCacheData(string key)
        {
            //从容器中获取缓存服务
            IMemoryCache memoryCache = host.Services.GetRequiredService<IMemoryCache>();

            return memoryCache.Get<Dog>(key);
        }

        /// <summary>
        /// 获取所有可爱的狗
        /// </summary>
        /// <returns></returns>
        private static IEnumerable<Dog> GetDogs()
        {
            yield return new Dog("泰迪", 1);
            yield return new Dog("吉娃娃", 2);
            yield return new Dog("哈士奇", 3);
            yield return new Dog("罗威纳", 4);
        }
    }
    /// <summary>
    /// 狗类
    /// </summary>
    /// <param name="Name"></param>
    /// <param name="Id"></param>
    internal record Dog(string Name, int Id);

输出结果:

.Net C# MemoryCache 缓存

缓存雪崩:是指同一时间大量缓存失效, 导致大量请求发向后端服务。

向缓存添加数据时,时间可以设置一定范围的随机时间,这是一种避免出现缓存雪崩的简单方法。

缓存击穿:是指热点缓存失效,导致查询该热点数据的请求大量查询后端服务。

如果业务场景允许,可以每次延长缓存时间或者设置为不过期。也可以使用单独的任务来维护热点数据缓存。

缓存穿透:是指大量不存在的数据请求(比如恶意请求)进行查询,此时缓存和后端服务中都没有这些数据,浪费大量资源。

这个时候使用布隆过滤器是个很好的选择。文章来源地址https://www.toymoban.com/news/detail-477668.html

到了这里,关于.Net C# MemoryCache 缓存的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 每个.NET开发都应掌握的C#接口知识点

    作为.NET开发者,接口是C#必须掌握的知识点,接口是C#中实现多态和组件间互操作性的关键机制之一。 接口是一种抽象的类型,它定义了一组成员(方法、属性、事件等)的规范,但没有实现代码。类可以实现一个或多个接口,以表明它们提供了特定的功能。 以下是每个.N

    2024年02月13日
    浏览(47)
  • 每个.NET开发都应掌握的C#集合知识点

    上篇文章讲述了C#委托和事件知识点,本文将介绍C#集合知识点。作为.NET开发人员,C#集合是你在构建强大和高效应用程序时的关键技能之一。C#集合提供了一系列丰富的数据结构,可以帮助你更好地管理、操作和组织数据。本文将介绍一些每个.NET开发人员都应该掌握的C#集合

    2024年02月10日
    浏览(48)
  • 每个.NET开发都应掌握的C#异常处理知识点

    上篇文章讲述了C#集合知识点,本文将介绍C#异常处理知识点。异常处理是.NET开发中至关重要的一部分,它允许开发者在程序出现错误或不正常情况时采取适当的措施,从而提高应用程序的稳定性和可靠性。本文将介绍C#异常处理知识点,异常的基本概念略过,请查看官网。

    2024年02月08日
    浏览(56)
  • 每个.NET开发都应掌握的C#委托事件知识点

    上篇文章讲述了C#接口的知识点,本文将介绍C#委托事件知识点。C#作为.NET开发的核心语言之一,提供了丰富的特性来支持面向对象编程和事件驱动的模型。其中,委托和事件是C#中不可或缺的关键概念,每个.NET开发者都应该深入理解它们的作用和用法。委托和事件密不可分,

    2024年02月12日
    浏览(40)
  • 每个.NET开发都应掌握C#泛型的知识点

    C#泛型编程是.NET framework 2.0的新特征,它提高了代码安全性和代码重用的问题。由于泛型必须指定类型,正确的使用可以避免了装箱拆箱的问题;使用了泛型后,可以将算法或组件泛型化,基于类型参数支持任意数据类型,从而提高了代码的重用性。 C#泛型编程在C#是很重要的特

    2024年02月15日
    浏览(48)
  • 每个.NET开发都应掌握的C#多线程知识点

    上篇文章讲述了C#特性(Attribute)知识点,本文将介绍多线程的知识点。多线程编程是现代软件开发中的重要组成部分,它能够充分利用多核处理器,提高应用程序的性能和响应性。C#作为.NET开发的主要语言,提供了强大的多线程支持。本文将介绍C#多线程知识点,帮助.NET开

    2024年02月05日
    浏览(65)
  • 【《C# 10 和 .NET 6入门与跨平台开发(第6版)》——一本循序渐进的C#指南】

    这个新版本对上一版做了全面修订,涵盖C# 10和.NET 6的所有新功能. 本书讨论面向对象编程、编写函数、测试函数、调试函数、实现接口以及继承类等主题;介绍.NET API,这些API可执行多种任务,如管理和查询数据,监视和改进性能,以及使用文件系统、异步流、序列化和加密

    2024年02月14日
    浏览(46)
  • 每个.NET开发都应掌握的C#特性(Attribute)知识点

    上篇文章讲述了C#反射知识点,本文将介绍C#特性(Attribute)的知识点。C#特性(Attribute)是一种强大的元数据机制,用于为代码元素(如类、方法、属性等)添加信息,以影响它们的行为或提供额外的信息。本文将介绍C#特性每个.NET开发都应熟悉的知识点,希望对大家开发有

    2024年02月08日
    浏览(43)
  • 【缓存设计】记一种不错的缓存设计思路

    之前与同事讨论接口性能问题时听他介绍了一种缓存设计思路,觉得不错,做个记录供以后参考。 假设有个以下格式的接口: 其中 keys 是业务主键列表,types 是想要取到的信息的类型。 请求该接口需要返回业务主键列表对应的业务对象列表,对象里需要包含指定类型的信息

    2024年02月11日
    浏览(23)
  • 微软发布ChatGPT 版必应 用的是 .NET 技术

    微软在今天在Redmond 线下举办媒体一场活动,发布了新版的微软必应, 在桌面上推出了测试版,移动版也即将推出。微软首席执行官纳德拉称Al-powered搜索为公司自云15年以来最大的事情。 2023年1月初,微软已经在讨论将OpenAI的技术纳入Word、PowerPoint、Outlook和其他应用程序,这

    2024年02月08日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包