在两个服务器之间同步缓存数据的最佳方法[关闭]

2024-02-27

想要同步两台服务器之间的缓存数据。两个数据库共享同一个数据库,但为了更好地执行数据,我在启动时将数据缓存到哈希映射中。 因此希望在不重启服务器的情况下同步缓存的数据。 (两台服务器同时启动)。

请建议我最好、最有效的方法。


与其尝试在两个服务器实例之间同步缓存数据,为什么不使用 memcached/couchbase 或 redis 之类的工具来集中缓存呢?在我看来,与使用上述提到的缓存服务器集中缓存数据相比,使用像 ehcache 这样的分布式缓存要复杂得多,而且更容易出错。

作为我原来答案的附录,在决定使用哪种缓存方法(在内存中,集中式)时,需要考虑的一件事是正在缓存的数据的波动性。

如果数据存储在数据库中,但在服务器加载后没有更改,那么您甚至不需要服务器之间的同步。只需让他们每个人将这些静态数据从源加载到内存中,然后继续他们快乐的方式做他们所做的事情。数据不会改变,因此无需引入复杂的模式来保持服务器之间的数据同步。

如果数据确实存在一定程度的波动性(比如您正在缓存从数据库中查找的实体数据以保存对数据库的命中),那么我仍然认为集中式缓存是比内存中分布式缓存更好的方法同步缓存。您只需要确保对缓存数据使用适当的过期时间,以允许数据不时自然刷新。此外,您可能希望在特定实体的更新路径中时从集中式存储中删除缓存的数据,然后在下次请求该数据时从缓存中重新加载它。在我看来,这比尝试执行真正的直写式缓存(在其中写入底层存储以及缓存)要好。数据库本身可能会对数据进行调整(例如通过默认未提供的值),并且在这种情况下您的缓存数据可能与数据库中的数据不匹配。

EDIT:

评论中提出了一个关于集中式缓存优点的问题(我猜测是针对内存中分布式缓存之类的东西)。我将对此发表我的意见,但首先是标准免责声明。集中式缓存并不是包治百病的灵丹妙药。它旨在解决与 jvm 内存缓存相关的特定问题。在评估是否切换到它之前,您应该首先了解您的问题是什么,并看看它们是否符合集中式缓存的好处。集中式缓存是一种架构变化,它可能会带来自己的问题/警告。不要因为有人说它比你正在做的更好而转向简单的做法。确保原因符合问题。

好的,现在谈谈我对集中式缓存与 jvm 内存(可能还有分布式)缓存相比可以解决哪些问题的看法。我将列出两件事,尽管我确信还有更多。我的两个大的是:总体内存占用 and 数据同步问题.

让我们从总体内存占用。假设您正在执行标准实体缓存,以保护您的关系数据库免受过度压力。假设您有大量数据需要缓存,以便真正保护您的数据库;比如说在许多GB的范围内。如果您正在进行 jvm 内存中的缓存,并且您说有 10 个应用程序服务器框,那么您需要为每个需要在 jvm 中进行缓存的框获得额外的内存 ($$$) 乘以 10记忆。此外,您还必须为 JVM 分配更大的堆以容纳缓存的数据。我认为 JVM 堆应该小而精简,以减轻垃圾收集负担。如果您有大量无法收集的 Old Gen,那么当垃圾收集器进入完整的 GC 并尝试从臃肿的 Old Gen 空间中回收一些东西时,您会给垃圾收集器带来压力。您希望避免长时间的 GC2 暂停时间,而让您的 Old Gen 膨胀对此无济于事。另外,如果您的内存要求高于某个阈值,并且您的应用程序层恰好运行 32 位计算机,则您必须升级到 64 位计算机,这可能是另一个令人望而却步的成本。

现在,如果您决定集中缓存数据(使用 Redis 或 Memcached 等),则可以显着减少缓存数据的总体内存占用量,因为您可以将其放在几个盒子上,而不是放在所有应用程序服务器盒子上。应用程序层。您可能希望使用集群方法(两种技术都支持它)和至少两台服务器来为您提供高可用性并避免缓存层中的单点故障(稍后将详细介绍)。通过拥有几台机器来支持缓存所需的内存要求,您可以节省大量资金。此外,您现在可以以不同的方式调整应用程序框和缓存框,因为它们具有不同的用途。应用程序框可以调整为高吞吐量和低堆,缓存框可以调整为大内存。拥有更小的堆肯定有助于提高应用程序层框的整体吞吐量。

