【问题标题】:How to update redis after updating database?更新数据库后如何更新redis?
【发布时间】:2016-07-18 02:39:25
【问题描述】:

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

我发现更新数据库后更新redis有几种方法。例如:

  1. 将 redis 中的键设置为过期
  2. 更新数据库后立即更新 redis。
  3. 将数据放入MQ,使用consumer更新redis。

我有点迷茫,不知道怎么选。

你能告诉我每种方式的优缺点吗,最好告诉我其他更新redis的方式或推荐一些关于这个问题的博客。

【问题讨论】:

  • 您应该格式化您的问题,以便其他人可以轻松阅读它们。检查我是如何解决你的问题的,下次再这样做......
  • 谢谢。下次我会注意的。
  • 没问题 ;) 只是如果您以这种方式发布问题,您将很难得到答案!

标签: database caching redis


【解决方案1】:

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

当您将数据添加到最终存储(即您的 SQL 数据库)时,您需要将此数据排入某个服务总线或消息队列,并让某些异步服务使用某种后台进程来完成整个同步。

您不想陷入这种情况(不使用服务总线和异步服务时):

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

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

顺便说一句,您不会总是遇到这种情况(如果密钥没有过期,则意味着它不应该被覆盖)。这可能取决于您的实际域。

【讨论】:

  • 你好,我还有一个问题,如果我更新redis失败或者MQ崩溃,都会导致脏读,我想知道如何处理脏读?谢谢
  • 尝试使用带确认的持久 MQ。 1.如果redis失败,MQ没有ack,会自动重试。 2.如果MQ发生故障,它将在MQ再次启动时尝试,因为它是持久的。(它有点慢)
  • Golang 能不能用在后台同步的异步服务?
猜你喜欢
  • 1970-01-01
  • 2020-11-17
  • 2021-12-11
  • 2011-03-05
  • 1970-01-01
  • 2019-04-16
  • 1970-01-01
  • 1970-01-01
  • 2017-03-04
相关资源
最近更新 更多