【问题标题】:Write-through cache Redis直写式缓存 Redis
【发布时间】:2019-11-05 05:30:48
【问题描述】:

我一直在研究如何可靠地实现直写缓存机制来存储实时数据。

基本上我们需要的是这样的:

Save data to Redis -> Save to database (underlying)  
Read data from Redis <- Read from database in case unavailable in cache  

帮助实施此缓存策略的在线资源似乎很少。

问题是:

1) Redis 和数据库(在我的例子中是 Mongo)之间没有内置事务的可能性。
2) 没有事务意味着对底层数据库的写入是不可靠的。

我了解如何实现这一点的最直接方法是使用像 Kafka 这样的代理,并将消息放在持久队列中以供以后处理。
因此,Kafka 将是负责可靠处理的实体。

另一种方法是在调度程序中使用自定义实现来检查 Redis 数据库中的脏记录。乍一看,这种方法似乎有一些权衡,如果可能的话,我希望不必走这条路。

我正在寻找一些关于如何以其他方式实现此功能的选项。
或者这实际上是否是最可行的方法。

【问题讨论】:

  • 为什么不先写入db呢?通常的做法是先写入 db,然后当你从它读取时 -> 创建缓存,当删除/更新实体时 -> 在此键上使缓存无效。因为你得到的读操作多于写操作。您是否将 Redis 与 AOF 一起使用?不要认为它的写入速度比 Mongo 快。
  • @ipave 是否先写入数据库或入侵取决于他需要的数据一致性级别。
  • @ipave 这对我不起作用。当我处理实时数据时,每次请求都需要从数据库中检索以填充缓存,从而消除了使用缓存的优势。
  • @Alexandar Petrov 我说的是新记录(尚未创建缓存)。如果你编辑或删除记录最好是删除cahe而不是删除记录。因为如果你删除缓存并且你的进程已经死了 - 最坏的情况是你再次从数据库中读取它比你删除记录并且不删除cahe更好。这样你就会得到不一致的状态。

标签: java caching redis apache-kafka


【解决方案1】:

所以比你上面提到的更好的方法是使用 kafka 和消费者,它将数据存储到 mongo。但是请阅读它的交付保证,因为我记得只有一次在 kafka 流中保证(在两个主题之间),在您的情况下,您的数据库应该是幂等的,因为您至少得到一次保证。并且不要忘记使用 Redis 打开 AOF,不要丢失数据。并且不要忘记,在这种情况下,您会在 db 中获得最终的一致性以及所有后果。

【讨论】:

  • 感谢您的提示。难道没有别的办法了吗?除了理论读取之外,我找不到任何关于直写实现的好资源。另一件事是,在这种情况下,我的消费者仍然需要一些自定义代码来管理数据库上的失败写入。
  • 这不是一项通常的任务,而且我很确定写入 mongo 并不比使用 AOF 写入 Redis 快多少,因此可能是先写入 db 的更好方法。或者只留下一个存储空间。您是否检查过这种方法并遇到了一些性能问题?也许只有 mongo 的性能就足够了,并且您进行了高级优化?
  • 如果你在 mongo 中有一些限制,那将是一个噩梦......所以我不建议这样做。最好只有一个数据库或先写入数据库并从缓存中读取...
  • 是的,但正如我解释的那样,保存到数据库后我无法从缓存中读取。它是关于需要在缓存中随时可用并随时更新的实时数据。如果需要,我不会对客户端请求的每次检索都发出 db 请求来检查和填充缓存。我想要一个分布式缓存的原因是因为数据会呈指数增长(每个 google 地方都会添加实时提要),这通常会导致使用标准数据库随着时间的推移性能下降。这就是为什么我将缓存用作主要缓存并避免将来头痛的原因。
  • 然后将这种方法与 kafka 一起使用,但要为约束引起的错误做好准备,因为在检查约束之前,您不确定您的数据。你会在未经检查的数据下进行计算。因此,据我所知,您有两种选择:1)可能出现错误的快速机制 2)没有错误的慢速机制。如果您的系统允许错误,则采取 1.
【解决方案2】:

在审核时,我将使用 MongoDB 作为一个没有 Redis 的单一数据存储。
我猜过早的优化是邪恶的。

无论如何,我可以在基准测试之后添加其他架构。
重构缓存的计划应该不会太难。

缩放是另外一个问题,所以我现在不应该在开发过程中被这个问题困扰。

接受@Ipave 答案,目前使用单个数据存储。

【讨论】:

    猜你喜欢
    • 2021-04-29
    • 2013-10-28
    • 2015-01-21
    • 2021-05-05
    • 1970-01-01
    • 2015-06-07
    • 1970-01-01
    • 2020-09-16
    • 1970-01-01
    相关资源
    最近更新 更多