若是沒有方向代理,一臺Redis可能須要跟不少個客戶端鏈接:git
看着是否是很慌?看不要緊,主要是鏈接須要消耗線程資源,沒有代理的話,Redis要將很大一部分的資源用在與客戶端創建鏈接上,redis的高可用和可擴展不管是自帶的Redis Sentinel仍是Redis Cluster都要求客戶端進行額外的支持,而目前基本上沒有合適的客戶端可以作這些事情,客戶端來作這些事情也並不合適,它會讓維護變得特別困難。github
所以在客戶端和redis服務端之間加一層代理成了一種理想的方案,代理屏蔽後端Redis實現細節向客戶端提供redis服務,能夠完美的解決Redis的高可用和擴展性問題,同時代理的引入也使得Redis維護變得更加簡單。redis
因而乎,有了代理:後端
很簡單,將請求鏈接到調度代理器上,由Proxy負責將請求轉發到後面的Redis服務實例,圖示:多線程
又有了新的問題,Proxy掛了可咋整?負載均衡
因此Proxy又須要作集羣,甚至前面能夠加一層負載均衡,負載均衡嘛,單機也存在單點故障等問題,一個Director確定不行,搞很差又掛了,因此整一個主備,備機經過KeepAlived來檢測主LVS健康情況,出了問題頂上去。memcached
Redis代理插件有不少,這兒簡單介紹幾款性能
predixy | 高性能全特徵redis代理,支持Redis Sentinel和Redis Cluster |
---|---|
twemproxy | 快速、輕量級memcached和redis代理 |
codis | redis集羣代理解決方案 |
redis-cerberus | Redis Cluster代理 |
特性 | predixy | twemproxy | codis | redis-cerberus |
---|---|---|---|---|
高可用 | Redis Sentinel或Redis Cluster | 一致性哈希 | Redis Sentinel | Redis Cluster |
可擴展 | Key哈希分佈或Redis Cluster | Key哈希分佈 | Key哈希分佈 | Redis Cluster |
開發語言 | C++ | C | GO | C++ |
多線程 | 是 | 否 | 是 | 是 |
事務 | Redis Sentinel模式單Redis組下支持 | 不支持 | 不支持 | 不支持 |
BLPOP/BRPOP/BLPOPRPUSH | 支持 | 不支持 | 不支持 | 支持 |
Pub/Sub | 支持 | 不支持 | 不支持 | 支持 |
Script | 支持load | 不支持 | 不支持 | 不支持 |
Scan | 支持 | 不支持 | 不支持 | 不支持 |
Select DB | 支持 | 不支持 | 支持 | Redis Cluster只有一個DB |
Auth | 支持定義多個密碼,給予不一樣讀寫及管理權限和Key訪問空間 | 不支持 | 同redis | 不支持 |
讀從節點 | 支持,可定義豐富規則讀指定的從節點 | 不支持 | 支持,簡單規則 | 支持,簡單規則 |
多機房支持 | 支持,可定義豐富規則調度流量 | 不支持 | 有限支持 | 有限支持 |
統計信息 | 豐富 | 豐富 | 豐富 | 簡單 |
簡單來講,predixy既支持Redis Sentinel也支持Redis Cluster插件