keycloak~緩存的使用
keycloak緩存的級(jí)別,往大了說有realm級(jí)的,一個(gè)realm是一個(gè)緩存,這也是它的生命周期;往小了說,也有user級(jí)的,即一個(gè)用戶一個(gè)緩存,當(dāng)a用戶和b用戶,它們的緩存是兩個(gè)。
緩存提供者
InfinispanConnectionProvider是一個(gè)接口,主要是對infinispan緩存的規(guī)定,有默認(rèn)的實(shí)現(xiàn)DefaultInfinispanConnectionProvider,它內(nèi)包含了嵌入的infinispan緩存和遠(yuǎn)程的infinispan,分為兩個(gè)獨(dú)立的方法getCache和getRemoteCache,我們根據(jù)自己的情況而用。
緩存級(jí)別
- KEYS_CACHE_NAME key的字典緩存
- REALM_CACHE_NAME 域的數(shù)據(jù)緩存
- USER_CACHE_NAME 每個(gè)用戶的緩存
緩存使用
下面是一個(gè)標(biāo)準(zhǔn)的緩存邏輯代碼,功能是為域添加一個(gè)緩存,叫USER_IP_ADDRESS,存儲(chǔ)ip的字典信息
public static List<GroupAttributeEntity> getIpFromCache(KeycloakSession session) {
InfinispanConnectionProvider provider = session.getProvider(InfinispanConnectionProvider.class);
// 注意:REALM_CACHE_NAME表示域級(jí)別的緩存,USER_CACHE_NAME是用戶級(jí)別的,咱們這個(gè)使用域緩存即可
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);
}
之前犯了一個(gè)很傻的錯(cuò)誤,把REALM_CACHE_NAME寫成了USER_CACHE_NAME,導(dǎo)致每個(gè)用戶都存了一份IP字典,這完全是沒有必要的。
浙公網(wǎng)安備 33010602011771號(hào)