Redis 如何知道它是否必须 return 缓存数据或来自数据库的新数据

How would Redis get to know if it has to return cached data or fresh data from DB

比如说,我正在使用来自数据库的一些长时间运行的任务来获取数千个或记录并使用 Redis 对其进行缓存。第二天有人更改了数据库中的几条记录。

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

如何实现同步?

由于数据源位于您的数据库中,并且您将数据从该数据库推送到 Redis,因此您始终需要从数据库更新到 Redis,至少您创建了另一个进程来同步数据。

我的建议只是 运行 首先从数据库到 Redis 的完整更新,然后使用同步过程,每次你注意到数据库中的 update/creation/deletion 操作时,你将它拉到 Redis。

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

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

如果您由于某种原因不能执行上述操作,您可以创建一个同步守护程序,它不断从数据库中读取数据,并将它们与 Redis 中的数据存储进行比较,如果它们在您更新时有所不同,或者如果它们不相同存在于某些双方您可以删除或创建 Redis 中的条目。

Redis不知道DB中的数据是否更新了

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

  1. 客户端检查数据,例如key-value对,存在于Redis中。
  2. 如果key存在,client从Redis中获取对应的value。
  3. 否则,它从数据库中获取数据,并将其设置到Redis。客户端还为 Redis 中的 key-value 对设置了过期时间,比如 5 分钟。
  4. 然后任何对同一键的后续请求都将由 Redis 提供服务。虽然Redis中的数据可能是out-of-date.
  5. 但是,在 5 分钟后,该密钥将自动从 Redis 中删除。
  6. 转到步骤 1。

所以为了让你的数据保存在Redis中update-to-date,你可以设置一个较短的过期时间。但是,您的数据库必须处理大量请求。

如果你想大大减少对数据库的请求,你可以设置一个大的过期时间。因此,在大多数情况下,Redis 可以为可能有过时数据的请求提供服务。

您应该仔细考虑性能和陈旧数据之间的 trade-off。

我的解决方案是:

当你在数据库中更新、删除或添加新数据时,你应该删除redis中的所有数据。在您的获取路线中,您应该检查数据是否存在。如果没有,你应该将所有数据从db存储到redis。