Redis如何知道它是否必须从数据库返回缓存的数据或新数据

Swa*_*wal 5 memcached caching cdn redis

说,我正在使用数据库中的一些长期运行的任务,并使用Redis缓存它,成千上万次或进行记录。第二天,有人更改了数据库中的一些记录。

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

如何实现同步?

for*_*ack 6

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

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

  1. 客户端检查Redis中是否存在数据(例如键值对)。
  2. 如果密钥存在,则客户端从Redis获取相应的值。
  3. 否则,它将从DB获取数据,并将其设置为Redis。客户端也5为Redis中的键值对设置到期时间(例如分钟)。
  4. 然后,Redis将为以后对同一密钥的所有请求提供服务。尽管Redis中的数据可能已过时。
  5. 但是,5几分钟后,此密钥将自动从Redis中删除。
  6. 转到步骤1。

因此,为了使您的数据保持Redis最新更新,您可以设置较短的到期时间。但是,您的数据库必须处理大量请求。

如果要大幅减少对数据库的请求,可以设置较大的到期时间。这样,Redis在大多数情况下都可以为请求提供可能的过期数据。

您应该仔细考虑性能与陈旧数据之间的权衡。


Ave*_*ias 5

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

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

我不知道您使用哪个 Redis 结构在 Redis 中存储数据库记录,但我猜它可能是一个哈希,可能由您的表索引进行索引,因此同步操作将立即进行:如果在您设置的数据库中创建了一条记录一个HSET,如果删除HDEL等等。

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

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