為更好地改善對熱點Key的發起大量讀請求導致的訪問傾斜,云數據庫 Tair(兼容 Redis)新增代理查詢緩存功能(Proxy Query Cache),啟用該功能后,代理節點會緩存熱點Key對應的請求和查詢結果,當在有效時間內收到同樣的請求時直接返回結果至客戶端,無需和后端的數據分片交互。
前提條件
實例為Tair(企業版)內存型或持久內存型。
實例為集群架構代理模式或讀寫分離架構。
應用場景
需要解決或預防熱點Key的讀請求引發的訪問傾斜問題,即由于大量的讀請求集中在某些Key形成了熱點Key,從而導致某些數據分片的CPU使用率和流量使用率持續保持高位并接近100%。
由于代理節點中緩存的熱點Key的查詢結果在有效時間內不會更新,需要確認業務上能接受在數據更新到代理緩存失效之前的這段時間(即代理緩存的有效期)內,讀取到的是舊數據。這是對強一致性的犧牲,以換取更高的系統性能和穩定性。業務邏輯需要能夠容忍這種可能出現的短暫數據不一致現象,確保即使在數據略有延遲的情況下,也不會影響到核心業務流程。
工作原理
云數據庫 Tair(兼容 Redis)會根據高效的排序和統計算法識別出實例中存在的熱點Key(通常熱點Key的QPS大于5,000),開啟該功能后,代理節點Proxy會根據設定的規則緩存熱點Key的請求和查詢結果(僅緩存熱點Key的查詢結果,無需緩存整個Key)。當在緩存有效時間內收到相同的請求時,Proxy會直接返回結果至客戶端,無需和后端的數據分片執行交互。如果熱點Key的查詢結果發生改變,緩存不會更新。
您可以通過實例診斷功能分析實例是否存在訪問傾斜;您還可以通過實時Top Key統計功能查詢實例的熱點Key信息。
設置方法及參數說明
您需要通過修改實例參數的方式管理該功能,各參數解釋如下。具體操作,請參見設置實例參數。
參數 | 說明 |
query_cache_enabled | 是否啟用代理查詢緩存功能,取值:
重要 啟用代理查詢緩存功能的使用場景:
|
query_cache_mode | 代理查詢緩存的工作模式,取值:
重要 由于代理節點的緩存空間有限(代理節點每個線程100 MB),如果設置該參數的值為1,代理節點將按照LRU算法進行淘汰,可能降低緩存的命中率,從而引起整體性能的下降。 |
query_cache_expire | 緩存數據的有效時間,單位為毫秒,取值:100~60000,默認值為1000。 熱點新聞榜單數據放在讀寫分離架構的實例中,榜單每15分鐘刷新一次,偶爾會出現熱點新聞導致此業務QPS達到5000以上。評估榜單能接受的最大數據延遲時間為30秒,開啟Proxy Query Cache后,將有效時間設置為30秒。 重要
|
相關命令
您可以連接云數據庫 Tair(兼容 Redis)實例,執行下述命令,查詢Querycache的使用情況,連接方法請參見通過redis-cli連接實例。
QUERYCACHE KEYS
命令格式:QUERYCACHE KEYS
命令描述:查詢代理節點中已緩存的所有熱點Key,將返回每個熱點Key的數據庫名和Key名稱信息。
命令示例:
QUERYCACHE KEYS
返回示例:
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"
QUERYCACHE INFO
命令格式:QUERYCACHE INFO
命令描述:獲取代理查詢緩存的運行情況。
命令示例:
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"
6) "bandwidth_limit_query_cnt:0"
7) "qps_limit_query_cnt:0"
返回示例說明:
put_qps:數據節點每秒往Querycache寫入的次數。
get_qps:客戶端每秒從Querycache中讀取的次數。
hit_rate:緩存的命中率。
memory_size:緩存數據占用的內存容量,單位為字節。
query_count:已緩存的請求的數量。
bandwidth_limit_query_cnt:因帶寬限制訪問Querycache被限流的次數,默認未開啟限制。
qps_limit_query_cnt:因QPS限制訪問Querycache被限流的次數,默認未開啟限制。
QUERYCACHE LISTALL
命令格式:QUERYCACHE LISTALL
命令描述:獲取已緩存的所有請求命令。
命令示例:
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協議規范)、剩余生存時間(單位為毫秒)。