zoukankan      html  css  js  c++  java
  • ABP理论学习之缓存Caching

    返回总目录


    本篇目录

    介绍###

    ABP提供了缓存的抽象,它内部使用了这个缓存抽象。虽然默认的实现使用了MemoryCache,但是也可以为其他的缓存提供者进行实现和改变。

    ICacheManager###

    缓存的主要接口是ICacheManager。我们可以注入该接口,然后使用该接口获得一个缓存对象。例如:

    public class TestAppService : ApplicationService
    {
        private readonly ICacheManager _cacheManager;
    
        public TestAppService(ICacheManager cacheManager)
        {
            _cacheManager = cacheManager;
        }
    
        public Item GetItem(int id)
        {
            //从缓存中获取
            return _cacheManager
                    .GetCache("MyCache")
                    .Get(id.ToString(), () => GetFromDatabase(id)) as Item;
        }
    
        public Item GetFromDatabase(int id)
        {
            //... 从数据库中检索
        }
    }
    
    

    在这个例子中,我们注入了ICacheManager,并获取了一个叫做MyCache的缓存对象。

    警告:GetCache方法

    不要在构造函数中使用GetCache方法。如果你的类是transient(每次使用都会创建)的,那么这可能会释放缓存,因为第二次创建类的对象时,会再次调用构造函数,之前的第一次的缓存可能会被释放。

    ICache###

    ICacheManager.GetCache方法返回一个ICache。缓存对象是单例的,第一次请求时会创建缓存,以后都是返回相同的缓存对象。因此,我们可以在不同的类(客户端)中共享具有相同名字的相同缓存。

    在样例代码中,我们看到了ICache.Get方法的简单使用。它有两个参数:

    • key:缓存中一个条目的唯一字符串键。
    • 工厂:没有找到给定key的缓存条目时调用的action。工厂方法应该创建并返回实际的条目。如果给定的key在缓存中找到了,那么不会调用该action。

    ICache接口也有像GetOrDefault,Set,Remove,Clear的方法。同时,这些方法也有异步(async)版本。

    ITypedCache###

    ICache接口的key为string类型,value为object类型。ITypeCache是ICache的包装器,提供类型安全、泛型的cache。为了将ICache转为ITypedCache,我们可以使用AsTyped扩展方法,如下所示:

    ITypedCache<int, Item> myCache = _cacheManager.GetCache("MyCache").AsTyped<int, Item>();
    
    

    这样,我们不需要转换就可以使用Get方法。

    配置###

    默认的缓存有效期是60min。因此,如果你在60min内都没有使用缓存中的元素,那么它会自动从缓存中移除。对于所有的缓存或者特定的某个缓存,你都可以配置有效期。

    //为所有缓存配置有效期
    Configuration.Caching.ConfigureAll(cache =>
    {
        cache.DefaultSlidingExpireTime = TimeSpan.FromHours(2);
    });
    
    //为特定的缓存配置有效期
    Configuration.Caching.Configure("MyCache", cache =>
    {
        cache.DefaultSlidingExpireTime = TimeSpan.FromHours(8);
    });
    
    

    这些代码应该放到模块中的PreInitialize方法中。有了这样的配置,MyCache会有8小时的有效期,而其他cache会有2小时有效期。

    一旦cache首次创建(第一次请求时),就会调用配置的action。配置并不只局限于DefaultSlidingExpireTime(默认滚动有效期),因为cache对象是一个ICache,你可以使用它的属性和方法自由地配置并初始化。

  • 相关阅读:
    解读《TCP/IP详解》(卷1):05章:RARP(逆地址解析协议)
    Android中利用“反射”动态加载R文件中的资源
    “骆驼”怎么写
    eclipse无法访问genymotion模拟器下/data/data文件解决方案
    解读《TCP/IP详解》(卷1):03章:IP(网际协议)
    解读《TCP/IP详解》(卷1):02章:链路层
    hdu1039 java正则表达式解法
    hdu1027 又是next_permutaiton
    hdu1261 java水过高精度排列组合。。
    hdu1716 STL next_permutation函数的使用
  • 原文地址:https://www.cnblogs.com/farb/p/ABPCaching.html
Copyright © 2011-2022 走看看