数据库行缓存是一种通过将频繁访问的数据库行存储在内存中来提高性能并减少关系数据库负载的技术,使得从缓存中检索数据比从数据库中读取数据更快。
为了提高性能,登录和访客会话、购物车以及整个页面已从关系数据库迁移到 Redis。单个产品页面通常只从数据库加载一两行,这些行可以单独缓存在 Redis 中。在无法缓存整个页面或从数据库读取项目行可能导致数据库过载、增加成本的情况下,缓存关系数据库中的单个行会非常有用。
为了在应对高负载之前缓存数据库行,可以编写一个守护进程函数来在 Redis 中缓存特定的数据库行,并按可变计划更新它们。行将以 JSON 编码的字典形式存储,列名和行值将映射到字典的键和值。缓存函数将使用两个 ZSET,一个是 scheduleZSET,它将原始数据库行中的行 ID 用作 ZSET 的成员;另一个是 delayZSET,它将使用相同的行 ID 作为成员,但分值表示两次缓存更新之间等待的秒数。
当行 ID 位于 delay ZSET 中时,它将以当前时间戳添加到 schedule ZSET 中。如果需要从缓存中移除某一行,可以将延迟设置为小于或等于 0,缓存函数将处理它。调度函数首先设置项目的延迟,然后立即调度该项目进行缓存。
缓存函数将从 schedule ZSET 中拉取第一个项目及其分值。如果没有项目或返回的时间戳在未来,它将等待 50 毫秒然后重试。当识别出应该立即更新的项目时,将检查该行的延迟。如果下次缓存的延迟小于或等于 0,则从 delay 和 schedule ZSET 中移除该行 ID,删除缓存的行,然后函数再次尝试。对于任何应该缓存的行,将更新该行的计划,从数据库中拉取该行,并将该行的 JSON 编码版本保存在 Redis 中。
总的来说,缓存单个数据库行是提高数据库性能、减轻关系数据库负载和降低成本的有效方法。通过使用 Redis 缓存频繁访问的行,即使在高负载下,数据库也能更高效地运行。虽然可以使用 XML、Google 的 Protocol Buffers、Thrift、BSON 或 MessagePack 等其他序列化格式,但通常首选 JSON,因为它易于人类阅读且简洁,并且在每种具有现有 Redis 客户端的语言中都有快速的编码和解码库。虽然 Redis 不允许嵌套结构,但可以使用键名,或者使用 JSON 或其他选择的序列化库显式存储嵌套结构。