Catel帮助手册-Catel.Core:(2)缓存处理

 

    缓存是用于提供应用程序执行效率的,应用程序大部分的花费都用于数据的获取,这些处理主要移动到网络上或者存储到硬盘中,但是某些数据不太会改变,并不需要每次都同步。

    因此,为了提高应用程序的执行效率,找到一个很好的方法来处理这些不太改变的数据库,Catel使用了一个

CatchStorage<TKey,TValue>的类,注意,第一个泛型的参数表示的是关键字的类型,第二个泛型的参数是要存储的值的类型,就像Dictonary<Tkey,TValue>。但是CatcheStorage不仅仅是一个Dictionary,这个类允许你使用一条语句获取数据并将数据存储到缓存中。并且当你需要的时候,你可以使用终结策略。

1, 初始化内存存储

需要初始化内存存储时,可以使用如下语句:

private readonly CacheStorage<string, Person> _personCache = new CacheStorage<string, Person>(storeNullValues: true);

 

2 使用语句获取数据并将其存储到缓存中

使用如下语句

var person = _personCache.GetFromCacheOrFetch(Id, () => service.FindPersonById(Id));

当这个语句使用相同的Key执行多次的时候,这个语句将会从内存上返回,而不是从服务调用上返回。这个服务只是在第一次被执行,这个项可以被手工移除或者通过过期策略自动移除。

 

3 使用缓存的过期策略

缓存的过期策略是给缓存存储项目一个删除行为,当项目过期后,一个策略信号将发送给缓存存储,缓存存储将自动的移除这个项目。

    在构造的时候可以给这个CatchStorage 制定过期策略

CacheStorage<string, Person> _personCache = new CacheStorage<string, Person>(() => ExpirationPolicy.Duration(TimeSpan.FromMinutes(5)), true);

如果未指定存储策略,则会制定默认过期策略。

4 创建过期策略 

 

Catel自带过期策略:

过期策略 类型 描述 初始化代码例子
AbsoluteExpirationPolicy 基于时间 缓存将在达到过期时间后过期,使用绝对时间 ExpirationPolicy.Absolute(new DateTime(21, 12, 2012))
DurationExpirationPolicy 基于时间 使用TimeSpan方法来定义当前时间的一个实际段,超过时间段后过期 ExpirationPolicy.Duration(TimeSpan.FromMinutes(5))
SlidingExpirationPolicy 基于时间 使用TimeSpan方法来定义当前时间的一个实际段,超过时间段后过期,但当其重新被回去过后,会重新计算时间 ExpirationPolicy.Sliding(TimeSpan.FromMinutes(5))
CustomExpirationPolicy 自定义 缓存过期将通过函数来进行判断,下面的例子说明了如何使用custom过期策略来创建一个silding策略
var startDateTime = DateTime.Now;

var duration = TimeSpan.FromMinutes(5);

ExpirationPolicy.Custom(() => DateTime.Now > startDateTime.Add(duration), () => startDateTime = DateTime.Now);

CompositeExpirationPolicy 自定义 组合多种过期策略在一起,当任何一个策略过期的时候,都可以使其过期
new CompositeExpirationPolicy().Add(ExpirationPolicy.Sliding(

TimeSpan.FromMinutes(5))).Add(ExpirationPolicy.Custom(()=>...))

 

2.5 实现你自己的过期策略

  如果CustomExpiationPolicy还是不够用,你也可以自己创建过期策略,在某个事件触发后使得缓存项目过期,也可以在读取缓存项目后,重新设置过期策略(如SlidingExpirationPolicy),要实现这个项目,可以使用如下的代码模板:

public class MyExpirationPolicy : ExpirationCachePolicy
{
   public MyExpirationPolicy():base(true)
   {
   }

   public override bool IsExpired
   {
      get
      {
         // Add your custom expiration code to detect if the item expires
      }
   }

   public override void OnReset()
   {
      // Add your custom code to reset the policy if the item is read.
   }
}

 

注意:构造函数中有一个参数来制定,策略是被重置,那么,你调用构造函数使用false,在调用OnReset方法,将不会再调用。

时间: 2024-10-11 17:56:00

Catel帮助手册-Catel.Core:(2)缓存处理的相关文章

Catel帮助手册-Catel.Core(6):日志管理

1,简介      从2.2版本开始,Catel使用了一个自定义的日志系统,这种方式,针对log4net的引用可以被移除,做这个修改主要是为了不强迫用户使用log4net,同时,log4net看起来很长时间不更新了,其他的日志系统如NLog看起来在增长,新的日志系统将允许许多基础的日志,这样,日志将将非常简单,并且如果他需要,真正的日志将被用户执行. 1.1 Log和ILog      所有的日志将通过ILog接口.这个接口被自动的注册到Catel中的所有对象上作为Log字段,ILog接口仅仅有

