为更好地改善对热点Key的发起大量读请求导致的访问倾斜,云原生内存数据库Tair新增代理查询缓存功能(Proxy Query Cache),启用该功能后,代理节点会缓存热点Key对应的请求和查询结果,当在有效时间内收到同样的请求时直接返回结果至客户端,无需和后端的数据分片交互。
前提条件
- 实例为Tair(Redis企业版)内存型。
- 实例为集群架构(带Proxy)或读写分离架构。
应用场景
需要解决或预防热点Key的读请求引发的访问倾斜问题,即由于大量的读请求集中在某些Key形成了热点Key,从而导致某些数据分片的CPU使用率和流量使用率持续保持高位并接近100%。
说明 由于代理节点中缓存的热点Key的查询结果在有效时间内不会更新,需要业务上允许数据在缓存有效时间内的
最终一致性
。
工作原理

云原生内存数据库Tair会根据高效的排序和统计算法识别出实例中存在的热点Key(通常热点Key的QPS大于3,000),开启该功能后,代理节点Proxy会根据设定的规则缓存热点Key的请求和查询结果(仅缓存热点Key的查询结果,无需缓存整个Key)。当在缓存有效时间内收到相同的请求时,Proxy会直接返回结果至客户端,无需和后端的数据分片执行交互。在提升读取速度的同时,降低了热点Key对数据分片的性能影响,避免访问倾斜。
说明 您可以通过实例诊断功能分析实例是否存在访问倾斜;您还可以通过缓存分析功能查询实例的热点Key信息。具体操作,请参见发起实例诊断和实时Top Key统计。
设置方法及参数说明
您需要通过修改实例参数的方式管理该功能,各参数解释如下。具体操作,请参见设置实例参数。
参数 | 说明 |
---|---|
query_cache_enabled | 是否启用代理查询缓存功能,取值:
重要 由于代理节点中缓存的热点Key的查询结果在有效时间内不会更新,在启用该功能前,您需要确认业务上是否允许数据在缓存有效时间内的
最终一致性
。 |
query_cache_mode | 代理查询缓存的工作模式,取值:
重要 由于代理节点的缓存空间有限(代理节点每个线程100 MB),如果设置该参数的值为1,代理节点将按照LRU算法进行淘汰,可能降低缓存的命中率,从而引起整体性能的下降。 |
query_cache_expire | 缓存数据的有效时间,单位为毫秒,取值:100~60000,默认值为1000。
|
相关命令
云原生内存数据库Tair提供了相关命令帮助您获取代理查询缓存的使用情况,您可以通过 代理模式 连接至该实例执行下述命令。连接方法,请参见通过redis-cli连接Tair。
- querycache keys:获取代理节点中已缓存的所有热点Key。
返回示例
1) 1) (integer) 0 2) "key:000000000003" 2) 1) (integer) 0 2) "key:000000000001" 3) 1) (integer) 0 2) "key:000000000002" 4) 1) (integer) 0 2) "key:000000000000"
返回示例说明
每个热点Key的信息由两行信息组成,含义如下:
- 数据库名。
- Key名称。
- querycache info:获取代理查询缓存的运行情况。
返回示例
1) "put_qps:4.00" 2) "get_qps:16570.00" 3) "hit_rate:99.98" 4) "memory_size:180" 5) "query_count:4"
返回示例说明- put_qps:数据节点每秒往query_cache写入的次数。
- get_qps:客户端每秒从query_cache中读取的次数。
- hit_rate:缓存的命中率。
- memory_size:缓存数据占用的内存容量,单位为字节。
- query_count:已缓存的请求的数量。
- querycache listall:获取已缓存的所有请求命令。
返回示例
1) 1) (integer) 0 2) "*2\r\n$3\r\nGET\r\n$16\r\nkey:000000000000\r\n" 3) (integer) 668 2) 1) (integer) 0 2) "*2\r\n$3\r\nGET\r\n$16\r\nkey:000000000001\r\n" 3) (integer) 668 3) 1) (integer) 0 2) "*2\r\n$3\r\nGET\r\n$16\r\nkey:000000000003\r\n" 3) (integer) 668 4) 1) (integer) 0 2) "*2\r\n$3\r\nGET\r\n$16\r\nkey:000000000002\r\n" 3) (integer) 667
返回示例说明
每个请求命令的信息由三行信息组成,含义如下:
- 数据库名。
- 请求命令的完整内容,格式遵照Redis协议规范。
- 剩余生存时间,单位为毫秒。