7.10. 用户缓存


当用户对象通过 ID、用户名或电子邮件查询加载时,会缓存它。当缓存用户对象时,它会迭代整个 UserModel 接口,并将这些信息拉取到本地的内存中缓存。在集群中,此缓存仍然是本地的,但会变得失效缓存。修改用户对象时,它将被驱除。此驱除事件被传播到整个集群,以便其他节点的用户缓存也无效。

7.10.1. 管理用户缓存

您可以通过调用 KeycloakSession.getProvider (UserCache.class) 来访问用户缓存。

/**
 * All these methods effect an entire cluster of Keycloak instances.
 *
 * @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
 * @version $Revision: 1 $
 */
public interface UserCache extends UserProvider {
    /**
     * Evict user from cache.
     *
     * @param user
     */
    void evict(RealmModel realm, UserModel user);

    /**
     * Evict users of a specific realm
     *
     * @param realm
     */
    void evict(RealmModel realm);

    /**
     * Clear cache entirely.
     *
     */
    void clear();
}
Copy to Clipboard Toggle word wrap

有可驱除特定用户、特定域中包含的用户或整个缓存的方法。

7.10.2. OnUserCache 回调接口

您可能需要缓存特定于您的供应商实现的额外信息。每当用户缓存时,User Storage SPI 都有一个回调: org.keycloak.models.cache.OnUserCache

public interface OnUserCache {
    void onCache(RealmModel realm, CachedUserModel user, UserModel delegate);
}
Copy to Clipboard Toggle word wrap

如果您希望此回调,您的供应商类应该实现这个接口。UserModel delegate 参数是您的供应商返回的 UserModel 实例。CachedUserModel 是一个展开的 UserModel 接口。这是本地缓存在本地存储中的实例。

public interface CachedUserModel extends UserModel {

    /**
     * Invalidates the cache for this user and returns a delegate that represents the actual data provider
     *
     * @return
     */
    UserModel getDelegateForUpdate();

    boolean isMarkedForEviction();

    /**
     * Invalidate the cache for this model
     *
     */
    void invalidate();

    /**
     * When was the model was loaded from database.
     *
     * @return
     */
    long getCacheTimestamp();

    /**
     * Returns a map that contains custom things that are cached along with this model.  You can write to this map.
     *
     * @return
     */
    ConcurrentHashMap getCachedWith();
}
Copy to Clipboard Toggle word wrap

CachedUserModel 接口允许您从缓存中驱除用户并获取供应商 UserModel 实例。getCachedWith () 方法返回一个映射,允许您缓存与用户相关的其他信息。例如,凭证不是 UserModel 接口的一部分。如果要在内存中缓存凭证,则需要实施 OnUserCache,并使用 getCachedWith () 方法缓存用户的凭据。

7.10.3. 缓存策略

在用户存储供应商的管理控制台管理页面中,您可以指定一个唯一的缓存策略。

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat