中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

keycloak~分(fen)布式(shi)緩存的使(shi)用

keycloak目(mu)前提供(gong)了幾(ji)種分布(bu)式緩(huan)存(cun),我們自(zi)己的緩(huan)存(cun),如(ru)果(guo)希望是分布(bu)式的,可(ke)以將緩(huan)存(cun)添加到以下(xia)幾(ji)個緩(huan)存(cun)里即可(ke)

  • actionTokens
  • clientSessions
  • loginFailures
  • offlineClientSessions
  • offlineSessions
  • sessions
  • work

如果你希望自己開發分布式緩存,還是需要復雜的,需要配置,檢查,獲取遠程分布式緩存的代碼,比較復雜,有興趣的同學,可以查看keycloak源代碼,關于keycloak-model-infinispan項目的實現。

直接使用現有分布式緩存

下面代碼,將在現有(you)的(de)work緩(huan)存里,添加自(zi)己的(de)緩(huan)存hello,后綴是(shi)用戶ID,生命(ming)周期是(shi)access_token的(de)有(you)效期秒數

// 獲取 Infinispan 連接提供程序和緩存領域提供程序
InfinispanConnectionProvider connectionProvider =
  keycloakSession.getProvider(InfinispanConnectionProvider.class);
String key = "hello_" + userId;
if (connectionProvider.getCache("work") != null) {
int life=keycloakSession.getContext().getRealm().getAccessTokenLifespan();
connectionProvider.getCache("work").put(key, "ok", life, TimeUnit.SECONDS);
}

注意,上面代碼只有第一次使用緩存時才會在集群上初始化,如果希望修改現有緩存的內容,它是不會進行初始化的,需要我們通過廣播(發布/訂閱)的方式通知其它節點

緩存的廣播消息

# 注冊
  keycloakSessionFactory.register((ProviderEvent event1) -> {
      if (event1 instanceof PostMigrationEvent) {
        KeycloakModelUtils.runJobInTransaction(keycloakSessionFactory, session -> {
          InfinispanConnectionProvider provider = session.getProvider(InfinispanConnectionProvider.class);

          ClusterProvider cluster = session.getProvider(ClusterProvider.class);
          cluster.registerListener(WECHAT_WORK_EVENT, (ClusterEvent event) -> {
            if (event instanceof FanoutEvent) {
              FanoutEvent fanoutEvent = (FanoutEvent) event;
              System.out.println("registerListener收到事件訂閱");
              if (StringUtils.isNotBlank(fanoutEvent.getType())) {
                provider.getCache(REALM_CACHE_NAME).remove(fanoutEvent.getType());
              }
            }
          });
        });
      }
    });

# 發布
ClusterProvider cluster = session.getProvider(ClusterProvider.class);
FanoutEvent fanoutEvent = new FanoutEvent();
cluster.notify(WECHAT_WORK_EVENT,fanoutEvent , false, ClusterProvider.DCNotify.ALL_DCS);

緩存模式

Infinispan支持(chi)四種(zhong)緩(huan)存模(mo)式(shi):本(ben)(ben)地(Local)模(mo)式(shi)、復制(Replicated)模(mo)式(shi)、失效(xiao)(Invalidation)模(mo)式(shi)、分布(bu)式(shi)(Distribution)模(mo)式(shi)。除本(ben)(ben)地模(mo)式(shi)外,其他(ta)三(san)種(zhong)模(mo)式(shi)均為(wei)集群模(mo)式(shi)緩(huan)存。

3.1 本地模式

本(ben)地(di)模(mo)式下,數據緩存在(zai)本(ben)地(di)內存,節點(dian)間數據不共享。Infinispan的cache對象繼承自Java的ConcurrentMap,和直接采(cai)用map相比,其優勢在(zai)于:

