keycloak~緩存的使用


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字典,這完全是沒有必要的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM