2012-05-09 51 views
6

假設在您的Web應用程序中,您需要執行一些redis調用來呈現頁面,例如獲取一堆用戶哈希值。爲了加快速度,您可以在MULTI/EXEC部分中包裝redis命令,從而使用流水線操作,以避免進行多次往返。但是你也想分割你的數據,因爲你有很多它和/或你想分配寫入。那麼流水線將無法工作,因爲不同的密鑰可能會存在於不同的節點上,除非您清楚地瞭解應用程序和基於角色的碎片的數據佈局,而不是使用散列函數。那麼,爲了完成「概念獨特」的工作,很多服務器被聯繫起來,在不影響性能的情況下跨越不同服務器分割數據的最佳實踐是什麼?我相信答案取決於正在開發的Web應用程序,並且我最終會進行一些測試,但瞭解其他人如何應對我提到的取捨問題會很有幫助。redis分片,流水線和往返

回答

4

MULTI/EXEC和流水線是兩個不同的東西。你可以做任何流水線MULTI/EXEC,反之亦然。

如果要同時分片和管道,則需要將操作分組到每個Redis實例的流水線,然後對每個實例使用流水線。

下面是一個使用Ruby的一個簡單的例子:https://gist.github.com/2587593

一個以進一步提高性能的方法是並行的Redis的情況下,交通一度的操作進行了分組(即你組的操作,您將它們發送給所有並行的實例,你等待所有實例的答案)。

這有點複雜,因爲需要一個異步非阻塞客戶端。爲了獲得最佳性能,應在客戶端使用C/C++。這可以通過使用hiredis +您選擇的事件循環輕鬆實現。

+0

感謝一百萬的洞察力,尤其是關於並行化流量的一點! – idrarig