现在简要介绍一下一般的集中式缓存。您应该以这样的方式设置您的应用程序,即使它在一段时间内完全崩溃,它也可以在没有缓存的情况下生存。在传统的实体缓存中,这意味着当缓存完全不可用时,您只需为每个请求直接访问数据库。不算太棒,但也不是世界末日。

好的,现在为数据同步问题。对于分布式 jvm 内存缓存,您需要保持缓存同步。对一个节点中缓存数据的更改需要复制到其他节点并同步到其缓存数据中。这种方法有点可怕,因为如果由于某种原因(例如网络故障)其中一个节点不同步,那么当请求发送到该节点时,用户看到的数据将与当前节点中的数据不准确。 D B。更糟糕的是,如果他们发出另一个请求并到达不同的节点,他们将看到不同的数据,这会让用户感到困惑。通过集中数据,您可以消除这个问题。现在,人们可能会争辩说,集中式缓存需要围绕同一缓存数据密钥的更新进行并发控制。如果同一个密钥有两个并发更新,如何确保这两个更新不会互相干扰?我的想法是根本不用担心这个问题;当发生更新时,从缓存中删除该项目(并直接写入数据库)并让它在下次读取时重新加载。这样更安全、更容易。如果您不想这样做,那么如果您确实想在更新时更新缓存和数据库,则可以使用 CAS(检查并设置)功能来代替乐观并发控制。

