您的位置:首页 > 教程 > C#教程 > C#中使用Cache框架快速实现Cache操作

C#中使用Cache框架快速实现Cache操作

2022-06-20 13:00:44 来源:易采站长站 作者:

C#中使用Cache框架快速实现Cache操作

.NET 4.0中新增了一个System.Runtime.Caching的名字空间,它提供了一系列可扩展的Cache框架,本文就简单的介绍一下如何使用它给程序添加Cache。U7W站长之家-易采站长站-Easck.Com

一个Cache框架主要包括三个部分:ObjectCache、CacheItemPolicy、ChangeMonitor。U7W站长之家-易采站长站-Easck.Com

    ObjectCache表示一个CachePool,它提供了Cache对象的添加、获取、更新等接口,是Cache框架的主体。它是一个抽象类,并且系统给了一个常用的实现——MemoryCache。U7W站长之家-易采站长站-Easck.Com

    CacheItemPolicy则表示Cache过期策略,例如保存一定时间后过期。它也经常和ChangeMonitor一起使用,以实现更复杂的策略。U7W站长之家-易采站长站-Easck.Com

    ChangeMonitor则主要负责CachePool对象的状态维护,判断对象是否需要更新。它也是一个抽象类,系统也提供了几个常见的实现:CacheEntryChangeMonitor、FileChangeMonitor、HostFileChangeMonitor、SqlChangeMonitor。U7W站长之家-易采站长站-Easck.Com

    如下是一个简单的示例:U7W站长之家-易采站长站-Easck.Com

        class MyCachePool
        {
            ObjectCache cache = MemoryCache.Default;
            const string CacheKey = "TestCacheKey";
    
            public string GetValue()
            {
                var content = cache[CacheKey] as string;
                if(content == null)
                {
                    Console.WriteLine("Get New Item");
    
                    var policy = new CacheItemPolicy() { AbsoluteExpiration = DateTime.Now.AddSeconds(3) };
                    content = Guid.NewGuid().ToString();
                    cache.Set(CacheKey, content, policy);
                }
                else
                {
                    Console.WriteLine("Get cached item");
                }
    
                return content;
            }
    
            public static void Test()
            {
                var cachePool = new MyCachePool();
                while (true)
                {
                    Thread.Sleep(1000);
                    var value = cachePool.GetValue();
                    Console.WriteLine(value);
                    Console.WriteLine();
    
                }
            }
        }

    这个例子创建了一个保存3秒钟Cache:三秒钟内获取到的是同一个值,超过3秒钟后,数据过期,更新Cache,获取到新的值。U7W站长之家-易采站长站-Easck.Com

    过期策略:

    从前面的例子中我们可以看到,将一个Cache对象加入CachePool中的时候,同时加入了一个CacheItemPolicy对象,它实现着对Cache对象超期的控制。例如前面的例子中,我们设置超时策略的方式是:AbsoluteExpiration>。它表示的是一个绝对时间过期,当超过3秒钟后,Cache内容就会过期。U7W站长之家-易采站长站-Easck.Com

    除此之外,我们还有一种比较常见的超期策略:按访问频度决定超期。例如,如果我们设置如下超期策略:SlidingExpiration = TimeSpan.FromSeconds(3)。它表示当对象3秒钟内没有得到访问时,就会过期。相对的,如果对象一直被访问,则不会过期。这两个策略并不能同时使用。U7W站长之家-易采站长站-Easck.Com

    CacheItemPolicy也可以制定UpdateCallback和RemovedCallback,方便我们记日志或执行一些处理操作,非常方便。U7W站长之家-易采站长站-Easck.Com

    ChangeMonitor

    虽然前面列举的过期策略是非常常用的策略,能满足我们大多数时候的需求。但是有的时候,过期策略并不能简单的按照时间来判断。例如,我Cache的内容是从一个文本文件中读取的,此时过期的条件则是文件内容是否发生变化:当文件没有发生变更时,直接返回Cache内容,当问及发生变更时,Cache内容超期,需要重新读取文件。这个时候就需要用到ChangeMonitor来实现更为高级的超期判断了。U7W站长之家-易采站长站-Easck.Com

    由于系统已经提供了文件变化的ChangeMonitor——HostFileChangeMonitor,这里就不用自己实现了,直接使用即可。U7W站长之家-易采站长站-Easck.Com

        public string GetValue()
        {
            var content = cache[CacheKey] as string;
            if(content == null)
            {
                Console.WriteLine("Get New Item");
    
                var file = @"r:\test.txt";
                CacheItemPolicy policy = new CacheItemPolicy();
                policy.ChangeMonitors.Add(new HostFileChangeMonitor(new List<string> { file }));
    
                content = File.ReadAllText(file);
                cache.Set(CacheKey, content, policy);
            }
            else
            {
                Console.WriteLine("Get cached item");
            }
    
            return content;
        }

    这个例子还是比较简单的,对于那些没有自定义的策略,则需要我们实现自己的ChangeMonitor,现在一时也想不到合适的例子,下次有时间在写篇文章更深入的介绍一下吧。U7W站长之家-易采站长站-Easck.Com

    到此这篇关于C#使用Cache框架实现Cache操作的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持易采站长站。U7W站长之家-易采站长站-Easck.Com

    如有侵权,请联系QQ:279390809 电话:15144810328

