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

作者:天方 时间:2023-01-21 22:35:27 

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

一个Cache框架主要包括三个部分:ObjectCache、CacheItemPolicy、ChangeMonitor。

  • ObjectCache表示一个CachePool,它提供了Cache对象的添加、获取、更新等接口,是Cache框架的主体。它是一个抽象类,并且系统给了一个常用的实现——MemoryCache。

  • CacheItemPolicy则表示Cache过期策略,例如保存一定时间后过期。它也经常和ChangeMonitor一起使用,以实现更复杂的策略。

  • ChangeMonitor则主要负责CachePool对象的状态维护,判断对象是否需要更新。它也是一个抽象类,系统也提供了几个常见的实现:CacheEntryChangeMonitor、FileChangeMonitor、HostFileChangeMonitor、SqlChangeMonitor。

如下是一个简单的示例:

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,获取到新的值。

过期策略:

从前面的例子中我们可以看到,将一个Cache对象加入CachePool中的时候,同时加入了一个CacheItemPolicy对象,它实现着对Cache对象超期的控制。例如前面的例子中,我们设置超时策略的方式是:AbsoluteExpiration = DateTime.Now.AddSeconds(3)。它表示的是一个绝对时间过期,当超过3秒钟后,Cache内容就会过期。

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

CacheItemPolicy也可以制定UpdateCallback和RemovedCallback,方便我们记日志或执行一些处理操作,非常方便。

ChangeMonitor

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

由于系统已经提供了文件变化的ChangeMonitor——HostFileChangeMonitor,这里就不用自己实现了,直接使用即可。

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,现在一时也想不到合适的例子,下次有时间在写篇文章更深入的介绍一下吧。

来源:https://www.cnblogs.com/TianFang/p/3430169.html

标签:C#,Cache,框架,操作
0
投稿

猜你喜欢

  • Android开发之SeekBar基本使用及各种美观样式示例

    2023-06-30 07:15:22
  • SpringBoot统一功能处理实现的全过程

    2021-06-12 11:14:49
  • Android仿360桌面手机卫士悬浮窗效果

    2021-06-16 10:06:37
  • C#利用时间和随即字符串创建唯一的订单编号

    2022-01-21 15:18:56
  • IDEA实现添加 前进后退 到工具栏的操作

    2021-08-30 21:34:48
  • Android中EditText和AutoCompleteTextView设置文字选中颜色方法

    2022-12-05 04:45:30
  • javaweb实现app扫码登录功能

    2022-03-25 03:48:19
  • Spring Boot 与 kotlin 使用Thymeleaf模板引擎渲染web视图的方法

    2022-12-26 21:09:44
  • 将c#编写的程序打包成应用程序的实现步骤分享(安装,卸载) 图文

    2023-01-30 03:08:50
  • Java监听器的作用及用法代码示例

    2023-06-24 06:59:07
  • 使用反射方式获取JPA Entity的属性和值

    2023-07-24 17:43:22
  • Android App实现监听软键盘按键的三种方式

    2021-09-14 10:39:27
  • C语言数据结构之二叉树详解

    2021-08-18 20:56:41
  • mybatis QueryWrapper的条件构造之apply、last、select解析

    2022-02-12 17:32:51
  • android中Bitmap的放大和缩小实例代码

    2021-10-01 13:23:28
  • C# 索引器的使用教程

    2022-08-25 05:11:59
  • Android简单使用PopupWindow的方法

    2023-09-13 19:51:22
  • c# winform取消右上角关闭按钮的实现方法

    2023-05-05 18:56:28
  • 将InputStream转化为base64的实例

    2023-04-24 02:30:59
  • java实现登录验证码功能

    2021-06-08 19:34:18
  • asp之家 软件编程 m.aspxhome.com