【发布时间】:2018-08-24 07:03:14
【问题描述】:
说,我正在使用数据库中的一些长时间运行的任务来获取数千个或记录,并使用 Redis 对其进行缓存。第二天有人更改了数据库中的几条记录。
下一次 redis 怎么知道它必须返回缓存的数据或再次必须重新访问数据库中的所有数千条记录?
这种同步是如何实现的?
【问题讨论】:
标签: caching redis memcached cdn
说,我正在使用数据库中的一些长时间运行的任务来获取数千个或记录,并使用 Redis 对其进行缓存。第二天有人更改了数据库中的几条记录。
下一次 redis 怎么知道它必须返回缓存的数据或再次必须重新访问数据库中的所有数千条记录?
这种同步是如何实现的?
【问题讨论】:
标签: caching redis memcached cdn
Redis 不知道 DB 中的数据是否已更新。
通常情况下,我们使用Redis来缓存数据如下:
5 分钟。5 分钟后,此密钥将自动从 Redis 中删除。因此,为了使 Redis 中的数据保持最新,您可以设置较短的过期时间。但是,您的数据库必须处理大量请求。
如果你想大幅度减少对 DB 的请求,你可以设置一个大的过期时间。因此,在大多数情况下,Redis 可以为请求提供可能的陈旧数据。
您应该仔细考虑性能和陈旧数据之间的权衡。
【讨论】:
由于事实源位于您的数据库中,并且您将数据从该数据库推送到 Redis,因此您始终必须从数据库更新到 Redis,至少您创建另一个进程来同步数据。
我的建议是从 DB 运行第一次完整更新到 Redis,然后使用同步过程,每次您注意到数据库中的更新/创建/删除操作时,您将其拉到 Redis。
我不知道您使用哪种 Redis 结构在 Redis 中存储数据库记录,但我猜它可能是一个哈希,可能由您的表索引索引,因此同步操作将立即进行:如果在您的数据库你设置一个HSET,如果删除HDEL等等。
您甚至可以省略从 DB 到 Redis 的第一次完全同步,而只需清理 Redis 并启动同步过程。
如果您由于某种原因无法执行上述操作,您可以创建一个同步器守护程序,该守护程序不断从数据库中读取数据,并将它们与 Redis 中的数据存储进行比较,如果它们以某种方式更新或它们不存在于 Redis在 Redis 中可以删除或创建条目。
【讨论】:
oplog 这是一个上限集合,数据库中的所有更改都已注册,因此你可以在另一个进程中读取 oplog 并了解操作类型(删除,创建或更新)相应地更新 Redis。如果您使用的是其他 RDBS 或 No-SQL 数据库,我们必须查看是否有类似于 oplog 的内容
oplog的链接,以防你使用MongoDB docs.mongodb.com/manual/core/replica-set-oplog
我的解决办法是:
当你在数据库中更新、删除或添加新数据时,你应该删除redis中的所有数据。在您的获取路线中,您应该检查数据是否存在。如果没有,您应该将所有数据从 db 存储到 redis。
【讨论】: