為什么要使用反向代理?
如果沒有反向代理,一台Redis可能需要跟很多個客戶端連接:

看着是不是很慌?看沒關系,主要是連接需要消耗線程資源,沒有代理的話,Redis要將很大一部分的資源用在與客戶端建立連接上,redis的高可用和可擴展無論是自帶的Redis Sentinel還是Redis Cluster都要求客戶端進行額外的支持,而目前基本上沒有合適的客戶端能夠做這些事情,客戶端來做這些事情也並不合適,它會讓維護變得特別困難。
因此在客戶端和redis服務端之間加一層代理成了一種理想的方案,代理屏蔽后端Redis實現細節向客戶端提供redis服務,可以完美的解決Redis的高可用和擴展性問題,同時代理的引入也使得Redis維護變得更加簡單。
於是乎,有了代理:
如何使用代理?
很簡單,將請求連接到調度代理器上,由Proxy負責將請求轉發到后面的Redis服務實例,圖示:

又有了新的問題,Proxy掛了可咋整?
所以Proxy又需要做集群,甚至前面可以加一層負載均衡,負載均衡嘛,單機也存在單點故障等問題,一個Director肯定不行,搞不好又掛了,所以整一個主備,備機通過KeepAlived來檢測主LVS健康狀況,出了問題頂上去。
Redis代理插件
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
- 后端為Redis Sentinel監控的一組Redis,功能完全等同於原始Redis
- 后端為Redis Sentinel監控的多組Redis,則有部分功能受限
- 后端為Redis Cluster,功能完全等同於Redis Cluster