【问题标题】:How would Redis get to know if it has to return cached data or fresh data from DBRedis 如何知道它是否必须从数据库返回缓存数据或新数据
【发布时间】:2018-08-24 07:03:14
【问题描述】:

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

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

这种同步是如何实现的?

【问题讨论】:

    标签: caching redis memcached cdn


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

    • 看,下次很少有记录被改变。是否有可能我可以从 redis 中获取缓存数据而只从 DB 中获取更改数据?
    • 嗯,我不知道我是否理解你,在Redis中所有数据都被缓存,你只需要使用正确的键(或成员)查询正确的结构,关于数据库,取决于你有哪个,例如如果你使用 MongoDB,他们有很好的oplog 这是一个上限集合,数据库中的所有更改都已注册,因此你可以在另一个进程中读取 oplog 并了解操作类型(删除,创建或更新)相应地更新 Redis。如果您使用的是其他 RDBS 或 No-SQL 数据库,我们必须查看是否有类似于 oplog 的内容
    • 或者避免从 oplog 或任何地方读取另一个进程的好方法(取决于您拥有的 DB 类型)是每次从您保存在数据库中的应用程序更新数据库时,并且在 Redis 中进行相同的操作。您可以通过让负责更新 Redis 的每个操作(更新、删除和创建寄存器)的 DB 侦听器来实现这一点
    • 这里是oplog的链接,以防你使用MongoDB docs.mongodb.com/manual/core/replica-set-oplog
    • aaah 好的,我现在明白你上面的问题了,你想从 Redis 获取数据,对于那些改变它的寄存器,从数据库中获取数据,对吧?老实说,那么拥有 Redis 并没有多大意义,拥有 Redis 的好处是每次数据库更改时您都可以更新,并且您将始终在 Redis 中拥有更新的数据。此外,您需要了解寄存器何时更改以及决定从 Redis 或 DB 获取数据的哪个寄存器。无论如何,假设你不能/不想接受我的一些建议,并且你想按照你在评论中提出的方式去做......
    【解决方案3】:

    我的解决办法是:

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

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 2021-07-02
    • 2018-02-18
    • 2018-11-22
    • 2021-10-13
    • 2018-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-27
    相关资源
    最近更新 更多