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

时间:2016-06-27 14:37:33

标签: caching architecture distributed-computing distributed-caching

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

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

  • 数据量非常小
  • 数据很冷;这意味着它几乎没有变化,只有当人类在我们的后台系统中改变某些东西时才会改变
  • 更改时必须更新(延迟几百毫秒)
  • 我们的应用程序非常关键的路径,需要非常高的SLA(可靠性和响应时间(访问时间不超过20毫秒))
  • 经常读取数据(每秒最多数千次)

我们看到它的方式如下 -

在内存缓存中

优点:

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

缺点:

  • 代码和维护更加复杂
  • 需要在发生更改后通知实例并且需要单独更新每个实例+需要在每个服务器启动时加载数据
  • 增加了数据不一致的高风险(一个实例具有与其他实例不同或过时的数据)

集中缓存

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

优点:

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

缺点:

  • 单点故障(这对我们来说是一个很大的问题);即使我们采用这种解决方案,我们也会部署一个集群
  • 如果由于某种原因刷新缓存会发生什么

3 个答案:

答案 0 :(得分:7)

我在使用Redis进行集中式缓存时没有遇到任何问题。

  1. 无论如何,你将拥有一个集群设置,所以如果一个主机失败,奴隶将占据该位置。
  2. 如果由于某种原因刷新了缓存,那么你必须构建缓存,同时请求将从主源(DB)获取数据
  3. 您可以启用持久性并加载磁盘中持久存储的数据,并可以在几秒钟内获得数据(即插即用)。如果您认为自己会有不一致,请遵循以下方法。
  4. 即使缓存不可用,系统也应该工作(显然延迟时间)。意思是app逻辑应该检查redis中的缓存,如果它不存在或系统本身不可用,它应该从dB获取值,然后将其填充到redis然后提供给客户端。

    通过这种方式,即使您的redis主服务器和从服务器已关闭,您的应用程序也能正常工作但有延迟。而且你的缓存也是最新的。

    希望这会有所帮助。

答案 1 :(得分:1)

Redis是集中式缓存的绝佳选择。它速度快,表现出色。我们用它来存储TB数据。

答案 2 :(得分:0)

似乎您应该使用集中式缓存,该缓存位于数据库层和应用程序层之间,在该层中,所有数据库读/写都采用直写式缓存无效方案通过缓存。