【发布时间】:2016-08-30 18:49:52
【问题描述】:
我有一个部署在 Tomcat 网络服务器中的网络应用程序(基于 spring 的战争)。此 Web 应用程序由多个服务器实例提供服务,每个服务器实例都运行一个 Tomcat 实例。我打算在 Redis 数据存储上缓存一些数据,并且所有应用程序实例都联系该数据存储以读取数据。作为一个准备步骤,我希望在应用程序启动时将一些数据缓存在 Redis 中。
如果我通过网络应用程序执行此操作,所有节点都会尝试初始化缓存。让实例领导者之一是一种选择,有没有更好的解决方案?
- Restarting:表示:停止tomcat,然后重新启动。可以出于以下几个原因完成:部署新版本的 Web 应用程序/服务器(机器)重新启动/将新服务器添加到池中。不太可能同时启动所有 tomcat 实例,但其中一些可能几乎同时启动。
- 缓存服务器独立于网络应用程序,但以防万一它也崩溃并且数据丢失。我也会在缓存中维护“最后读取”的 TS。
【问题讨论】:
-
关于缓存预热“最佳实践”的文本并不多(有吗?),所以 +1 敢于提出这个问题。但是,你能把它更详细一点吗?重启对于多个节点上的应用程序意味着什么?为什么要重启?为什么应用节点外部的缓存内容在重启后无法存活?
-
@cruftex 感谢 cmets。我添加了更多上下文。
-
你怎么知道哪些按键需要预热?
-
一个粗略的想法:Leader 选举意味着额外的复杂性,而且您希望所有节点都进行预热。给定一个需要预热的关键空间,定义一个顺序。在有序键空间内,使每个应用程序节点从一个随机偏移量开始,并在找到已填充的键后停止。
标签: java spring caching redis init