參考
《redis并發與運維》
串行命令
由于n個key是比較均勻的分布在Redis Cluster的各個節點上,因此無法使用mget命令一次性獲取,所以通常來講要獲取n個key的值,最簡單的方法就是逐次執行n個get命令,這種操作的時間復雜度較高,它的操作時間 = n次網絡時間 + n次命令時間,網絡次數是n。很顯然這種方案不是最優的,但是實現起來比較簡單。
串行IO
Redis Cluster使用CRC16算法計算出散列值,再取對16383的余數就可以算出slot值,同時我們可以使用Smart客戶端保存slot和節點的對應關系,有了這兩個數據就可以將屬于同一個節點的key進行歸檔,得到每個節點的key子列表,之后對每個節點執行mget或Pipeline操作,它的操作時間 = node次網絡時間 + n次命令時間,網絡次數是node的個數,很明顯這種方案比第一種要好很多,但是如果節點數太多,還是有一定的性能問題。
并行IO
此方案是將方案2中的最后一步改為多線程執行,網絡次數雖然還是節點個數,但由于使用多線程網絡時間變為O(1),這種方案會增加編程的復雜度。它的操作時間為:
max_slow(node網絡時間) + n次命令時間
hash_tag實現
Redis Cluster提供了hash_tag功能,可以將多個key強制分配到一個節點上,它的操作時間 = 1次網絡時間 + n次命令時間。
總結
批量操作方案對比