客户端缓存简介

Redis 中的服务器辅助客户端缓存

客户端缓存减少了 Redis 客户端和服务器,这通常可以提高性能。

默认情况下,应用程序服务器(位于用户应用程序和数据库之间)会联系 Redis 数据库服务器通过客户端库进行每个读取请求。 下图显示了来自用户应用程序的通信流, 通过 Application Server 访问数据库,然后再返回:

当您使用客户端缓存时,客户端库 在检索数据项时维护数据项的本地缓存 从数据库中。当再次需要相同的项目时,客户端 可以满足来自缓存而不是数据库的读取请求:

访问缓存比通过 网络,它减少了网络流量。客户端缓存减少 数据库服务器上的负载,因此您可以使用更少的硬件来运行它 资源。

与其他形式的缓存一样, 客户端缓存在非常常见的使用案例中效果很好,其中数据的一小部分 的访问频率要比其他数据高得多(根据 到帕累托原则)。

在数据更改时更新缓存

所有缓存系统都必须实现一个方案来更新缓存中的数据 当 main 数据库中的相应数据发生更改时。Redis 使用 方法称为跟踪

启用客户端缓存后,Redis 服务器会记住或跟踪密钥集 每个客户端连接之前已读取。这包括客户端 直接读取数据,就像GET命令,以及服务器根据存储的数据计算值的位置, 与 一样STRLEN.当任何客户端 将新数据写入跟踪的密钥,服务器发送失效消息 分配给以前访问过该密钥的所有客户端。此消息会发出警告 其缓存的数据副本不再有效的客户端,以及客户端 将驱逐过时的数据作为响应。下次客户端读取 相同的 key,它将直接访问数据库并刷新其缓存 替换为更新的数据。

注意:
如果来自客户端的任何连接断开连接(包括 一个),则客户端将刷新 客户端缓存。然后,缓存将恢复,以便从 仍处于活动状态的连接。

下面的序列图显示了两个客户端在它们 访问并更新相同的密钥:

哪些客户端库支持客户端缓存?

以下客户端库从规定的版本开始支持 CSC:

客户 版本
redis-py 5.1.0 版
Jedis 5.2.0 版

哪些命令可以缓存数据?

所有只读命令(使用@read ACL 类别) 将使用缓存数据,但以下情况除外:

  • probabilistictime series 数据类型的任何命令。 这些类型被设计为经常更新,这意味着缓存 几乎没有好处。
  • 非确定性命令(如HRANDFIELD,HSCAN, 和ZRANDMEMBER.根据设计,这些命令 每次调用它们时都会给出不同的结果。
  • Redis 查询引擎命令(使用FT.*前缀),例如FT.SEARCH.

您可以使用MONITOR命令设置为 检查使用客户端缓存时的服务器行为。因为MONITOR只 报告来自服务器的活动,您应该会找到第一个可缓存的 访问密钥会导致服务器响应。但是,随后 访问由缓存满足,因此MONITOR应该举报 NO server 活动(如果客户端缓存正常工作)。

命令会缓存哪些数据?

从广义上讲,来自对命令调用 在首次使用后进行缓存。该数据的子集 或从中计算的值像往常一样从服务器中检索,并且 然后单独缓存。例如:

  • 检索到的整个字符串GET将添加到缓存中。检索到的同一字符串的部分SUBSTR根据 server 的 URL 中,然后与原始 字符串。
  • GETBITBITFIELD在字符串上 将返回值与原始字符串分开缓存。
  • 对于键访问的复合数据类型 (hashJSON、setsorted set)、 整个对象与各个字段分开缓存。 因此,的JSON.GET mykey $JSON.GET mykey $.myfield创造 单独的条目。
  • 范围包括列表流、 排序集与它们所属的对象分开缓存。同样 由SINTERSDIFF创建单独的缓存条目。
  • 对于多键读取命令,例如MGET, 键的顺序很重要。例如MGET name:1 name:2是 cached 与MGET name:2 name:1因为服务器会返回 值。
  • 根据数据类型计算的布尔值或数值(例如SISMEMBER) 和LLEN与 对象。

使用建议

与任何缓存系统一样,客户端缓存也有一些限制:

  • 缓存的可用内存量有限。当限制 时,客户端必须从 cache 为新的数据腾出空间。
  • 缓存未命中、跟踪和失效消息总是会略微增加 性能损失。

以下是一些准则,可帮助您在这些准则中有效地使用客户端缓存 局限性:

  • 对缓存不友好的数据使用单独的连接: 缓存带来最大的好处 对于经常读取且不经常更新的键。但是,您 也可能包含频繁接收的数据,例如计数器和记分板 更新。在这种情况下,失效的性能开销 消息可能大于缓存节省的费用。避免此问题 通过使用单独的连接,而不对 对缓存不友好。

  • 估计可以缓存的项目数:客户端库允许您 指定要在缓存中保存的最大项目数。你 可以通过除以 最大所需大小 按要存储的项目的平均大小在内存中缓存 (使用MEMORY USAGE命令来获取密钥的内存占用)。例如,如果你有 10MB(或 10485760 字节)可用于缓存,平均 项目的大小为 80 字节,您可以容纳大约 10485760 / 80 = 缓存中的 131072 个项目。监控内存使用情况 在您的服务器上,使用实际测试负载来调整您的估计值 向上或向下。

    参考

    Redis 服务器为客户端缓存实现了 主要的 Redis 客户端,但可能对自定义客户端和其他 高级应用程序。有关客户端缓存的所有可用选项的完整技术指南,请参阅 Client-side caching reference

为本页评分
返回顶部 ↑