keycloak緩存的級別,往大了說有realm級的,一個realm是一個緩存,這也是它的生命周期;往小了說,也有user級的,即一個用戶一個緩存,當a用戶和b用戶,它們的緩存是兩個。
緩存提供者
InfinispanConnectionProvider
是一個接口,主要是對infinispan緩存的規定,有默認的實現DefaultInfinispanConnectionProvider
,它內包含了嵌入的infinispan緩存和遠程的infinispan,分為兩個獨立的方法getCache和getRemoteCache,我們根據自己的情況而用。
緩存級別
- KEYS_CACHE_NAME key的字典緩存
- REALM_CACHE_NAME 域的數據緩存
- USER_CACHE_NAME 每個用戶的緩存
緩存使用
下面是一個標准的緩存邏輯代碼,功能是為域添加一個緩存,叫USER_IP_ADDRESS,存儲ip的字典信息
public static List<GroupAttributeEntity> getIpFromCache(KeycloakSession session) {
InfinispanConnectionProvider provider = session.getProvider(InfinispanConnectionProvider.class);
// 注意:REALM_CACHE_NAME表示域級別的緩存,USER_CACHE_NAME是用戶級別的,咱們這個使用域緩存即可
if (provider.getCache(REALM_CACHE_NAME) != null) {
if (!provider.getCache(REALM_CACHE_NAME).containsKey(USER_IP_ADDRESS)) {
provider.getCache(REALM_CACHE_NAME).put(USER_IP_ADDRESS, getIpListFromDb(session), 24, TimeUnit.HOURS);
}
List<GroupAttributeEntity> ipList = (List<GroupAttributeEntity>) provider.getCache(REALM_CACHE_NAME).get(USER_IP_ADDRESS);
return ipList;
}
return getIpListFromDb(session);
}
之前犯了一個很傻的錯誤,把REALM_CACHE_NAME寫成了USER_CACHE_NAME,導致每個用戶都存了一份IP字典,這完全是沒有必要的。