【发布时间】: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