7.14. 基于流的接口
红帽构建的 Keycloak 中的许多用户存储接口包含可以返回潜在大量对象的查询方法,这可能会在内存消耗和处理时间方面造成显著影响。当查询方法的逻辑中只使用对象的内部状态时,这尤其如此。
为了为开发人员提供了更有效的、处理这些查询方法中大型数据集的替代选择,已将 Streams
子接口添加到用户存储接口中。这些 Streams
子接口将超级接口中的基于原始集合的方法替换为基于流的变体,使基于集合的方法被默认。基于集合的查询方法的默认实现调用其 流
对应部分,并将结果收集到正确的集合类型。
Streams
子接口允许实现重点放在基于流的方法处理数据集,并从该方法的潜在内存和性能优化中受益。提供要实施的 Streams
子接口的接口包括几个 功能接口,org.keycloak.storage.federated
软件包中所有接口,以及可能根据自定义存储实施的范围来实施的其他接口。
请参阅此为开发人员提供 Streams
子接口的接口列表。
软件包 | 类 |
|
|
|
|
| 所有接口 |
|
|
AssumeRole 表示接口是一个 功能接口
要从流方法中受益的自定义用户存储实现应该只实现 Streams
子接口,而不是原始接口。例如,以下代码使用 UserQueryProvider
接口的 Streams
变体:
public class CustomQueryProvider extends UserQueryProvider.Streams { ... @Override Stream<UserModel> getUsersStream(RealmModel realm, Integer firstResult, Integer maxResults) { // custom logic here } @Override Stream<UserModel> searchForUserStream(String search, RealmModel realm) { // custom logic here } ... }
public class CustomQueryProvider extends UserQueryProvider.Streams {
...
@Override
Stream<UserModel> getUsersStream(RealmModel realm, Integer firstResult, Integer maxResults) {
// custom logic here
}
@Override
Stream<UserModel> searchForUserStream(String search, RealmModel realm) {
// custom logic here
}
...
}