如何在更新数据库后更新Redis?

28

我在Redis中缓存了一些数据,如果有数据存在,则从Redis中读取数据,否则从数据库中读取数据并将数据写入Redis。

我发现在更新数据库后有几种方法可以更新Redis。例如:

  1. 将Redis中的键设置为过期
  2. 在更新数据库后立即更新Redis。
  3. 将数据放入MQ并使用消费者更新Redis。

我有点困惑,不知道该如何选择。

您能告诉我每种方法的优缺点吗?还有其他更新Redis的方法或推荐一些关于这个问题的博客吗?


3
你应该将你的问题格式化,以便他人能够轻松地阅读。请检查我如何修复你的问题并在下次这样做时效仿。 - Matías Fidemraizer
2
谢谢。下次我会注意的。 - mengying.ye
1
没问题 ;) 只是如果您以这种方式发布问题,很难得到答案! - Matías Fidemraizer
2个回答

23

实际数据存储和缓存应使用你在问题中已经描述的第三种方法进行同步。

当您向确定性存储(即SQL数据库)添加数据时,您需要将此数据排队到某个服务总线或消息队列,并让某个异步服务使用某种后台进程执行整个同步过程。

如果不使用服务总线和异步服务,您不希望遇到以下情况:

  • 使请求或处理变慢,因为用户需要等待数据同时存储在数据库和缓存中。
  • 存在缓存过程中失败的风险,无法具有重试策略(这通常是服务总线或某些消息队列中的内置功能)。此外,此失败可能导致部分或完全缓存损坏,您将无法自动轻松地安排某些任务来解决此情况。

关于使用Redis键过期,这是一个好主意。由于Redis可以使用其内置机制过期键,因此您不应从整个后台进程实现键过期。如果键存在,则表示它仍然有效。

顺便说一下,您不会始终处于这种情况(如果键没有过期,则不应被覆盖)。这可能取决于您实际的领域。


嗨,我有另一个问题,如果我更新Redis失败或MQ故障,它会导致脏读取,我想知道如何处理脏读取?谢谢。 - mengying.ye
1
尝试使用带确认的持久化MQ。 1.如果Redis失败,则无法对MQ进行确认,因此它将自动重试。 2.在MQ故障的情况下,它会在MQ再次上线时尝试,因为它是持久化的(速度稍慢)。 - Raghavendra
1
Golang 可以用于全后台同步的异步服务吗? - Gaurav Dave

0
您可以创建一个 API 与 Redis 服务器进行交互,然后使用 SQL CLR 调用该 API。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接