总而言之,如果您集中缓存的数据,您可以节省资金并更好地调整应用程序层计算机。由于需要处理的数据同步问题较少,您还可以获得更高的数据准确性。我希望这有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在两个服务器之间同步缓存数据的最佳方法[关闭] 的相关文章

  • 如何从 Play WSClient 的字符串创建 WSResponse 对象

    文档 https www playframework com documentation 2 4 x JavaTestingWebServiceClients Mock the web service建议使用模拟Web服务测试基于WSCli
  • ScheduledThreadPoolExecutor如何在特定时间运行任务?

    特别是 它是否像这样在内部实现了 while true 循环 while System currentTimeMillis lt timeToRunTask Thread sleep 1000 doTask From http grepco
  • android.view.InflateException:二进制 XML 文件行 #11:膨胀类 ImageView 时出错

    我只是尝试制作一个小的 android java xml 应用程序来计算游戏的分数 它给了我这个错误 Error inflateing class ImageView 有人知道解决方案吗 我实际上搜索了 ppl 说添加这个 android
  • 如何将 JSpinner 的值设置为特定日期

    我有一个JSpinner我添加到JPanel我想将其时间设置为 GregorianCalendar calendar JSpinner spinner new JSpinner spinner setModel model pom add
  • 如何在Java中优雅地处理SIGKILL信号

    当程序收到终止信号时如何处理清理 例如 我连接到一个应用程序 希望任何第三方应用程序 我的应用程序 发送finish注销时的命令 发送该信息最好说什么finish当我的应用程序被破坏时的命令kill 9 编辑1 kill 9无法被捕获 谢谢
  • 在 Java 中从 SOAPMessage 获取原始 XML

    我已经在 J AX WS 中设置了 SOAP WebServiceProvider 但我无法弄清楚如何从 SOAPMessage 或任何 Node 对象获取原始 XML 下面是我现在获得的代码示例 以及我试图获取 XML 的位置 WebSe
  • 如何为小程序提供对文件系统写入的访问权限

    我在设置小程序的策略文件时遇到问题 我是第一次这样做 不知道如何在java中设置小程序的策略文件 实际上我想授予小程序在文件系统上写入的权限 为此我必须向小程序授予文件权限 所以我创建了一个名为 java policy 的文件 并将以下代码
  • OpenNLP 与斯坦福 CoreNLP

    我一直在对这两个包进行一些比较 但不确定该往哪个方向走 我简单地寻找的是 命名实体识别 人 地点 组织等 性别识别 一个不错的训练 API 据我所知 OpenNLP 和斯坦福 CoreNLP 提供了非常相似的功能 然而 Stanford C
  • Web API 缓存 - 如何使用分布式缓存实现失效

    我有一个 API 目前不使用任何缓存 我确实有一个正在使用的中间件 它可以生成缓存标头 Cache Control Expires ETag Last Modified 使用https github com KevinDockx HttpC
  • 从 HttpClient 3 转换为 4

    我已经成功地对所有内容进行了更改 但以下内容除外 HttpClient client HttpPost method client new DefaultHttpClient method new HttpPost url InputStr
  • 查找数组中的组合

    我在java中有一个像这样的二维数组 transmission communication tv television approach memorycode methodact 我需要获得所有组合 例如 transmission appr
  • 更改 JComboBox 中滚动条的大小

    有谁知道如何手动更改 jComboBox 中的滚动条大小 我已经尝试了一大堆东西 但没有任何效果 好吧 我明白了 您可以实现 PopUpMenuListener 并使用它 public void popupMenuWillBecomeVis
  • 如何使用 swagger-codegen-plugin (maven) 生成客户端代码?

    我需要使用 swagger codegen plugin for maven 在 eclipse 中生成服务器存根代码 你能帮忙怎么做吗 以及需要什么配置 在 pom xml 中 我找到了这个答案 您只需要像下面这样更改 pom xml 即
  • 从 Android 访问云存储

    我一直无法找到任何有关如何从 Android 应用程序使用云存储的具体文档 我确实遇到过这个客户端库 https cloud google com storage docs reference libraries然而 Google Clou
  • Android 解析 JSON 卡在 get 任务上

    我正在尝试解析一些 JSON 数据 我的代码工作了一段时间 我不确定我改变了什么突然破坏了代码 当我运行代码时 我没有收到任何运行时错误或警告 我创建一个新的 AsyncTask 并执行它 当我打电话时 get 在这个新任务中 调试器在此行
  • 从浏览器访问本地文件?

    您好 我想从浏览器访问系统的本地文件 由于涉及大量安全检查 是否可以通过某种方式实现这一目标 或使用 ActiveX 或 Java Applet 的任何其他工作环境 请帮帮我 要通过浏览器访问本地文件 您可以使用签名的 Java Apple
  • 如何使用注释处理 Hibernate 和 Spring 中的连接查询?

    我正在使用 Spring 和 Hibernate 以及 MySQL 开发应用程序 我是 Hibernate 新手 完成了基本任务 现在我需要在选择查询中应用联接以使用注释从多个表中获取数据 我已经搜索过但仍然没有任何想法 这是我的数据库表和
  • @Embeddable 中的 @GenerateValue

    我已将实体的 id 分离到一个单独的 Embeddable 类中 该实体如下 Entity Table name users public class Users EmbeddedId private Users pk id private
  • Android Google 地图无法在当前主题中找到样式“mapViewStyle”

    添加谷歌地图视图时 我扩展了MapView 使用xml编辑器将其添加到活动中 并将我的谷歌地图api密钥手动添加到布局xml文件中 我的权限在清单文件中允许互联网 我想知道的是 在 xml 编辑器中 我收到错误 无法在当前主题中找到样式 m
  • 你能快速告诉我这个伪代码是否有意义吗?

    我相信我的代码现在是万无一失的 我现在将写出伪代码 但我确实有一个问题 为什么 DRJava 要求我返回 if 语句之外的内容 正如你所看到的 我为 ex 写了 return 1 只是因为它问了 但是它永远不会返回该值 谁可以给我解释一下这

