首页 > 其他分享 >keycloak~分布式缓存的使用

keycloak~分布式缓存的使用

时间:2023-11-21 19:34:22浏览次数:33  
标签:缓存 模式 失效 keycloak 数据 节点 分布式

keycloak目前提供了几种分布式缓存,我们自己的缓存,如果希望是分布式的,可以将缓存添加到以下几个缓存里即可

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

如果你希望自己开发分布式缓存,还是需要复杂的,需要配置,检查,获取远程分布式缓存的代码,比较复杂,有兴趣的同学,可以查看keycloak源代码,关于keycloak-model-infinispan项目的实现。

直接使用现有分布式缓存

下面代码,将在现有的work缓存里,添加自己的缓存hello,后缀是用户ID,生命周期是access_token的有效期秒数

// 获取 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, "", life, TimeUnit.SECONDS);
}

缓存模式

Infinispan支持四种缓存模式:本地(Local)模式、复制(Replicated)模式、失效(Invalidation)模式、分布式(Distribution)模式。除本地模式外,其他三种模式均为集群模式缓存。

3.1 本地模式

本地模式下,数据缓存在本地内存,节点间数据不共享。Infinispan的cache对象继承自Java的ConcurrentMap,和直接采用map相比,其优势在于:

支持缓存数据持久化,支持mongodb、leveldb等多种数据库。Infinispan通过设置cache store仅将将上述数据库作为缓存数据的存储介质,并不涉及数据库本身的其他高级特性。
支持eviction策略,避免内存耗尽。
支持expiration策略,保证长期未被使用的数据被清除。
基于MVCC的并发处理策略,采用CAS和其他lock-free算法保证高性能。
*事务性保证。

3.2 失效模式

失效模式下,数据需持久化到数据库(或其他持久化设备)中,节点间并不共享任何数据。当发生数据更新时,更新数据库并通知其他节点该数据已过期。节点发现数据过期后,采用lazy策略从数据库更新至缓存。这样做的好处在于:

  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 分布式(Distributed)模式

分布模式是Infinispan支持的可扩展性最好的一种模式。在这种模式下,用户可以配置固定数量(numOwners)的副本数,而不需要复制数据到所有的节点上。复制有限个副本既可以控制开销,也可以带来数据访问性能和可靠性的提升。
在集群中,Infinispan通过一致性哈希(Consistent Hashing)算法来确定数据访问和存储的位置。使用一致性哈希是好处是:当现有节点失效或新节点加入时,系统不需要重新计算哈希来重新分配数据在集群中的存储位置。
和复制模式相比,优势如下:

可扩展性:对集群节点数量没有限制,可根据业务需要,灵活的增、删节点。
数据网格:假设集群中有三个节点A,B,C,内存大小为8G,复制模式下集群容量为8G。分布式模式下,如果每个条目保存在2个节点上,集群的容量为(8 G* 3) / 2 = 12G。

和复制模式一样,分布式模式也支持同步和异步两种模式

标签:缓存,模式,失效,keycloak,数据,节点,分布式
From: https://www.cnblogs.com/lori/p/17847379.html

相关文章

  • 聊聊分布式 SQL 数据库Doris(三)
    在Doris的存储引擎规则:表的数据是以分区为单位存储的,不指定分区创建时,默认就一个分区.用户数据首先被划分成若干个分区(Partition),划分的规则通常是按照用户指定的分区列进行范围划分,比如按时间划分。在每个分区内,数据被进一步的按照Hash的方式分桶,分桶的规则是要找用户指定......
  • 为Oracle链接服务器使用分布式事务
    1现象在SQLServer中创建指向Oracle的链接服务器,SQL语句在事务中向链接服务器插入数据。返回链接服务器无法启动分布式事务的报错。 2解决在Windows平台下,SQLServer依赖分布式事务协调器(MSDTC)来使用分布式事务,OracleClient使用OracleServicesforMicrosoftTransact......
  • 分布式锁笔记
    分布式锁基于上课和教材(分布式中间件技术实战-java版-钟林森)的笔记1概述因为集群、分布式部署的服务实例一般是部署在不同机器上的,在分布式系统架构下,此种资源共享将不再是传统的线程共享,而是跨JVM进程之间资源的共享了。因此,为了解决这种问题,我们引入了“分布式锁”。1.1......
  • Vue 项目每次发版后要清理浏览器缓存 问题
    configureWebpack:{//providetheapp'stitleinwebpack'snamefield,sothat//itcanbeaccessedinindex.htmltoinjectthecorrecttitle.name:name,resolve:{alias:{'@':resolve('src'......
  • Util应用框架基础(七) - 缓存
    本节介绍Util应用框架如何操作缓存.概述缓存是提升性能的关键手段之一.除了提升性能,缓存对系统健壮性和安全性也有影响.不同类型的系统对缓存的依赖程度不同.对于后台管理系统,由于是给管理人员使用的,用户有限,而且操作基本都需要身份认证和授权,甚至可能部署在局域网内,一......
  • 聊聊分布式 SQL 数据库Doris(二)
    Doris中,Leader节点与非Leader节点和Observer节点之间的元数据高可用和一致性,是通过bdbje(全称:OracleBerkeleyDBJavaEdition)的一致性和高可用实现的。元数据与同步流程元数据主要存储四类数据:用户数据信息.包括数据库,表的schema,分片信息等各类作业信息.如导入作业......
  • 分布式事务 Seata 集群搭建
    Seata是蚂蚁金服和阿里巴巴共同开源的一款分布式事务项目,致力于在微服务架构下提供高性能和简单易用的分布式事务解决方案。自诞生以来就备受国内开发人员推崇,在实际工作中使用者甚多。Seata提供了四种不同的分布式事务解决方案:XA模式:强一致性分阶段事务模式,牺牲了一定的可用......
  • 聊聊分布式 SQL 数据库Doris(一)
    MPPMPP:MassivelyParallelProcessing,即大规模并行处理.一般用来指多个SQL数据库节点搭建的数据仓库系统.执行查询的时候,查询可以分散到多个SQL数据库节点上执行,然后汇总返回给用户.DorisDoris作为一款开源的MPP架构OLAP高性能、实时的分析型数据库,能够运行在绝......
  • 分布式文件访问方案
    中心机房1.cpeh存储源站文件,利于横向扩展。2.7层负载均衡将分站访问分布在不同的nginx缓存服务器,分担访问。3.nginx使用proxy_cache将ceph的访问文件缓存到服务器的各块ssd硬盘,缓解ceph压力。分站机房1.app根据用户来源ip或者访问内容,将请求分布在不同分站2.分站的负......
  • 缓存使用(@EnableCaching、@Cacheable、@CachePut、@CacheEvict、@Caching、@CacheConf
    Spring成神之路第四十篇:缓存使用(@EnableCaching、@Cacheable、@CachePut、@CacheEvict、@Caching、@CacheConfig)本文主要详解spring中缓存的使用。背景缓存大家都有了解过吧,主要用来提升系统查询速度。比如电商中商品详情信息,这些信息通常不会经常变动但是会高频访问,我们可......