使用 Infinispan 缓存功能支持多个 Redis 数据库

image

     在 Infinispan 15 中,我们提供了大量命令,可以在不更改代码的情况下将 Redis 服务器替换为 Infinispan。在本教程中,您将了解 Infinispan 缓存别名如何帮助您将多个 Redis 数据库的 Redis 服务器替换为 Infinispan

关键要点

  • 什么是缓存别名以及如何使用别名创建缓存或更新现有缓存
  • 了解 Infinispan 和 Redis 在数据组织方面的差异
  • 使用 RESP 协议时,支持在 Infinispan 中使用缓存别名的多个数据库

从 Infinispan 15.0(撰写本文时最新的稳定版本)开始,就可以支持多个 Redis 数据库。但是,Hot Rod、CLI 和 Infinispan 控制台支持是 Infinispan 15.1 中的技术预览版(目前正在开发中)。

从 Infinispan 15 开始,您可以将 Infinispan 用作 Redis 的热替代,因为它通过 RESP 协议支持大多数 Redis 命令。这之所以有效,是因为 Infinispan Server 默认启用了 RESP 端点。Redis 客户端将自动连接并路由到 Infinispan 的内部连接器。

image

运行 Infinispan 服务器并使用 Redis 客户端

使用 Infinispan Server 测试 Redis 客户端非常简单。首先,按照 “入门教程” 中的说明运行 Infinispan Server。

使用 Docker 或 Podman 的命令行:

docker run -it -p 11222:11222 -e USER="admin" -e PASS="password" quay.io/infinispan/server:15.1

podman run -it -p 11222:11222 -e USER="admin" -e PASS="password" --net=host quay.io/infinispan/server:15.1

接下来,使用 Redis-CLI 连接到 Infinispan,使用端口 11222 而不是默认的 6379。由于 Infinispan 默认是安全的,因此请确保提供管理员凭证。
> redis-cli -p 11222 --user admin --pass password
127.0.0.1:11222> set hello world
OK
127.0.0.1:11222> get hello
"world"
如果您想知道数据的存储位置,它位于 “respCache” 中。这是 Infinispan RESP 连接器使用的默认缓存,并且它预先配置了合理的默认值。它随时可用,可以作为 Redis 的良好替代品。请注意,从 Infinispan 15.1 开始,数据容器缓存列表包括一个名为 “Aliases” 的新列, 我们稍后会介绍。
http://localhost:11222 (admin/password) 凭据中的 Infinispan Server Console:
image

Redis 数据库与 Infinispan 缓存


     在 Redis 中,数据库本质上是单个 Redis 服务器中独立、隔离的命名空间。每个数据库都可以独立于其他数据库存储自己的键值对集。
默认情况下,Redis 提供 16 个数据库,编号范围为 0 到 15。您可以使用 SELECT 命令在这些数据库之间切换。此功能有助于组织数据并隔离同一 Redis 实例中的不同应用程序或使用案例,但请务必注意,所有数据库共享相同的内存空间和配置设置。
    另一方面,Infinispan 采用分布式缓存模型,其中数据分布在多个节点上。它不使用单独数据库的概念;相反,它使用缓存来组织数据,缓存可以使用不同的设置进行配置,并在集群中进行分区。数据在多个节点之间分布和复制,从而提供高可用性和可扩展性。没有与 Redis 的数据库直接对应的数据库,但可以使用不同的缓存和配置对数据进行分段。
下表是 Redis 数据库和 Infinispan 缓存之间的主要区别:

image

如果 Infinispan 连接器默认使用名为 “respCache” 的单个缓存,则可以通过使用 缓存别名来支持多个 Redis 数据库。

缓存别名

在 Infinispan 中,缓存别名是您可以分配给缓存的备用名称。它们允许您使用不同的名称引用相同的底层缓存配置。Infinispan 中的缓存别名允许在缓存数据的不同版本或状态之间高效切换,而无需修改或重新加载应用程序逻辑。这使得缓存别名在需要更新数据但您希望确保高可用性和对应用程序性能的影响最小的情况下特别有用。

缓存别名的用例

Infinispan 中的缓存别名非常适合在不中断应用程序的情况下管理不断变化的数据。它允许您在数据快照之间轻松切换。您可以在加载新数据版本时继续使用旧数据版本。当新数据准备就绪时,您只需将别名切换为指向它,无需停机。由于您的应用不会触及正在更新的缓存,因此具有更好的性能和高可用性,它可以平稳运行而不会出现减速或错误。如果出现问题,您可以快速回滚并使用别名切换到以前的数据版本。

