acl  3.5.3.0
redis_client_cluster.hpp
浏览该文件的文档.
1 #pragma once
2 #include "../acl_cpp_define.hpp"
3 #include <vector>
4 #include <map>
5 #include "../stdlib/string.hpp"
6 #include "../connpool/connect_manager.hpp"
7 
8 #if !defined(ACL_CLIENT_ONLY) && !defined(ACL_REDIS_DISABLE)
9 
10 namespace acl
11 {
12 
13 class sslbase_conf;
14 
15 class redis_client_pool;
16 
17 /**
18  * redis 客户端集群类,通过将此类对象注册入 redis 客户端命令类(redis_command),
19  * 则使所有的客户端命令自动支持集群版 redis 命令。
20  * redis client cluster class. The class's object is set in the redis_command
21  * using redis_command::set_cluster(redis_cluster*), and all the redis client
22  * command will support the redis cluster mode.
23  */
25 {
26 public:
27  /**
28  * 构造函数;
29  * constructor
30  * @param max_slot {int} 哈希槽最大值; the max hash-slot value of keys
31  */
32  redis_client_cluster(int max_slot = 16384);
33  virtual ~redis_client_cluster(void);
34 
35  /**
36  * 根据哈希槽值获得对应的连接池;
37  * get one connection pool with the given slot
38  * @param slot {int} 哈希槽值;
39  * the hash-slot value of key
40  * @return {redis_client_pool*} 如果对应的哈希槽不存在则返回 NULL;
41  * return the connection pool of the hash-slot, and return NULL
42  * when the slot not exists
43  */
44  redis_client_pool* peek_slot(int slot);
45 
46  /**
47  * 动态设置哈希槽值对应的 redis 服务地址,该函数被调用时内部有线程锁保护;
48  * dynamicly set redis-server addr with one slot, which is protected
49  * by thread mutex internal, no one will be set if the slot were
50  * beyyond the max hash-slot
51  * @param slot {int} 哈希槽值;
52  * the hash-slot
53  * @param addr {const char*} redis 服务器地址;
54  * one redis-server addr
55  */
56  void set_slot(int slot, const char* addr);
57 
58  /**
59  * 给定 redis 集群中的一个结点,自动发现所有的哈希槽对应的结点地址
60  * according one node of the cluster, auto find all nodes with all
61  * slots range
62  * @param addr {const char*} 集群中的一个服务结点地址,格式 ip:port
63  * on server node's addr of the cluster, addr format is "ip:port"
64  * @param max_conns {size_t} 集群中与每个结点所建连接池的最大连接限制
65  * the max connections limit for each connection pool
66  * @param conn_timeout {int} 连接超时时间
67  * set the connection timeout
68  * @param rw_timeout {int} IO 读写超时时间
69  * set the network io timeout
70  */
71  void set_all_slot(const char* addr, size_t max_conns,
72  int conn_timeout = 30, int rw_timeout = 30);
73 
74  /**
75  * 动态清除哈希槽对应的 redis 服务地址,以便于重新计算位置,
76  * 内部有线程锁保护机制;
77  * dynamicly remove one slot and redis-server addr mapping, which is
78  * protected by thread mutex
79  * @param slot {int} 哈希槽值;
80  * hash-slot value
81  */
82  void clear_slot(int slot);
83 
84  /**
85  * 获得哈希槽最大值;
86  * get the max hash-slot
87  * @return {int}
88  */
89  int get_max_slot() const
90  {
91  return max_slot_;
92  }
93 
94  //////////////////////////////////////////////////////////////////////
95  /**
96  * 设置协议重定向次数的阀值,默认值为 15;
97  * set redirect limit for MOVE/ASK, default is 15
98  * @param max {int} 重定向次数阀值,只有当该值 > 0 时才有效;
99  * the redirect times limit for MOVE/ASK commands
100  */
101  void set_redirect_max(int max);
102 
103  /**
104  * 设置协议重定向次数的阀值;
105  * get redirect limit of MOVE/ASK commands in one redis redirect process
106  * @return {int}
107  */
108  int get_redirect_max() const
109  {
110  return redirect_max_;
111  }
112 
113  /**
114  * 当重定向次数 >= 2 时允许休眠的时间(毫秒),默认值为 100 毫秒,这样做的
115  * 好处是当一个 redis 服务主结点掉线后,其它从结点升级为主结点是需要
116  * 时间的(由 redis.conf 中的 cluster-node-timeout 配置项决定),所以
117  * 为了在重定向的次数范围内不报错需要等待从结点升级为主结点;
118  * if redirect happenning more than 2 in one redis command process,
119  * the process can sleep for a one avoiding redirect too fast, you
120  * can set the waiting time with microsecond here, default value is
121  * 100 microseconds; this only happends when redis-server died.
122  * @param n {int} 每次重定向时的休息时间(毫秒),默认值为 100 毫秒;
123  * microseonds to sleep when redirect times are more than 2,
124  * default is 100 ms
125  */
126  void set_redirect_sleep(int n);
127 
128  /**
129  * 获得 set_redirect_sleep 设置的或默认的时间;
130  * get sleep time set by set_redirect_sleep function
131  * @return {int} 单位为毫秒;
132  * return sleep value in microsecond
133  */
134  int get_redirect_sleep() const
135  {
136  return redirect_sleep_;
137  }
138 
139  /**
140  * 设置 SSL 通信方式下的配置句柄,内部缺省值为 NULL,如果设置了 SSL 连
141  * 接配置对象,则内部切换成 SSL 通信方式
142  * set SSL communication with Redis-server if ssl_conf not NULL
143  * @param ssl_conf {sslbase_conf*}
144  * @return {redis_client_cluster&}
145  */
146  redis_client_cluster& set_ssl_conf(sslbase_conf* ssl_conf);
147 
148  /**
149  * 设置某个 redis 服务相应的连接密码
150  * set the password of one redis-server
151  * @param addr {const char*} 指定的某 redis 服务器地址,当该参数的值为
152  * default 时,则指定了集群中所有 redis 服务器的缺省连接密码
153  * the specified redis-server's addr, the default password of all
154  * redis-server will be set when the addr's value is 'default'
155  * @param pass {const char*} 指定的 redis 服务器连接密码
156  * the password of the specified redis-server
157  * @return {redis_client_cluster&}
158  */
159  redis_client_cluster& set_password(const char* addr, const char* pass);
160 
161  /**
162  * 获得 redis 集群中服务节点与连接密码的对照表
163  * get all passwords of the redis cluster
164  * @return {const std::map<string, string>&}
165  */
166  const std::map<string, string>& get_passwords(void) const
167  {
168  return passwds_;
169  }
170 
171  /**
172  * 获得给定地址的 redis 节点的连接密码,返回 NULL 表示未设置
173  * get the connection password of the specified addr for one redis,
174  * NULL will be returned if password wasn't set
175  * @param addr {const char*}
176  * @return {const char*} return the specified node's connection password,
177  * NULL returned if no password been set
178  */
179  const char* get_password(const char* addr) const;
180 
181  /**
182  * 重定向至目标 redis 节点
183  * @param addr {const char*} 目标 redis 服务地址
184  * @param max_conns {size_t} 连接池最大连接数
185  * @return {redis_client*} 获得与目标 redis 节点的连接通信对象
186  */
187  redis_client* redirect(const char* addr, size_t max_conns);
188 
189  /**
190  * 根据 redis 集群的槽号获得连接对象
191  * @param slot {int} redis 集群键值对应的存储槽槽号
192  * @return {redis_client*} 获得与目标 redis 节点的连接通信对象
193  */
194  redis_client* peek_conn(int slot);
195 
196 protected:
197  /**
198  * 基类纯虚函数,用来创建连接池对象,该函数返回后由基类设置网络连接及IO 超时时间
199  * virtual function of base class, which is used to create
200  * the connection pool
201  * @param addr {const char*} 服务器监听地址,格式:ip:port;
202  * the server addr for the connection pool, such as ip:port
203  * @param count {size_t} 连接池的大小限制,该值没有 0 时则没有限制
204  * the max connections in one connection pool, if it's 0 there
205  * is no limit of the connections pool.
206  * @param idx {size_t} 该连接池对象在集合中的下标位置(从 0 开始);
207  * the index of the connection pool in pool array
208  */
209  connect_pool* create_pool(const char* addr, size_t count, size_t idx);
210 
211 private:
212  int max_slot_;
213  const char** slot_addrs_;
214  std::vector<char*> addrs_;
215  int redirect_max_;
216  int redirect_sleep_;
217  std::map<string, string> passwds_;
218  sslbase_conf* ssl_conf_;
219 
220  redis_client* reopen(redis_command& cmd, redis_client* conn);
221  redis_client* move(redis_command& cd, redis_client* conn,
222  const char* ptr, int nretried);
223  redis_client* ask(redis_command& cd, redis_client* conn,
224  const char* ptr, int nretried);
225  redis_client* cluster_down(redis_command& cd, redis_client* conn,
226  const char* ptr, int nretried);
227 
228 public:
229  const redis_result* run(redis_command& cmd, size_t nchild,
230  int* timeout = NULL);
231 };
232 
233 } // namespace acl
234 
235 #endif // !defined(ACL_CLIENT_ONLY) && !defined(ACL_REDIS_DISABLE)
const std::map< string, string > & get_passwords(void) const
#define ACL_CPP_API