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

Ron*_*Ron 8 architecture caching distributed-computing distributed-caching

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

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

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

我们看到它的方式如下 -

在内存缓存中

优点:

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

缺点:

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

集中缓存

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

优点:

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

缺点:

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

Kar*_*all 8

使用Redis进行集中式缓存时,我没有发现任何问题.

  1. 无论如何,你将有一个集群设置,所以如果一个主机失败奴隶将占据该位置.
  2. 如果由于某种原因刷新了缓存,那么你必须构建缓存,同时请求将从主源(DB)获取数据
  3. 您可以启用持久性并加载磁盘中持久存储的数据,并可以在几秒钟内获得数据(即插即用).如果您认为自己会出现不一致,请遵循以下方法.

即使缓存不可用,系统也应该工作(显然延迟了时间).意思是app逻辑应该检查redis中的缓存,如果它不存在或者系统本身不可用它应该从dB获取值然后将其填充到redis然后提供给客户端.

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

希望这可以帮助.


小智 5

Redis 是集中式缓存的绝佳选择。它速度快且性能出色。我们用它来存储 TB 级的数据。