若是没有方向代理,一台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插件