首页 > 解决方案 > 将 Redis 用于应用程序属性

问题描述

我有一个 Web 应用程序,其中我们有多个功能。所有这些功能都可以通过标志启用/禁用。

例如:

feature.a.enabled=false
feature.b.enabled=true

最初,所有这些属性都是应用程序属性的一部分。定期(每 2 周一次),我们迫切需要打开或关闭某项功能。更新属性文件将重建项目,管道将从 dev、qa、stg 和 prod 开始部署应用程序。这太烦人了。所以我们决定将这些属性移动到我们的应用程序数据库中。现在,每当我们有紧急需求时,我们都会更新数据库中的值,然后重新启动 Prod 上的所有应用服务器实例。app-servers 开始读取并缓存这些值。我们有 50 个应用服务器。滚动重启需要时间。

我正在考虑建议为此目的使用redis。代码或多或少是这样的。

//pseudo code
if(redisTemplate.getKeyValue("feature.a.enabled")){
    show feature
}

好处是,我不必重新启动应用程序。但我相信它会影响性能。因为这将是对 redis 的大量网络调用。

你能为这个问题提出一些其他的选择吗?

标签: spring-bootredis

解决方案


Redis 是为

对 Redis 的大量网络调用

但是如果你想减少这些数量,你可以使用 Spring Cache(In memory - 因为可以选择使用 Redis 作为缓存提供程序 - 再次证明如果你只是决定接近你,你不应该担心性能在你的问题中提到) https://docs.spring.io/spring/docs/5.2.1.RELEASE/spring-framework-reference/integration.html#cache

流程将是:

  1. 您在数据库(关系或 Redis)中打开或关闭该功能
  2. 调用一些使缓存无效的方法(用 注释@CacheEvict
  3. 当你第一次调用时,redisTemplate.getKeyValue("feature.a.enabled")结果应该被缓存(用 注释的方法@Cacheable
  4. 任何后续调用redisTemplate.getKeyValue("feature.a.enabled")(直到您再次执行第 1 步和第 2 步)都将返回缓存的结果

为了优雅起见,我还将第 1 点从与 DB 的手动交互更改为在您的应用程序中触发的操作。


推荐阅读