keycloak~分布式缓存的使用

这篇具有很好参考价值的文章主要介绍了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, "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支持四种缓存模式:本地(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,避免每次直接访问数据库,提高读取性能。

keycloak~分布式缓存的使用

3.3 复制模式

  1. 复制模式是集群模式的一种,在该模式任何一个节点的数据变更将复制到其他所有节点上,这使得集群中任何一个节点都包含了完整的缓存数据。
  2. 和嵌入式模式组合时,所有数据均保存在应用程序本地,读操作仅需访问本地内存,性能最高。
  3. 和C\S模式组合时,因为数据都保存在远端,读写都需要进行一次远端访问,此时复制模式和分布式模式相比并无明显优势。
  4. Infinispan设计了同步、异步两种方式用于将本节点的数据变更操作通知到其他节点,对于每种操作又支持TCP、UDP两种通信方式。采用UDP协议时,通过叠加JGroups的NAKACK2和UNICAST3保证传输的可靠性,具体可参见[JGroups支持]。

keycloak~分布式缓存的使用

3.4 分布式(Distributed)模式

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

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

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

keycloak~分布式缓存的使用文章来源地址https://www.toymoban.com/news/detail-746682.html

到了这里,关于keycloak~分布式缓存的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 一文拿捏分布式、分布式缓存及其问题解决

    1.集中式 传统的计算模型通常是集中式的,所有的计算任务和数据处理都由 单一的计算机或服务器 完成。然而,随着数据量和计算需求的增加,集中式系统可能会面临性能瓶颈和可靠性问题。 故而引出了分布式↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

    2024年02月07日
    浏览(34)
  • 分布式系统架构设计之分布式缓存技术选型

    随着互联网业务的快速发展,分布式系统已经成为了解决大规模并发请求、高可用性、可扩展性等问题的重要手段。在分布式系统中,缓存作为提高系统性能的关键技术,能够显著降低数据库负载、减少网络延迟、提高数据访问速度。当面对大量并发请求时,如果每次都直接

    2024年02月03日
    浏览(45)
  • SpringBoot整合Redis、以及缓存穿透、缓存雪崩、缓存击穿的理解分布式情况下如何添加分布式锁 【续篇】

    上一篇实现了单体应用下如何上锁,这一篇主要说明如何在分布式场景下上锁 上一篇地址:加锁 需要注意的点是: 在上锁和释放锁的过程中要保证 原子性操作 核心是上锁和解锁的过程 关于解锁使用脚本参考:SET key value [EX seconds] [PX milliseconds] [NX|XX] 3.1 一个服务按照多个端口同时

    2023年04月10日
    浏览(38)
  • Redis分布式缓存

    -- 基于Redis集群解决单机Redis存在的问题 单机的Redis存在四大问题: Redis有两种持久化方案: RDB持久化 AOF持久化        RDB全称Redis Database Backup file(Redis数据备份文件),也被叫做 Redis数据快照 。简单来说就是把 内存中的所有数据都记录到磁盘 中。当Redis实例故障重启后,

    2024年02月12日
    浏览(40)
  • Redis 分布式缓存

    单点 Redis 的问题及解决 数据丢失:实现Redis数据持久化 并发能力:搭建主从集群,实现读写分离 存储能力:搭建分片集群,利用插槽机制实现动态扩容 故障恢复能力:利用哨兵机制,实现健康检测和自动恢复 RDB RDB全称Redis Database Backup file (Redis数据备份文件),也被叫做

    2024年02月10日
    浏览(42)
  • 分布式缓存

    – 基于Redis集群解决单机Redis存在的问题 Redis有两种持久化方案: RDB持久化 AOF持久化 RDB全称Redis Database Backup file(Redis数据备份文件),也被叫做Redis数据快照。简单来说就是 把内存中的所有数据 都记录到磁盘中。当Redis实例故障重启后,从磁盘读取快照文件,恢复数据。快

    2023年04月25日
    浏览(37)
  • 微服务07-分布式缓存

    前提: 单机的Redis存在四大问题: 解决办法:基于Redis集群解决单机Redis存在的问题 Redis 具有持久化功能,其会按照设置以 快照 或 操作日志 的形式将数据持久化到磁盘。 Redis有两种持久化方案: RDB持久化 AOF持久化 注意: RDB 是默认持久化方式,但 Redis 允许 RDB 与 AOF 两种

    2024年02月12日
    浏览(26)
  • Redis高级-分布式缓存

    – 基于Redis集群解决单机Redis存在的问题 单机的Redis存在四大问题: Redis有两种持久化方案: RDB持久化 AOF持久化 RDB全称Redis Database Backup file(Redis数据备份文件),也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后,从磁盘读取

    2024年04月16日
    浏览(27)
  • 缓存和分布式锁笔记

    缓存 开发中,凡是放入缓存中的数据都应该指定过期时间,使其可以在系统即使没有主动更新数据也能自动触发数据加载进缓存的流程。避免业务崩溃导致的数据永久不一致 问题。 redis作为缓存使用redisTemplate操作redis 分布式锁的原理和使用 分布式加锁:本地锁,只能锁住当

    2024年02月09日
    浏览(31)
  • Redis(分布式缓存详解)

    Redis:基于内存的键值存储系统,通常用作高性能的数据库、缓存和消息队列代理,是互联网广泛应用的存储中间件 特点 :基于内存存储,读写性能高 Redis与MySQL区别 Redis以键值对形式存储,MySQL以表格形式存储 Redis存储在 内存 ,MySQL存储在 磁盘 Redis存储 高效 ,MySQL存储 安

    2024年02月16日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包