我有一个简单的用例:
我确信,Redis作为一个缓存可以为我提供我需要的东西,如果这个应用程序要承受很高的负载,然而,我对以下选项感到有点困惑:
写入缓存
Java应用-> Redis -> DB
就数据一致性而言,似乎是最好的选择,因为请求只有在数据库更新后才会返回。但是,缺点意味着不可能进行批处理更新。如果应用程序负载很重,这似乎不是最好的选择。
写后缓存
->应用程序-> ->应用程序(批处理配置)-> DB
从性能上看似乎是最好的选择。在负载过重的情况下,通过Java (配置批处理大小、延迟等)将数据从缓存传输到DB。但是,缺点似乎是,如果Redis上有系统故障,内存中的所有数据都会消失(?)!
我的问题很简单:
在这样的用户应用程序中,在失败的情况下缺少帖子是一个很大的不-不,所以我想知道你对这个问题的看法是什么,以及问题的最佳解决方案是什么。
发布于 2020-12-29 14:10:46
发布于 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)。
发布于 2020-12-29 19:27:10
https://softwareengineering.stackexchange.com/questions/420451
复制相似问题