例如,假设一个在线商店需要更新其目录:

  1. 商店使用当前数据 (current_catalog 指向 catalog_snapshot_1) 不断显示产品。
  2. 当客户浏览时,新产品数据会在后台加载到 catalog_snapshot_2
  3. catalog_snapshot_2 完全更新后,别名 (current_catalog) 将切换为指向 catalog_snapshot_2
  4. 现在可以免费清除旧的 catalog_snapshot_1 缓存并用于下一次更新。

该网站更新其目录数据,而不会给用户造成重大延迟或停机时间。

使用别名创建缓存

在学习如何使用 RESP 协议和多个数据库的缓存别名之前,我们先学习如何创建和更新缓存别名。在 Infinispan 中创建缓存或缓存配置的方法有很多种,但我最喜欢的是使用 Infinispan Server Console

运行 Infinispan Server 并访问控制台,如 “入门教程” 中所述。要创建缓存,请单击 “Create Cache” 按钮使用缓存创建向导。在缓存调整步骤中,您会找到 “Aliases” 选项,您可以在其中添加任意数量的别名。

image

在最后一步中,您将能够查看 JSON、XMLYAML 格式的配置

image

使用别名创建缓存时,列表将显示缓存的别名。您可以使用 “search by” 字段按名称或别名筛选缓存

image

在运行时添加别名

对于现有的缓存,好消息!缓存配置中的 aliases 属性可以在运行时更改。您可以通过多种方式执行此操作:

Hotrod 中使用管理 API

使用 Infinispan 服务器命令行界面 (CLI)

使用 Server ConsoleREST API

要执行此操作,您需要在 Infinispan 中具有 ADMIN 访问权限\

使用 Hotrod 客户端

要在运行时修改别名,请使用管理 API。下面是客户端/服务器模式的示例。如果你在你的应用程序中使用 Infinispan Embedded,可以使用类似的 API。

RemoteCacheManager remoteCacheManager = // created or injected if using Quarkus or Spring Boot
remoteCacheManager.administration().updateConfigurationAttribute("myCache", "aliases", "alias alias2");
RemoteCache<String, String> cacheFromAlias = cacheManager.getCache("alias");

使用命令行工具

Infinispan 的命令行工具 (CLI) 提供了一种在运行时更改缓存别名的方法。首先,使用以下命令运行 CLI:

podman or docker run -it --net=host infinispan/cli

从命令行连接到正在运行的服务器:

