分布式系统中的内存缓存 VS. 集中式缓存

21

我们目前正在寻找访问分布式系统上关键数据的最合适解决方案,我们正在考虑使用内存缓存还是集中式缓存。

以下是一些有关我们希望存储/访问的数据的信息:

  • 数据非常小
  • 数据很少变化,只有在人为更改后端办公系统中的内容时才会发生变化
  • 更改后必须是最新的(可以有几百毫秒的延迟)
  • 我们应用程序的非常重要部分,需要非常高的SLA(可靠性和响应时间都不超过20ms)
  • 经常读取数据(每秒高达数千次)

我们看到的方式如下:

内存缓存

优点:

  • 比网络访问+序列化更快
  • 在分布方面更可靠(如果一个实例死亡,数据仍然存在于其他实例上)

缺点:

  • 编写和维护复杂度更高
  • 需要在更改发生时通知实例并分别更新每个实例+需要在每个服务器启动时加载数据
  • 增加了数据不一致性的高风险(一个实例具有不同或过时的数据)

集中式缓存

为了进行对话,我们考虑使用Redis。

优点:

  • 维护更简单
  • 非常可靠,我们在分布式系统中使用Redis有很多经验
  • 只需要更新一个地方
  • 确保数据一致性

缺点:

  • 单点故障(这是我们的一个大问题);即使我们采用这种解决方案,我们也会部署一个群集
  • 如果由于某种原因清除了缓存会发生什么情况
3个回答

16

我认为使用 Redis 做集中式缓存不会有任何问题。

  1. 无论如何,您都需要建立一个集群,所以如果主节点失败,从节点会接替其位置。
  2. 如果由于某些原因清空了缓存,则必须重新构建缓存,在此期间,请求将从主源(数据库)获取数据。
  3. 您可以启用持久性并加载磁盘中持久化的数据,几秒钟内即可获取数据(即插即用)。如果您认为存在不一致性,则请按照以下方法操作。

即使缓存不可用,系统也应该正常工作(显然会有延迟时间)。这意味着应用程序逻辑应该在 redis 中检查缓存是否存在,如果不存在或系统本身不可用,它应该从数据库中获取值,然后将其填充到 redis 中,再提供给客户端。

通过这种方式,即使您的 Redis 主从节点都已失效,应用程序也将正常工作,但会有延迟。而且您的缓存也会保持最新状态。

希望这可以帮助到您。


1
在阅读更多在线文章并考虑利弊之后,我们决定集中式缓存是更适合我们的解决方案。 - Ron

5

Redis是一个用于集中式缓存的不错选择。它快速且表现出色。我们正在使用它来存储数TB的数据。


0

看起来你应该使用集中式缓存,位于数据库和应用程序层之间,所有数据库读写都通过缓存,并采用写入缓存失效方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接