spring-boot - 将 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 的大量网络调用。
你能为这个问题提出一些其他的选择吗?
解决方案
Redis 是为
对 Redis 的大量网络调用
但是如果你想减少这些数量,你可以使用 Spring Cache(In memory - 因为可以选择使用 Redis 作为缓存提供程序 - 再次证明如果你只是决定接近你,你不应该担心性能在你的问题中提到) https://docs.spring.io/spring/docs/5.2.1.RELEASE/spring-framework-reference/integration.html#cache
流程将是:
- 您在数据库(关系或 Redis)中打开或关闭该功能
- 调用一些使缓存无效的方法(用 注释
@CacheEvict
) - 当你第一次调用时,
redisTemplate.getKeyValue("feature.a.enabled")
结果应该被缓存(用 注释的方法@Cacheable
) - 任何后续调用
redisTemplate.getKeyValue("feature.a.enabled")
(直到您再次执行第 1 步和第 2 步)都将返回缓存的结果
为了优雅起见,我还将第 1 点从与 DB 的手动交互更改为在您的应用程序中触发的操作。
推荐阅读
- linux - 如何使用 linux 任务后台处理程序停止给定进程
- sql - 为什么一个视图有一个惊人的时间曲线和极限?
- java - 为什么 Java 类可以在方法中声明和初始化该类的对象?
- wordpress - CSV 文件未在 Wordpress 上上传
- python - 在格式化 JSON 响应时,迭代 SQL 关系的最有效方法是什么?
- php - if 条件中出现意外的标识符语法错误
- java - 为什么连接 BLE 设备时 bluetoothAdapter 回调会抛出错误?
- java - Spring Boot AnnotationConfigEmbeddedWebApplicationContext 无法填充动态类中的自动装配声明字段
- sql-server - 如何检查 SQL Server 中的日期时间格式?
- android - Android TextView 文本不出现