客户端缓存简介
Redis 中的服务器辅助客户端缓存
客户端缓存减少了 Redis 客户端和服务器,这通常可以提高性能。
默认情况下,应用程序服务器(位于用户应用程序和数据库之间)会联系 Redis 数据库服务器通过客户端库进行每个读取请求。 下图显示了来自用户应用程序的通信流, 通过 Application Server 访问数据库,然后再返回:
当您使用客户端缓存时,客户端库 在检索数据项时维护数据项的本地缓存 从数据库中。当再次需要相同的项目时,客户端 可以满足来自缓存而不是数据库的读取请求:
访问缓存比通过 网络,它减少了网络流量。客户端缓存减少 数据库服务器上的负载,因此您可以使用更少的硬件来运行它 资源。
与其他形式的缓存一样, 客户端缓存在非常常见的使用案例中效果很好,其中数据的一小部分 的访问频率要比其他数据高得多(根据 到帕累托原则)。
在数据更改时更新缓存
所有缓存系统都必须实现一个方案来更新缓存中的数据 当 main 数据库中的相应数据发生更改时。Redis 使用 方法称为跟踪。
启用客户端缓存后,Redis 服务器会记住或跟踪密钥集
每个客户端连接之前已读取。这包括客户端
直接读取数据,就像GET
命令,以及服务器根据存储的数据计算值的位置,
与 一样STRLEN
.当任何客户端
将新数据写入跟踪的密钥,服务器发送失效消息
分配给以前访问过该密钥的所有客户端。此消息会发出警告
其缓存的数据副本不再有效的客户端,以及客户端
将驱逐过时的数据作为响应。下次客户端读取
相同的 key,它将直接访问数据库并刷新其缓存
替换为更新的数据。
下面的序列图显示了两个客户端在它们 访问并更新相同的密钥:
哪些客户端库支持客户端缓存?
以下客户端库从规定的版本开始支持 CSC:
客户 | 版本 |
---|---|
redis-py |
5.1.0 版 |
Jedis |
5.2.0 版 |
哪些命令可以缓存数据?
所有只读命令(使用@read
ACL 类别)
将使用缓存数据,但以下情况除外:
- probabilistic 和 time series 数据类型的任何命令。 这些类型被设计为经常更新,这意味着缓存 几乎没有好处。
- 非确定性命令(如
HRANDFIELD
,HSCAN
, 和ZRANDMEMBER
.根据设计,这些命令 每次调用它们时都会给出不同的结果。 - Redis 查询引擎命令(使用
FT.*
前缀),例如FT.SEARCH
.
您可以使用MONITOR
命令设置为
检查使用客户端缓存时的服务器行为。因为MONITOR
只
报告来自服务器的活动,您应该会找到第一个可缓存的
访问密钥会导致服务器响应。但是,随后
访问由缓存满足,因此MONITOR
应该举报 NO
server 活动(如果客户端缓存正常工作)。
命令会缓存哪些数据?
从广义上讲,来自对命令调用 在首次使用后进行缓存。该数据的子集 或从中计算的值像往常一样从服务器中检索,并且 然后单独缓存。例如:
- 检索到的整个字符串
GET
将添加到缓存中。检索到的同一字符串的部分SUBSTR
根据 server 的 URL 中,然后与原始 字符串。 - 用
GETBIT
或BITFIELD
在字符串上 将返回值与原始字符串分开缓存。 - 对于键访问的复合数据类型
(hash、JSON、set 和 sorted set)、
整个对象与各个字段分开缓存。
因此,的
JSON.GET mykey $
和JSON.GET mykey $.myfield
创造 单独的条目。 - 范围包括列表、流、
排序集与它们所属的对象分开缓存。同样
由
SINTER
和SDIFF
创建单独的缓存条目。 - 对于多键读取命令,例如
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。