keycloak~緩存(cun)的使(shi)用(yong)
keycloak緩存(cun)的(de)(de)級別,往(wang)大了(le)說有realm級的(de)(de),一個(ge)realm是(shi)一個(ge)緩存(cun),這也(ye)(ye)是(shi)它的(de)(de)生(sheng)命周期;往(wang)小了(le)說,也(ye)(ye)有user級的(de)(de),即一個(ge)用戶(hu)一個(ge)緩存(cun),當a用戶(hu)和(he)b用戶(hu),它們的(de)(de)緩存(cun)是(shi)兩個(ge)。
緩存提供者
InfinispanConnectionProvider是一個接口,主要是對infinispan緩存的規定,有默認的實現DefaultInfinispanConnectionProvider,它(ta)內包含了嵌入的(de)(de)infinispan緩(huan)存和遠程的(de)(de)infinispan,分為兩個(ge)獨立的(de)(de)方(fang)法getCache和getRemoteCache,我們根據自己的(de)(de)情況而(er)用。
緩存級別
- KEYS_CACHE_NAME key的字典緩存
- REALM_CACHE_NAME 域的數據緩存
- USER_CACHE_NAME 每個用戶的緩存
緩存使用
下面是一(yi)(yi)個標(biao)準的緩存邏輯代碼(ma),功能(neng)是為域添加一(yi)(yi)個緩存,叫USER_IP_ADDRESS,存儲ip的字(zi)典信息
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);
}
之前(qian)犯了一(yi)個很傻的錯誤,把(ba)REALM_CACHE_NAME寫成了USER_CACHE_NAME,導(dao)致每(mei)個用(yong)戶(hu)都存了一(yi)份IP字典,這完全是沒有必(bi)要的。