相关文章

  • vs2019安装和使用详细图文教程

    vs2019安装和使用详细图文教程

    vs2019已经在4月2日正式发布,vs2019发布会请看这个链接: vs2019发布活动 vs2019和vs2017一样强大,项目兼容,不用互相删除,而且C/C++,Python,F#,ios,Android,Web,Node.js,Azure,Unity,HTML,
    2020-03-10
  • VS2019使用快捷键将代码对齐的方法

    VS2019使用快捷键将代码对齐的方法

    1、选中需要对齐的行 2、CTRL+K 3、CTRL+F 对齐前: 对齐后: 补充:VS中代码对齐等快捷键 在VS2008中,选定代码后,按Ctrl+K+F组合键,可以自动进行代码对齐。 注意:要先按下Ctrl和K,再按
    2020-04-01
  • c# 类成员初始化顺序的特殊情况

    c# 类成员初始化顺序的特殊情况

    这里直接给出C#类成员一般初始化顺序: 子类静态字段 子类静态构造 子类实例字段 父类静态字段 父类静态构造 父类实例字段 父类实例构造 子类实例构造 为什么说是“一般”初始化
    2020-06-30
  • 使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、

    使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、

    一、VS的开发环境 首先你得安装了vs2019,然后确认下下面三个组件是否存在,如果没有要下载一下。vs2019的安装可参考visual studio2019的安装以及使用。 二、创建C#窗体应用程序 打开vs 可
    2020-03-08
  • C# XML字符串包含特殊字符的处理转换方法小结

    C# XML字符串包含特殊字符的处理转换方法小结

    为了能正常输出XML格式的内容,必须要对不被XML允许的那些特殊字符进行转换。本文介绍的正是如何使用C#判断XML字符串是否含特殊字符并进行转换。 以下是几个特殊字符的对应实体。
    2020-07-01
  • Unity实现俄罗斯方块游戏

    Unity实现俄罗斯方块游戏

    本文实例为大家分享了Unity实现俄罗斯方块游戏的具体代码,供大家参考,具体内容如下 一、演示 二、实现思路 创建每一个方块可移动到的位置点,可以理解为创建一个游戏地图,从
    2020-06-21
  • c# Newtonsoft 六个值得使用的特性(上)

    c# Newtonsoft 六个值得使用的特性(上)

    一:讲故事 看完官方文档,阅读了一些 Newtonsoft 源码,对它有了新的认识,先总结 六个超经典又实用的特性,同大家一起分享,废话不多说,快来一起看看吧~~~ 二:特性分析 1. 代码格
    2020-06-23
  • c#压缩字符串的方法

    c#压缩字符串的方法

    一:背景 1. 讲故事 在我们的一个全内存项目中,需要将一家大品牌店铺小千万的trade灌入到内存中,大家知道trade中一般会有订单来源,省市区 ,当把这些字段灌进去后,你会发现他们
    2020-06-24