Catel帮助手册-Catel.Core:(5)依赖注入(ServiceLocator and TypeFactory)

1,简介 在Catel2.0之前,IOC容器内部使用的是Unity,然而,这就强制所有的用户在他的应用程序中使用Unity作为IOC容器,也需要这样划分库,从2.0以后,一个不同的技术被使用了,这个允许开发者可以使用他们自己悬着的IOC容器技术. 1.1在Ioc中不同的组件 在Catel中有许多不同的组件他们对于Ioc是非常重要的. ServiceLocator 该组件用于注册所有的类型,这个事真正的Ioc容器 TypeFactory 用于创建类型的组件,使用IServiceLocator来获取

Catel帮助手册-Catel.Core:(4)数据处理

1,概要      文档的这个部分都是关于Catel中数据处理方法的,一些部分是基于CodeProject上的文章的,但这个文档有更多的更新内容.     一件很重要的事情是许多开发者花费很多时间来处理对象的序列化,序列化是一个专业领域的知识,只有技术比较高深的人员才能很好地掌握对象的序列化处理(要考虑程序集的改变,类的改变(属性的增加和移除),大部分开发者认为序列化只是执行如下的操作代码创建一个BinaryFormattter对象: var serializer = new BinaryFor

Catel帮助手册-Catel.Core:(1)参数检查

  我们检查方法是否正确,一般是返回对错,或者是是否抛出一个异常,大部分人不检查异常的正确性,那么这种错误在很深的堆栈中,很难查看. Catel与一般的检查方法不同,一般是使用   public void CheckForException(object obj) { if (obj == null) { throw new ArgumentNullException("obj"); } }   然而,Catel会记录所有的行为,因此开始的检查方式如下: public void Che

Catel帮助手册-Catel.Core:(3)配置说明

      Catel可以让你更方便的配置所有的平台 下面的表格解释了每个平台使用何种技术来获取和存储配置值. 平台 技术 .NET ConfigurationManager.AppSettings Sliverlight IsolatedStorageSettings.ApplicationSettings WinRT ApplicationData.Current.LocalSettings PCL 不支持   1 从配置中获取值    使用如下代码从配置中获取值: var configur

Catel帮助手册-Catel.Core:(5)异常处理

  在Catel中使用异常处理时,创建一个异常处理策略和执行代码是安全的,不需要人工检查所有的异常类型,Catel通过IExceptionService方法来处理这个技术.   1,设置IExceptionService      注册一个异常到服务中让Calte知道他如何被获取,是很重要的,服务会处理加入到IExceptionService中的异常.      下面是注册一些异常以及他们如何被获取的例子,当FileNotFoundException异常发送时,它会给用户显示消息,对于其他的异常

讨论过后而引发对EF 6.x和EF Core查询缓存的思考

前言 最近将RabbitMQ正式封装引入到.NET Core 2.0项目当中,之前从未接触过这个高大上的东东跟着老大学习中,其中收获不少,本打算再看看RabbitMQ有时间写写,回来后和何镇汐大哥探讨了一点关于EF和EF Core的内容,于是乎本文就出来了.EF 6.x和EF Core中的查询缓存想必大家都有耳闻或者了解,从数据库中查询出来的实体会形成快照在内存中Copy一份且被上下文跟踪,接下来我们要讲的内容就是这个,我们来看看. EF 6.x和EF Core查询缓存思考 首先我利用EF Co

ASP.NET Core 开发-缓存(Caching)

ASP.NET Core 缓存Caching,.NET Core 中为我们提供了Caching 的组件. 目前Caching 组件提供了三种存储方式. Memory Redis SqlServer 学习在ASP.NET Core 中使用Caching. Memory Caching 1.新建一个 ASP.NET Core 项目,选择Web 应用程序,将身份验证 改为 不进行身份验证. 2.添加引用 Install-Package Microsoft.Extensions.Caching.Memo

net core WebApi——缓存神器Redis

目录 前言 Redis 使用 RedisUtil 测试 小结 @ 前言 中秋过完不知不觉都已经快两周没动这个工程了,最近业务需要总算开始搞后台云服务了,果断直接net core搞起,在做的中间遇到了不少问题,这个后续会一点点列出来包括解决方法,今天就先把之前挖的坑填一个. Redis 之前在缓存那篇提到过,Cookie,Session,Cache这几个不同的缓存方式,Cookie是存在客户端浏览器的,Session实质上也是客户端的存储,至于Cache是服务端的,但是如果是分布式的话,这几个方式