点 飞速发展的未来即将在你所在的城市举办一场活动。

加入我们 Redis Released

数据库行缓存

返回术语表

什么是数据库行缓存?

数据库行缓存是一种通过将经常访问的数据库行存储在内存中以提高性能并降低关系数据库上的负担的技术,这使得从缓存中检索数据比从数据库中读取数据更快。

Redis 中的数据库行缓存

为了提高登录和访问会话、购物车以及整个页面的性能,我们将这些信息从关系数据库中移至 Redis 中。通常,单个商品页面仅会从数据库中加载一或两行,并且这些行可以在 Redis 中单独缓存。在无法缓存整页或从数据库中读取项目的行会使数据库变成过度利用状态,从而增加成本,因此缓存关系数据库中的各个行可能很有用。

为了在准备承受较高负载时缓存数据库行,可以编写一个守护程序函数在 Redis 中缓存特定数据库行,并根据可变计划更新这些行。这些行将以 JSON 编码词典的形式进行存储,列名和行值将分别映射到词典键和值。缓存函数将使用两个 ZSET:scheduleZSET,它将使用原始数据库行中的行 ID 作为 ZSET 的成员,和 delayZSET,它将对成员使用相同行 ID,但该分数将是缓存更新之间的等待时间(秒)。

当行 ID 处于 delay ZSET 中时,将使用当前时间戳将其添加到 schedule ZSET。如果需要从缓存中删除某行,可以将延迟设置为小于或等于 0,并且缓存函数将处理该请求。计划函数首先设置该项目的延迟,然后计划立即缓存该项目。

缓存功能将从 schedule ZSET 中提取第一项目及其分数。如果没有项目或如果返回的时间戳在未来,则函数将等待 50 毫秒并重试。当识别出应立即更新的项目时,将检查该行的延迟。如果下次缓存时间的延迟小于或等于 0,则行 ID 将从 delay 和 schedule ZSET 中删除,缓存行将被删除,并且该函数将重试。对于应缓存的任何行,系统将更新该行的计划,从数据库中提取该行,并将在 Redis 中保存该行的 JSON 编码版本。

总体而言,缓存单个数据库行可能是改善数据库性能、减轻关系数据库的负载以及降低成本的有效方法。通过使用 Redis 来缓存频繁访问的行,即使在负载较重的情况下,数据库也能更有效地运行。虽然可以使用其他序列化格式,例如 XML、Google 的协议缓冲区、Thrift、BSON 或 MessagePack,但通常总体上更倾向于使用 JSON,因为它具有可读性和简洁性,借助所有使用现有 Redis 客户端的语言,用户可以快速进行编码和解码。尽管 Redis 不支持嵌套结构,但可以使用键名,或可以使用 JSON 或其他序列化程序库显式地存储嵌套结构。