罗恩
我们目前正在寻找用于访问分布式系统上关键数据的最合适的解决方案,并且正在考虑是否要在内存缓存中使用,而不是在集中式缓存中使用。
有关我们希望存储/访问的数据的一些信息:
- 数据量很小
- 数据非常冷;这意味着它几乎没有改变,只有当人类改变了我们的后台系统中的某些东西时,它才会改变
- 更改时必须是最新的(几百毫秒的延迟就可以了)
- 我们应用程序中非常关键的路径,要求很高的SLA(可靠性和响应时间(访问时间不超过20ms))
- 频繁读取数据(每秒最多读取数千次)
我们看到的方式如下-
在内存缓存中
优点:
- 比网络访问+序列化更快
- 在分发方面具有更高的可靠性(如果一个实例死亡,则其他实例上的数据仍然存在)
缺点:
- 编码和维护要复杂得多
- 发生更改后需要通知实例,并且需要分别更新每个实例+需要在每个服务器启动时加载数据
- 增加了数据不一致的高风险(一个实例与其他实例具有不同或过时的数据)
集中式缓存
为了便于讨论,我们考虑使用Redis。
优点:
- 维护更简单
- 非常可靠,我们在分布式系统中使用Redis有很多经验
- 只有一个地方可以更新
- 确保数据一致性
缺点:
- 单点故障(这对我们来说是一个大问题);即使我们采用此解决方案,我们也会部署一个集群
- 如果由于某种原因刷新了缓存会发生什么
卡尔提凯扬·戈帕尔
在使用Redis进行集中式缓存时,我没有发现任何问题。
- 无论如何,您将要进行集群设置,因此如果主服务器失败,则从服务器将占据该位置。
- 如果由于某种原因刷新了缓存,则您必须构建缓存,与此同时,请求将从主源(DB)获取数据
- 您可以启用持久性并加载持久化在磁盘中的数据,并且可以在几秒钟内获取数据(即插即用)。如果您认为自己会有不一致之处,请按照以下方法进行操作。
即使高速缓存不可用,系统也应该可以工作(显然延迟了时间)。意味着应用逻辑应检查redis中的缓存,如果缓存不存在或系统本身不可用,则应从dB中获取值,然后将其填充到redis中,然后再提供给客户端。
这样,即使您的Redis主服务器和从服务器都关闭了,您的应用程序也可以正常运行,但会出现延迟。而且您的缓存也会保持最新状态。
希望这可以帮助。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
编辑于
我来说两句