首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Redis写穿缓存与写后缓存(消息队列?)

Redis写穿缓存与写后缓存(消息队列?)
EN

Software Engineering用户
提问于 2020-12-29 09:56:40
回答 3查看 3.1K关注 0票数 1

我有一个简单的用例:

  • 基于链接到地理点的帖子聚合的新闻提要
  • 用户可以在feed帖子上发表评论
  • 用户可以喜欢输入帖子和评论。

我确信,Redis作为一个缓存可以为我提供我需要的东西,如果这个应用程序要承受很高的负载,然而,我对以下选项感到有点困惑:

写入缓存

Java应用-> Redis -> DB

就数据一致性而言,似乎是最好的选择,因为请求只有在数据库更新后才会返回。但是,缺点意味着不可能进行批处理更新。如果应用程序负载很重,这似乎不是最好的选择。

写后缓存

->应用程序-> ->应用程序(批处理配置)-> DB

从性能上看似乎是最好的选择。在负载过重的情况下,通过Java (配置批处理大小、延迟等)将数据从缓存传输到DB。但是,缺点似乎是,如果Redis上有系统故障,内存中的所有数据都会消失(?)!

我的问题很简单:

  • 具有写后缓存的高可用性集群是否解决了我的所有问题?
  • 高可用性是否会写入磁盘(Redis),从而保证不会丢失任何数据?
  • 即使使用写后缓存,添加消息队列(例如RabbitMq)也是最安全的操作过程,还是即使在负载较高的情况下也不需要这样做?

在这样的用户应用程序中,在失败的情况下缺少帖子是一个很大的不-不,所以我想知道你对这个问题的看法是什么,以及问题的最佳解决方案是什么。

EN

回答 3

Software Engineering用户

回答已采纳

发布于 2020-12-29 14:10:46

票数 3
EN

Software Engineering用户

发布于 2021-01-01 00:17:44

已经有很好的答案了。以下是我的意见:

具有写后缓存的高可用性集群是否解决了我的所有问题?

这个设计听起来很合理。

在您的基准测试中,有一件事值得测试,那就是当它同时提供大量的读写功能时,它是如何执行的,因为Redis是一个单线程。

如果数据大小很大,那么缓存所有数据都是有害的。在这种情况下,您可以考虑过期Redis键(例如,将Redis配置为以LRU方式删除项)。

您的数据模式也很重要,因为复杂的数据结构/查询在Redis中缓存的效率可能较低。有了这个考虑,有可能

  • 设计优先处理某些请求的策略,或
  • 使缓存机制服务于某些查询,而数据库读取则为其他查询服务。

高可用性是否会写入磁盘(Redis),从而保证不会丢失任何数据?

注:在一些罕见的情况下,数据可能会丢失。假设您正在使用Redis集群并将其写入主服务器,如果主服务器在新数据填充到从服务器之前死亡,那么最近的书面数据将丢失。

即使使用写后缓存,添加消息队列(例如RabbitMq)也是最安全的操作过程,还是即使在负载较高的情况下也不需要这样做?

如果数据大小不是很大,并且要将所有数据保存在Redis中,则另一种选择是RedisGears。它支持编写模式将Redis数据结构与RGSync配方同步到支持数据存储(目前支持甲骨文、C13、Cassandra和雪花)。不过,还没有包括MongoDB。

对于数据库,可能也值得考虑埃拉桑德拉,它是Cassandra和ElasticSearch的结合,因此它擅长水平写入缩放和失败接管(Cassandra)和地理空间查询(ElasticSearch)。

票数 3
EN

Software Engineering用户

发布于 2020-12-29 19:27:10

票数 0
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/420451

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档