内存缓存 VS。分布式系统中的集中缓存
In-memory cache VS. centralized cache in a distributed system
我们目前正在寻找最适合在分布式系统上访问关键数据的解决方案,我们正在考虑是使用内存缓存还是集中式缓存。
关于我们想要的数据的一些信息store/access:
- 数据量非常小
- 数据很冷;这意味着它几乎没有变化,只有当人在我们的后台系统中改变某些东西时才会改变
- 更改时必须是最新的(几 100 毫秒的延迟是可以的)
- 我们应用程序的非常关键路径,需要非常高的 SLA(可靠性和响应时间(访问不超过 20 毫秒))
- 数据被频繁读取(每秒高达数千次)
我们看到的方式如下-
在内存缓存中
优点:
- 比网络访问+序列化更快
- 分布方面的可靠性更高(如果一个实例死亡,数据仍然存在于其他实例上)
缺点:
- 编码和维护要复杂得多
- 需要在发生更改时通知实例并且需要单独更新每个实例+需要在每个服务器启动时加载数据
- 增加了数据不一致的高风险(一个实例与其他实例具有不同或过时的数据)
集中缓存
为了方便交流,我们考虑过使用 Redis。
优点:
- 更易于维护
- 非常可靠,我们有很多在分布式系统中使用 Redis 的经验
- 只更新一个地方
- 确保数据一致性
缺点:
- 单点故障(这是我们很关心的问题);即使我们采用这个解决方案,我们也会部署一个集群
- 如果由于某种原因刷新缓存会发生什么
我没有发现使用 Redis 进行集中式缓存有任何问题。
- 无论如何,你将要有一个集群设置,这样如果一个主节点失败,从节点将占据这个位置。
- 如果缓存由于某种原因被刷新,那么您必须构建缓存,同时请求将从主要源 (DB) 获取数据
- 您可以启用持久化并加载持久化在磁盘中的数据,并且可以秒级获取数据(即插即用)。如果你认为你会有不一致,那么按照下面的方法。
即使缓存不可用,系统也应该可以工作(显然有延迟时间)。这意味着应用程序逻辑应该检查 redis 中的缓存,如果它不存在或系统本身不可用,它应该从 dB 获取值,然后将其填充到 redis,然后服务于客户端。
通过这种方式,即使您的 redis master 和 slave 挂了,您的应用程序也能正常工作,但会有延迟。而且您的缓存也将是最新的。
希望这对您有所帮助。
Redis 是集中式缓存的绝佳选择。它速度快,性能出色。我们用它来存储数 TB 的数据。
似乎您应该使用集中式缓存,位于您的数据库和应用程序层之间,其中所有数据库 read/writes 使用直写缓存失效方案通过缓存。
我们目前正在寻找最适合在分布式系统上访问关键数据的解决方案,我们正在考虑是使用内存缓存还是集中式缓存。
关于我们想要的数据的一些信息store/access:
- 数据量非常小
- 数据很冷;这意味着它几乎没有变化,只有当人在我们的后台系统中改变某些东西时才会改变
- 更改时必须是最新的(几 100 毫秒的延迟是可以的)
- 我们应用程序的非常关键路径,需要非常高的 SLA(可靠性和响应时间(访问不超过 20 毫秒))
- 数据被频繁读取(每秒高达数千次)
我们看到的方式如下-
在内存缓存中
优点:
- 比网络访问+序列化更快
- 分布方面的可靠性更高(如果一个实例死亡,数据仍然存在于其他实例上)
缺点:
- 编码和维护要复杂得多
- 需要在发生更改时通知实例并且需要单独更新每个实例+需要在每个服务器启动时加载数据
- 增加了数据不一致的高风险(一个实例与其他实例具有不同或过时的数据)
集中缓存
为了方便交流,我们考虑过使用 Redis。
优点:
- 更易于维护
- 非常可靠,我们有很多在分布式系统中使用 Redis 的经验
- 只更新一个地方
- 确保数据一致性
缺点:
- 单点故障(这是我们很关心的问题);即使我们采用这个解决方案,我们也会部署一个集群
- 如果由于某种原因刷新缓存会发生什么
我没有发现使用 Redis 进行集中式缓存有任何问题。
- 无论如何,你将要有一个集群设置,这样如果一个主节点失败,从节点将占据这个位置。
- 如果缓存由于某种原因被刷新,那么您必须构建缓存,同时请求将从主要源 (DB) 获取数据
- 您可以启用持久化并加载持久化在磁盘中的数据,并且可以秒级获取数据(即插即用)。如果你认为你会有不一致,那么按照下面的方法。
即使缓存不可用,系统也应该可以工作(显然有延迟时间)。这意味着应用程序逻辑应该检查 redis 中的缓存,如果它不存在或系统本身不可用,它应该从 dB 获取值,然后将其填充到 redis,然后服务于客户端。
通过这种方式,即使您的 redis master 和 slave 挂了,您的应用程序也能正常工作,但会有延迟。而且您的缓存也将是最新的。
希望这对您有所帮助。
Redis 是集中式缓存的绝佳选择。它速度快,性能出色。我们用它来存储数 TB 的数据。
似乎您应该使用集中式缓存,位于您的数据库和应用程序层之间,其中所有数据库 read/writes 使用直写缓存失效方案通过缓存。