支持緩存數據持久化,支持mongodb、leveldb等多種數據庫。Infinispan通過設置cache store僅將將上述數據庫作為緩存數據的存儲介質,并不涉及數據庫本身的其他高級特性。
支持eviction策略,避免內存耗盡。
支持expiration策略,保證長期未被使用的數據被清除。
基于MVCC的并發處理策略,采用CAS和其他lock-free算法保證高性能。
*事務性保證。

3.2 失效模式

失(shi)效模式下(xia),數(shu)(shu)(shu)(shu)據(ju)(ju)需持(chi)久化到數(shu)(shu)(shu)(shu)據(ju)(ju)庫(ku)(或其他持(chi)久化設備(bei))中,節點間并不共享任(ren)何數(shu)(shu)(shu)(shu)據(ju)(ju)。當(dang)發生數(shu)(shu)(shu)(shu)據(ju)(ju)更新(xin)時,更新(xin)數(shu)(shu)(shu)(shu)據(ju)(ju)庫(ku)并通(tong)知其他節點該數(shu)(shu)(shu)(shu)據(ju)(ju)已過期。節點發現數(shu)(shu)(shu)(shu)據(ju)(ju)過期后,采用(yong)lazy策略從(cong)數(shu)(shu)(shu)(shu)據(ju)(ju)庫(ku)更新(xin)至(zhi)緩存。這樣做的好處(chu)在于:

  1. 網絡負荷最小化。和復制模式下更新數據相比,失效消息要小的多,有效降低了網絡負荷。
  2. 延遲更新。節點發現數據失效后,無需立即更新數據,僅當需訪問該數據時才執行更新。
  3. 支持同步、異步兩種失效方式。
  4. 同步失效:發送失效通知,并等待所有節點響應(收到失效消息,并逐出過期數據)后返回。
  5. 異步失效:發送失效通知,廣播至所有節點,并直接返回。
  6. 數據存在持久化需求,緩存作為持久數據的中間層。在讀操作頻繁的場景下,采用Infinispan,避免每次直接訪問數據庫,提高讀取性能。

3.3 復制模式

  1. 復制模式是集群模式的一種,在該模式任何一個節點的數據變更將復制到其他所有節點上,這使得集群中任何一個節點都包含了完整的緩存數據。
  2. 和嵌入式模式組合時,所有數據均保存在應用程序本地,讀操作僅需訪問本地內存,性能最高。
  3. 和C\S模式組合時,因為數據都保存在遠端,讀寫都需要進行一次遠端訪問,此時復制模式和分布式模式相比并無明顯優勢。
  4. Infinispan設計了同步、異步兩種方式用于將本節點的數據變更操作通知到其他節點,對于每種操作又支持TCP、UDP兩種通信方式。采用UDP協議時,通過疊加JGroups的NAKACK2和UNICAST3保證傳輸的可靠性,具體可參見[JGroups支持]。

3.4 分布式(shi)(Distributed)模式(shi)

分布模式是Infinispan支持的可擴展性最好的一種模式。在這種模式下,用戶可以配置固定數量(numOwners)的副本數,而不需要復制數據到所有的節點上。復制有限個副本既可以控制開銷,也可以帶來數據訪問性能和可靠性的提升。
在集群中,Infinispan通過一致性哈希(Consistent Hashing)算法來確定數據訪問和存儲的位置。使用一致性哈希是好處是:當現有節點失效或新節點加入時,系統不需要重新計算哈希來重新分配數據在集群中的存儲位置。
和復制模式相比,優勢如下:

可擴展性:對集群節點數量沒有限制,可根據業務需要,靈活的增、刪節點。
數據網格:假設集群中有三個節點A,B,C,內存大小為8G,復制模式下集群容量為8G。分布式模式下,如果每個條目保存在2個節點上,集群的容量為(8 G* 3) / 2 = 12G。

和復(fu)制模(mo)式一樣,分(fen)布式模(mo)式也支持同步和異步兩(liang)種模(mo)式

posted @ 2023-11-21 19:26  張占嶺  閱讀(531)  評論(0)    收藏  舉報