客户端,作用域和用户仓库的缓存


layout: docs-default

客户端,作用域和用户仓库的缓存

IdentityServer有几种方法从数据库中读取数据到内存中。由于IdentityServer的解耦设计,同一个HTTP请求,可能会导致好几次装载数据。这会导致好几次数据库读取动作。由于这种可能性,IdentityServer设计了一个缓存接口,我们可以实现自己的缓存机制。IdentityServer也提供了一个默认的缓存实现。

默认缓存

IdentityServer提供的缓存是一个内存缓存,缓存的数据有指定的生存期。默认缓存(真的很简单)可以解决大部分性能问题。配置默认缓存,需要使用下面IdentityServerServiceFactory的扩展方法:

  • ConfigureClientStoreCache
  • ConfigureScopeStoreCache
  • ConfigureUserServiceCache
    每个方法都有一些过载,可以无参数调用(默认过期时间5分钟),或者TimeSpan参数来指定过期时间。具体用法如下:
var factory = InMemoryFactory.Create(
    users:   Users.Get(),
    clients: Clients.Get(),
    scopes:  Scopes.Get());

factory.ConfigureClientStoreCache();
factory.ConfigureScopeStoreCache();
factory.ConfigureUserServiceCache(TimeSpan.FromMinutes(1));

这些方法需要在设置合适的存储到IdentityServerServiceFactory后调用,他们实际上使用decorator模式包装了实际的存储实现.

自定义缓存

如果需要自定义实现缓存(比如Redis),那么要缓存的数据需要实现ICache,这个缓存接口定义了下面的API:
If a custom cache impelmentation is desired (e.g. using reddis), then you can implement the ICache for the data that needs to be cached. The cache interface defines this API:

  • Task SetAsync(string key, T item)
    • keyitem 会被缓存.
  • Task GetAsync(string key)
    • key用来从缓存获取数据,如果缓存中没有,那么返回null.

上面描述的IdentityServerServiceFactory 扩展方法也有支持Registration的过载方法,来注册自定义的缓存服务:

  • ConfigureClientStoreCache(Registration> cacheRegistration)
  • ConfigureScopeStoreCache(Registration>> cacheRegistration)
  • ConfigureUserServiceCache(Registration>> cacheRegistration)

你可能感兴趣的:(客户端,作用域和用户仓库的缓存)