随机推荐

  • 收到 iOS 推送通知时打开视图控制器

    我想在用户单击收到的推送通知消息时打开特定的视图控制器 但是当我收到推送通知消息并单击该消息时 仅打开应用程序 但不会重定向到特定的视图控制器 我的代码是 void application UIApplication application
  • 不支持的关键字:元数据

    这行 WebSecurity InitializeDatabaseConnection connectionStringName DefaultConnection userTableName UserProfile userIdColum
  • 为什么 p[:] 的设计在这两种情况下的工作方式不同?

    p 1 2 3 print p 1 2 3 q p supposed to do a shallow copy q 0 11 print q 11 2 3 print p 1 2 3 above confirms that q is not
  • 发布 npm 包的模拟以供 jest 的模块模拟​​系统使用

    我正在发布一个 私有 npm 包 并且也想为其发布模拟 我希望这些嘲笑能够被笑话的人接受模块模拟系统 https jestjs io docs en manual mocks html 该包是一个使用上下文并发出网络请求的反应库 该库的所有
  • 如何并行化 while 循环?

    iter lt 1000 myvec lt c while is null myvec nrow myvec lt iter x rnorm 10 mean 0 sd 1 if sum x gt 2 5 myvec lt rbind myv
  • 使用 redux-toolkit 处理错误

    有关我的案例中的错误的信息深深地存在于响应中 我正在尝试将我的项目移至redux toolkit 以前是这样的 catch e let warning switch e response data error message 问题是redu
  • .NET Core 在处理 HTTPS 证书时出现未知错误 [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我正在尝试构建一个使用 HTTPS 连接的 NET Core 服务器 我使用创建了一个自签名证书dotnet dev certs工
  • 前面带0的数字? [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我有功能 x 012 echo x 3 为什么结果是3 33333 但如果我使用 x 012 那么就对了 问题是这该如何解释呢 以
  • 递归定位包含目标键和值的嵌套字典

    关于这个问题有很多问题 但就我而言 它们不起作用 我试图找到一个给定目标键和值对的嵌套字典 我的递归函数没有返回任何内容 修复后 最大深度递归错误 def recursive lookup k sv d if k in d return d
  • 如何在我的项目中嵌入可执行文件

    我想在我的 Xcode Cocoa 项目中嵌入一个命令行可执行文件 然后使用 NSTask 启动它 我应该在 setLaunchPath 中使用哪个路径 Thanks 您应该将其添加到您的资源文件夹中 然后 在运行时 读取应用程序的资源包路
  • 无法在 Android Studio 中导入 org.apache.http.HttpResponse

    我想在 Android Studio 中使用这些库 import org apache http HttpResponse import org apache http client HttpClient import org apache
  • Camera2 API - 如何设置长曝光时间

    我正在尝试在我的应用程序中以 30 秒的曝光时间捕获图像 我知道这是可能的 因为库存相机允许这样做 但是 SENSOR INFO EXPOSURE TIME RANGE 应该以纳秒为单位 给了我范围 13272 869661901 几秒钟后
  • Mac 操作系统上找不到 /dev/kvm

    我最近将我的 Macbook pro 更新到了 Mac OS High Sierra 现在我遇到了一个问题 我无法再在 Android Studio 中启动模拟器 警告 dev kvm is not found 显示 当我尝试启动模拟器时
  • 使用注释创建时,bean 默认是如何命名的?

    我正在使用别人编写的 Spring java 代码 我想引用一个由注释 字段 classABC 创建的 bean Component public class ClassService Autowired ClassABC classABC
  • 获取在publish:end事件中选择发布的语言

    我为发布 结束事件创建了一个事件处理程序 我能够获取正在发布的项目 如何获取用户在发布选项中选择的语言 弄清楚了这一点 实际上 publish end 事件对每种语言都会触发一次 并且您可以通过执行以下操作获得正在发布的语言EventArg
  • Apache + PHP 中的“标题之前的脚本输出结束”

    UPDATE 此问题是由于脚本完成之前服务器请求超时造成的 我在共享 LAMP 主机 nearlyfreespeech net 上运行遗留代码 并且最近添加了一个无法在生产中工作的新脚本 我的 apache 错误日志显示该消息End of
  • psycopg2.errors.InFailedSqlTransaction:当前事务被中止,命令被忽略,直到事务块结束

    我编写了一个 scrapy 程序来从站点抓取数据 如果我抓取到 json 文件或 csv 文件 该程序会成功抓取 当我尝试抓取到 postgres 数据库时会出现问题 下图显示了我收到的错误 我该如何修复错误 def process ite
  • 如何对生成器对象或迭代器进行切片?

    我想循环遍历迭代器的 切片 我不确定这是否可能 因为我知道不可能对迭代器进行切片 我想做的是这样的 def f for i in range 100 yield i x f for i in x 95 print i 这当然失败了 Type
  • 如何删除 highcharts 系列中的所有点

    使用 HighCharts 我想删除系列中的所有点 以便我可以添加新的数据集 有没有比循环所有点并像这样将它们一一删除更好的方法 for var i 0 i lt chart series 0 points length i chart s
  • 在两个服务器之间同步缓存数据的最佳方法[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 想要同步两台服务器之间的缓存数据 两个数据库共享同一个数据库 但为了更好地执行数据 我在启动时将数据缓存到哈希映射中 因此希望在不重启