[disconnected]> connect
Username: admin
Password: ********
[6b0130c153e3-50183@cluster//containers/default]

然后,使用 alter cache 命令更新 aliases 属性:

alter cache myCache2 --attribute=aliases --value=current_catalog

最后,描述缓存的配置并验证更改:

[6b0130c153e3-50183@cluster//containers/default]> describe caches/myCache2
{
   "myCache2" : {
     "distributed-cache" : {
       "aliases" : [ "current_catalog" ],
       "owners" : "2",
       "mode" : "SYNC",
       "statistics" : true,
       "encoding" : {
         "media-type" : "application/x-protostream"
       }
     }
   }
}

使用 Server Console控制台

从缓存列表中,选择 Edit aliases 操作:

image

支持多个数据库

让我们尝试使用 Redis CLI 选择数据库 01。要在 Redis 中切换数据库,请使用 SELECT 命令,后跟数据库编号。让我们再次尝试 Infinispan。首先,使用 SELECT 0 从数据库 0 开始。然后,使用 SELECT 1 切换到数据库 1

> redis-cli  --user admin --pass password
127.0.0.1:11222[1]> select 0
OK
127.0.0.1:11222[1]> select 1
(error) ERR DB index is out of range

数据库 0 有效,但数据库 1 无效。仔细检查 respCache 配置,我们看到定义了别名为“0”的默认 respCache

image

要选择 数据库 “1”,您需要创建一个新的缓存。让我们再次使用 Infinispan Console 来执行此操作。转到缓存创建向导,这次选择 “add cache configuration” 选项.
选择 RESP。DIST 模板并创建缓存。此模板专为 RESP 缓存设计:

image

最后,将别名 “1” 添加到新缓存中,如在运行时添加别名部分所述。或者,您可以从 respCache 复制并粘贴配置,将别名 0 更改为别名 1

image

现在我们有一个别名为 1 的缓存,我们可以选择并添加以下数据

> redis-cli  --user admin --pass password
127.0.0.1:11222[1]> select 0
OK
127.0.0.1:11222[1]> select 1
OK
127.0.0.1:11222[1]> set hello word
OK

需要强调的是,与 Redis 数据库不同,每个缓存都可以根据应用程序的需要进行不同的设置。这使您可以利用 Infinispan 的灵活配置(例如,您可以使用跨站点复制为某些“数据库”添加备份,而不是全部),同时仍然保持在您的应用程序中使用 Redis 客户端的简单性。


结论

      在本教程中,您学习了如何将多个数据库与 RESP 协议结合使用,以及如何使用 Infinispan 缓存来替代 Redis 数据库。如前所述,通过使用不同的缓存而不是 Redis 数据库,您可以获得多项优势。现在可以根据您的特定场景,以更灵活、更有效的方式满足您的数据需求。您还了解了什么是缓存别名以及它们在不同情况下的帮助,而不仅仅是 Redis 数据库。

Infinispan缓存的优势
  1. 高可用性和容错性:Infinispan基于分布式架构,当一个节点出现故障时,其他节点可以自动接管,保证系统的连续性和可用性。
  2. 高性能:Infinispan可以缓存各种对象,包括Java序列化对象、POJO、JSON和XML等不同格式的数据,性能高效。它提供了多种缓存策略和数据持久化方式,使得数据的读取和写入速度更加高效。
  3. 灵活性:Infinispan提供了多种配置选项,可以根据应用场景调整缓存功能和性能参数。同时,它也支持不同的分布式模型和集群配置,如对等节点和主从节点。
  4. 可扩展性和易用性:Infinispan易于集成到各种Java应用程序中,并与Spring、Hibernate、JPA等流行框架集成使用。
  5. 分布式特性:Infinispan不仅可以用作高速缓存,还可以实现分布式锁、分布式数据存储和分布式计算框架等功能,更加高效地利用集群资源。
适用业务场景

相比Redis,Infinispan在以下业务场景中更具优势:

  1. 需要高性能和高可用性的Java应用程序:Infinispan与Java生态系统紧密集成,提供了高性能和高可用性的缓存解决方案。
  2. 需要分布式数据存储和处理的应用程序:Infinispan支持分布式数据存储和处理,可以将数据存储在多个节点上,提高数据的可用性和容错性。
  3. 需要向量搜索功能的应用程序:从版本15开始,Infinispan支持向量搜索,为机器学习和AI应用提供了新的可能性。

例如,在推荐系统和实时分析等需要快速数据查询和处理的应用场景中,Infinispan的向量搜索功能可以发挥重要作用。



今天先到这儿,希望对云原生,技术领导力, 企业管理,系统架构设计与评估,团队管理, 项目管理, 产品管理,信息安全,团队建设 有参考作用 , 您可能感兴趣的文章:
构建创业公司突击小团队
国际化环境下系统架构演化
微服务架构设计
视频直播平台的系统架构演化
微服务与Docker介绍
Docker与CI持续集成/CD
互联网电商购物车架构演变案例
互联网业务场景下消息队列架构
互联网高效研发团队管理演进之一
消息系统架构设计演进
互联网电商搜索架构演化之一
企业信息化与软件工程的迷思
企业项目化管理介绍
软件项目成功之要素
人际沟通风格介绍一
精益IT组织与分享式领导
学习型组织与企业
企业创新文化与等级观念
组织目标与个人目标
初创公司人才招聘与管理
人才公司环境与企业文化
企业文化、团队文化与知识共享
高效能的团队建设
项目管理沟通计划
构建高效的研发与自动化运维
某大型电商云平台实践
互联网数据库架构设计思路
IT基础架构规划方案一(网络系统规划)
餐饮行业解决方案之客户分析流程
餐饮行业解决方案之采购战略制定与实施流程
餐饮行业解决方案之业务设计流程
供应链需求调研CheckList
企业应用之性能实时度量系统演变

如有想了解更多软件设计与架构, 系统IT,企业信息化, 团队管理 资讯,请关注我的微信订阅号:

image_thumb2_thumb_thumb_thumb_thumb[1]

作者:Petter Liu
出处:http://www.cnblogs.com/wintersun/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 该文章也同时发布在我的独立博客中-Petter Liu Blog。

posted on 2024-11-14 13:57  PetterLiu  阅读(7)  评论(0编辑  收藏  举报