caching - 内存缓存 VS。分布式系统中的集中式缓存

标签 caching architecture distributed-computing distributed-caching

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

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

  • 数据量非常小
  • 数据非常冷;这意味着它几乎不会改变,并且只有当人们改变我们后台系统中的某些内容时才会改变
  • 更改时必须保持最新(延迟 100 毫秒即可)
  • 我们的应用程序非常关键的路径,需要非常高的 SLA(无论是可靠性还是响应时间(访问时间不超过 20 毫秒))
  • 频繁读取数据(每秒高达数千次)

我们看到的方式如下 -

内存缓存

优点:

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

缺点:

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

集中缓存

为了方便讨论,我们考虑使用 Redis。

优点:

  • 维护起来更简单
  • 非常可靠,我们在分布式系统中使用 Redis 拥有丰富的经验
  • 只有一处需要更新
  • 确保数据一致性

缺点:

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

最佳答案

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

  1. 无论如何,您都将进行集群设置,因此如果主服务器发生故障,从服务器将占据该位置。
  2. 如果缓存由于某种原因被刷新,那么您必须构建缓存,同时请求将从主源 (DB) 获取数据
  3. 您可以启用持久化并加载持久化在磁盘中的数据,并且可以在几秒钟内获取数据(即插即用)。如果您认为会出现不一致的情况,请按照以下方法操作。

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

通过这种方式,即使你的 Redis 主服务器和从服务器都宕机了,你的应用程序也能正常工作,但会有延迟。而且您的缓存也将是最新的。

希望这有帮助。

关于caching - 内存缓存 VS。分布式系统中的集中式缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38056786/

相关文章:

php - 扩展 Symfony 2 缓存 :clear command to clear APC as well

asp.net-mvc - 使用 Umbraco CachedPartial 为不同模型缓存部分 View

caching - 将查询中的缓存设置为false后,Elasticsearch是否将删除现有的过滤器缓存

可配置的自定义代码

kubernetes - 有没有办法在Kubernetes集群中举行领导人选举?

database - 启用集群模式的 Redis 锁

java - 如何从 okhttp 的缓存中删除 url?

c# - DAL、 session 、缓存架构

java - 包P1和P2有依赖循环,但是P1的类没有使用P2(通过jdepend分析)

api - 如何向 API 客户端提供 1,000,000 个数据库结果?