Skip to content

缓存

ABP 框架扩展了 ASP.NET Core 的分布式缓存系统. ABP vNext Pro 已集成 Redis 做为缓存。

配置

appsetting.json
1
2
3
4
"Redis":
  {
     "Configuration": "localhost,password=1q2w3E*,defaultdatabase=1"
  }

AbpDistributedCacheOptions

示例:为应用程序设置缓存键前缀

AbpProHttpApiHostModule.cs
1
2
3
4
Configure<AbpDistributedCacheOptions>(options =>
{
    options.KeyPrefix = "MyApp1";
});

可用选项

  • HideErrors (bool, 默认: true): 启用/禁用隐藏从缓存服务器写入/读取值时的错误.
  • KeyPrefix (string, 默认: null): 如果你的缓存服务器由多个应用程序共同使用, 则可以为应用程序的缓存键设置一个前缀. 在这种情况下, 不同的应用程序不能覆盖彼此的缓存内容.
  • GlobalCacheEntryOptions (DistributedCacheEntryOptions): 用于设置保存缓内容却没有指定选项时, 默认的分布式缓存选项 (例如 AbsoluteExpirationSlidingExpiration). SlidingExpiration的默认值设置为 20 分钟.

使用方式

示例: 在缓存中存储图书名称和价格

C#
1
2
3
4
5
6
7
8
9
namespace MyProject
{
    public class BookCacheItem
    {
        public string Name { get; set; }

        public float Price { get; set; }
    }
}

你可以注入 IDistributedCache<BookCacheItem> 服务用于 get/set BookCacheItem 对象.

C#
using System;
using System.Threading.Tasks;
using Microsoft.Extensions.Caching.Distributed;
using Volo.Abp.Caching;
using Volo.Abp.DependencyInjection;

namespace MyProject
{
    public class BookService : ITransientDependency
    {
        private readonly IDistributedCache<BookCacheItem> _cache;

        public BookService(IDistributedCache<BookCacheItem> cache)
        {
            _cache = cache;
        }

        public async Task<BookCacheItem> GetAsync(Guid bookId)
        {
            return await _cache.GetOrAddAsync(
                bookId.ToString(), //缓存键
                async () => await GetBookFromDatabaseAsync(bookId),
                () => new DistributedCacheEntryOptions
                {
                    AbsoluteExpiration = DateTimeOffset.Now.AddHours(1)
                }
            );
        }

        private Task<BookCacheItem> GetBookFromDatabaseAsync(Guid bookId)
        {
            //TODO: 从数据库获取数据
        }
    }
}
  • 示例服务代码中的 GetOrAddAsync() 方法从缓存中获取图书项. GetOrAddAsync是 ABP 框架在 ASP.NET Core 分布式缓存方法中添增的附加方法.
  • 如果没有在缓存中找到图书,它会调用工厂方法 (本示例中是 GetBookFromDatabaseAsync)从原始数据源中获取图书项.
  • GetOrAddAsync 有一个可选参数 DistributedCacheEntryOptions , 可用于设置缓存的生命周期.

批量操作

ABP 的分布式缓存接口定义了以下批量操作方法,当你需要在一个方法中调用多次缓存操作时,这些方法可以提高性能

  • SetManyAsyncSetMany 方法可以用来向缓存中设置多个值.
  • GetManyAsyncGetMany 方法可以用来从缓存中获取多个值.
  • GetOrAddManyAsyncGetOrAddMany 方法可以用来从缓存中获取并添加缺少的值.
  • RefreshManyAsyncRefreshMany 方法可以来用重置多个值的滚动过期时间.
  • RemoveManyAsyncRemoveMany 方法可以用来从缓存中删除多个值.

这些不是标准的 ASP.NET Core 缓存方法, 所以某些提供程序可能不支持. [ABP Redis 集成包]实现了它们. 如果提供程序不支持,会回退到 SetAsyncGetAsync ... 方法(循环调用).