【BlogBook书】4、Cache:缓存

2024-01-15 17:37:58 浏览数 (1)

框架已经将缓存集成到了官方的IDistributedCache分布式缓存接口,可以直接使用内存缓存和分布式缓存。

默认使用内存缓存,开启Redis开关以后,使用分布式缓存。

一、相关的依赖注入配置

代码语言:javascript复制
builder.Services.AddCacheSetup();

相关参数设置

代码语言:javascript复制
"Redis": {
    "Enable": false,//是否开启redis缓存
    "ConnectionString": "127.0.0.1:6379",//可以配置密码
    "InstanceName": "" //前缀
  },

两种缓存机制统一封装,并二次封装到了ICache接口。

代码语言:javascript复制
/// <summary>
/// 统一注册缓存
/// </summary>
/// <param name="services"></param>
public static void AddCacheSetup(this IServiceCollection services)
{
  var cacheOptions = App.GetOptions<RedisOptions>();
  if (cacheOptions.Enable)
  {
    // 配置启动Redis服务,虽然可能影响项目启动速度,但是不能在运行的时候报错,所以是合理的
    services.AddSingleton<IConnectionMultiplexer>(sp =>
    {
      //获取连接字符串
      var configuration = ConfigurationOptions.Parse(cacheOptions.ConnectionString, true);
      configuration.ResolveDns = true;
      return ConnectionMultiplexer.Connect(configuration);
    });
    services.AddSingleton<ConnectionMultiplexer>(p => p.GetService<IConnectionMultiplexer>() as ConnectionMultiplexer);
    //使用Redis
    services.AddStackExchangeRedisCache(options =>
    {
      options.ConnectionMultiplexerFactory = () => Task.FromResult(App.GetService<IConnectionMultiplexer>(false));
      if (!cacheOptions.InstanceName.IsNullOrEmpty()) options.InstanceName = cacheOptions.InstanceName;
    });

    services.AddTransient<IRedisBasketRepository, RedisBasketRepository>();
  }
  else
  {
    //使用内存
    services.AddMemoryCache();
    services.AddDistributedMemoryCache();
  }

  services.AddSingleton<ICaching, Caching>();
}

二、使用方式

1、通过ICache的二次封装,直接注入ICache即可。

代码语言:javascript复制
private readonly ICaching _caching;

public CacheManageController(ICaching caching)
{
  _caching = caching;
}

/// <summary>
/// 获取全部缓存
/// </summary>
/// <returns></returns>
[HttpGet]
public async Task<MessageModel<List<string>>> Get()
{
  return Success(await _caching.GetAllCacheKeysAsync());
}

0 人点赞