高速缓存

介绍

ASP.NET Boilerplate提供了缓存的抽象。它在内部使用此缓存抽象。虽然默认实现使用 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”是两个不同的缓存。

ICACHE

ICacheManager。GetCache方法返回一个ICache缓存是单例(每个缓存名称)。它是在第一次请求时创建的,然后始终返回相同的缓存对象。这样我们就可以在不同的类(客户端)中共享具有相同名称的相同缓存。

在示例代码中,我们看到了ICache的简单用法。获取方法。它有两个参数:

ICache接口还具有GetOrDefaultSet, RemoveClear等方法所有方法都有异步版本。

ITypedCache

所述ICACHE接口使用字符串作为密钥和对象作为值。 ITypedCacheICache的包装器,用于提供类型安全的通用缓存。我们可以使用通用的GetCache扩展方法来获取ITypedCache:

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

我们还可以使用AsTyped扩展方法将现有的ICache实例转换为ITypedCache。

组态

默认缓存过期时间为60分钟。它正在滑动,所以如果你不在缓存中使用一个项目60分钟,它会自动从缓存中删除。您可以为所有缓存或特定缓存配置它。

//Configuration for all caches
Configuration.Caching.ConfigureAll(cache =>
{
    cache.DefaultSlidingExpireTime = TimeSpan.FromHours(2);
});

//Configuration for a specific cache
Configuration.Caching.Configure("MyCache", cache =>
{
    cache.DefaultSlidingExpireTime = TimeSpan.FromHours(8);
});

此代码应放在 模块的 PreInitialize方法中。使用此代码,“MyCache”将在8小时后到期,而所有其他缓存项目将在2小时后到期。

首次创建缓存(第一次请求时)将调用您的配置操作。配置不仅限于DefaultSlidingExpireTime,因为缓存对象是ICache,您可以使用它的属性和方法来自由配置和初始化它。

实体缓存

虽然ASP.NET Boilerplate的缓存系统是出于一般目的,但是如果要缓存实体,可以使用 EntityCache基类来帮助您。如果我们通过它们的ID获取实体并且我们想要通过Id缓存它们,那么我们可以使用这个基类,以便不重复从数据库中查询。假设我们有一个像这样的Person实体:

public class Person : Entity
{
    public string Name { get; set; }

    public int Age { get; set; }
}

假设我们经常想要得到的名称的人,而我们知道他们的标识首先,我们创建一个用于存储缓存项的类

[AutoMapFrom(typeof(Person))]
public class PersonCacheItem
{
    public string Name { get; set; }
}

不要将实体直接存储在缓存中,因为缓存可能需要序列化缓存的对象。实体可能无法序列化,特别是如果它们具有导航属性。这就是为什么我们定义了一个简单的(DTO)类来将数据存储在缓存中。我们添加了AutoMapFrom属性,因为我们想要使用AutoMapper自动将Person实体转换为PersonCacheItem对象。如果我们不使用AutoMapper,我们应该覆盖 EntityCache类的MapToCacheItem方法来手动转换/映射它。

虽然不是必需的,但我们可能希望为缓存类定义一个接口:

public interface IPersonCache : IEntityCache<PersonCacheItem>
{

}

最后,我们可以创建缓存类来缓存Person实体:

public class PersonCache : EntityCache<Person, PersonCacheItem>, IPersonCache, ITransientDependency
{
    public PersonCache(ICacheManager cacheManager, IRepository<Person> repository)
        : base(cacheManager, repository)
    {

    }
}

而已。我们的人员缓存已准备就绪!缓存类可以是瞬态的(如本例所示)或单例。这并不意味着缓存的数据是暂时的。它始终全局缓存,并在您的应用程序中以线程安全的方式访问。

每当我们需要一个人名字时,我们就可以通过使用该人的ID从缓存中获取它这是一个使用Person缓存的示例类:

public class MyPersonService : ITransientDependency
{
    private readonly IPersonCache _personCache;

    public MyPersonService(IPersonCache personCache)
    {
        _personCache = personCache;
    }

    public string GetPersonNameById(int id)
    {
        return _personCache[id].Name; //alternative: _personCache.Get(id).Name;
    }
}

我们只需注入 IPersonCache,获取缓存项,然后获取Name属性。

EntityCache的工作原理

如果您需要更复杂的缓存要求,可以扩展EntityCache或创建自己的解决方案。

Redis缓存集成

默认缓存管理器使用内存缓存。如果您有多个并发Web服务器运行相同的应用程序,则可能会出现问题。在这种情况下,您可能需要分布式/中央缓存服务器。您可以轻松地将Redis用作缓存服务器。

首先,您需要将Abp.RedisCache NuGet包安装 到您的应用程序中(例如,您可以将其安装到Web项目中)。然后,您需要AbpRedisCacheModule添加DependsOn属性,模块PreInitialize方法中调用UseRedis扩展方法 ,如下所示:

//...other namespaces
using Abp.Runtime.Caching.Redis;

namespace MyProject.AbpZeroTemplate.Web
{
    [DependsOn(
        //...other module dependencies
        typeof(AbpRedisCacheModule))]
    public class MyProjectWebModule : AbpModule
    {
        public override void PreInitialize()
        {
            //...other configurations
            
            Configuration.Caching.UseRedis();
        }
        
        //...other code
    }
}

默认情况下,Abp.RedisCache包使用“ localhost ”作为连接字符串您可以在配置文件中添加连接字符串以覆盖它。例:

<add name="Abp.Redis.Cache" connectionString="localhost"/>

此外,您可以向appSettings添加设置以设置Redis的数据库ID。例:

<add key="Abp.Redis.Cache.DatabaseId" value="2"/>

不同的数据库ID对于在同一服务器中创建不同的密钥空间(隔离的高速缓存)很有用。

UseRedis方法还具有一个过载的是取直接设置选项值的动作(这将覆盖在配置文件中的值)。

有关Redis及其配置的更多信息,请参阅Redis文档

注意:应安装并运行Redis服务器以在ABP中使用Redis缓存。

nidie.com.cn - 用心与你沟通