首页 > 代码库 > 2.3 缓存

2.3 缓存

缓存

  • 介绍
  • ICacheManager
    • 警告:GetCache方法
  • ICache
    • ITypedCache
  • 配置
  • 实体缓存
    • 实体缓存如何工作
  • Redis缓存集成

介绍

  ABP为缓存提供了一个抽象接口。它内部使用这个缓存抽象。默认使用MemoryCache实现,但可以换用其他的缓存提供者实现。例如Abp.RedisCache包实现了在Redis中实现缓存。(参见下面的“Redis缓存集成”部分)。

ICacheManager

  缓存的主要接口时ICacheManager。我们可以注入并使用它获取缓存。示例:

public class TestAppService : ApplicationService{    private readonly ICacheManager _cacheManager;    public TestAppService(ICacheManager cacheManager)    {        _cacheManager = cacheManager;    }    public Item GetItem(int id)    {        //Try to get from cache        return _cacheManager                .GetCache("MyCache")                .Get(id.ToString(), () => GetFromDatabase(id)) as Item;    }    public Item GetFromDatabase(int id)    {        //... retrieve item from database    }}

  在这个例子中,我们注入了ICacheManager并得到了一个名为MyCache的缓存。缓存名称是大小写敏感的,意味着“MyCache”和“MYCACHE”是不同的缓存。

  警告:GetCache方法

  不要在构造函数中使用GetCache。如果类不是单例的话,缓存可能会被释放。

ICache

  ICacheManager.GetCaChe方法返回ICache。缓存是单例的(每个缓存名称)。首次需要的时候创建,然后每次都返回同样的缓存对象。所以,我们可以在不同的类(客户端)使用相同的名字共享同样的缓存。

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

  • Key:缓存中一个项的唯一字符串键。
  • factory:如果指定的键没有项目时调用的方法。工厂方法应该创建并返回真实的项。如果指定的键在缓存中存在的话就不会调用这个方法。

  ICache接口也有如GetOrDefault,Set,Remove和Clear这样的方法。同样也有这些方法的异步版本。

ITypedCache

ICache接口使用string类型作为键,object作为值。ITypeCache是ICache的包装器,用来提供类型安全、泛型的缓存。我们可以使用GetCache扩展方法获得ITypedCache:

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

  我们也可以使用AsTyped扩展方法将一个已存在的ICache实例转换为ITypedCache。

 

2.3 缓存