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字典,這完全是沒有必要的,
作者:倉儲大叔,張占嶺,
榮譽:微軟MVP
QQ:853066980
支付寶掃一掃,為大叔打賞!

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/340318.html
標籤:Java
