如果必须从数据库

时间:2018-03-15 12:51:28

标签: caching redis memcached cdn

说,我是数千人或使用来自数据库的长期运行任务记录并使用Redis进行缓存。第二天,有人在DB中改变了一些记录。

下次redis如何知道它必须返回缓存数据或再次重新访问数据库中的所有数千条记录?

这种同步是如何实现的?

2 个答案:

答案 0 :(得分:6)

Redis不知道数据库中的数据是否已更新。

通常,我们使用Redis来缓存数据,如下所示:

  1. 客户端检查数据,例如键值对,存在于Redis中。
  2. 如果密钥存在,客户端将从Redis获取相应的值。
  3. 否则,它从DB获取数据,并将其设置为Redis。此外,客户还为Redis中的键值对设置了到期日,比如5分钟。
  4. 然后Redis将提供对同一密钥的任何后续请求。虽然Redis中的数据可能已过时。
  5. 但是,在5分钟后,此密钥将自动从Redis中删除。
  6. 转到第1步。
  7. 因此,为了使您的数据在Redis中保持最新更新,您可以设置一个较短的到期时间。但是,您的数据库必须提供大量请求。

    如果您希望大幅减少对数据库的请求,则可以设置较长的到期时间。因此,大多数情况下,Redis可以使用可能存在的数据来处理请求。

    您应该仔细考虑性能和固定数据之间的权衡。

答案 1 :(得分:4)

由于真实来源存在于您的数据库中并且您将数据从此数据库推送到Redis,因此您始终必须从数据库更新到Redis,至少您创建了另一个同步数据的过程。

我的建议只是运行从DB到Redis的第一次完整更新,然后使用同步过程,每当您在数据库中发现更新/创建/删除操作时,将其拉到Redis。

我不知道你使用哪个Redis结构在Redis中存储数据库记录,但我想它可能是一个哈希,可能是你的表索引索引所以同步操作将是立即的:如果在你的数据库你设置HSET,如果删除HDEL等等。

您甚至可以省略从DB到Redis的第一次完全同步,只需清理Redis并启动同步过程。

如果由于某种原因无法执行上述操作,则可以创建一个syncher守护程序,该守护程序会不断地从数据库中读取数据,并将它们与Redis中的数据存储进行比较(如果它们在某种程度上与您更新或在它们不存在时不同)您可以在Redis中删除或创建条目。