acl  3.5.3.0
redis_node.hpp
浏览该文件的文档.
1 #pragma once
2 #include "../acl_cpp_define.hpp"
3 #include <vector>
4 #include <utility>
5 #include "../stdlib/string.hpp"
6 #include "../stdlib/noncopyable.hpp"
7 
8 #if !defined(ACL_CLIENT_ONLY) && !defined(ACL_REDIS_DISABLE)
9 
10 namespace acl
11 {
12 
13 /**
14  * 该类主要用于 redis_cluster 命令类获取有关集群 redis 结点信息
15  * this class is mainly used for redis_cluster command class to
16  * get some information about the nodes in redis cluster
17  */
19 {
20 public:
21  /**
22  * 当使用此构造函数实例化类对象时,需要调用 set_id 和 set_addr 方法设置
23  * 该 redis 结点的唯一标识符及服务监听地址,同时还可调用其它的 set_xxx 设置方法
24  */
25  redis_node(void);
26  ~redis_node(void);
27 
28  /**
29  * 除了在构造函数中的参数中传入该结点的 ID 标识符外,还可以通过此函数设置
30  * set the node's ID
31  * @param id {const char*} 集群中 redis 结点的唯一标识符
32  * the unique ID for one redis node in the reids cluster
33  * @return {redis_node&}
34  */
35  redis_node& set_id(const char* id);
36 
37  /**
38  * 除了在构造函数中的参数中传入该结点的地址外,还可以通过此函数设置
39  * set the node's listening addr
40  * @param addr {const char*} 集群中 redis 结点的服务地址,格式:ip:port
41  * the listening addr of one redis node in the reids cluster
42  * @return {redis_node&}
43  */
44  redis_node& set_addr(const char* addr);
45 
46  /**
47  * 设置当前结点的类型
48  * set the current node's type
49  * @param type {const char*}
50  * @return {redis_node&}
51  */
52  redis_node& set_type(const char* type);
53 
54  /**
55  * 设置当前结点是否为当前的连接对象
56  * set if the current node is belonging to the current connection
57  * @param yesno {bool}
58  * @return {redis_node&}
59  */
60  redis_node& set_myself(bool yesno);
61 
62  /**
63  * 当本结点为从结点时,设置当前结点的主结点
64  * setting current slave node's master node
65  * @param master {const redis_node*} 主结点对象
66  * the redis master node of the current slave in cluster
67  * @return {redis_node&}
68  */
69  redis_node& set_master(const redis_node* master);
70 
71  /**
72  * 设置当前结点正处于握手阶段
73  * set the current node being in handshaking status
74  * @param yesno {bool}
75  * @return {redis_node&}
76  */
77  redis_node& set_handshaking(bool yesno);
78 
79  /**
80  * 设置当前结点处于连线状态
81  * set the node been connected in the cluster
82  * @param yesno {bool}
83  * @return {redis_node&}
84  */
85  redis_node& set_connected(bool yesno);
86 
87  /**
88  * 当本结点为从结点时,设置当前结点的主结点标识符
89  * setting current node's master node when the node is slave node
90  * @param id {const char*} 主结点唯一标识符
91  * the unique ID of the master node
92  * @return {redis_node&}
93  */
94  redis_node& set_master_id(const char* id);
95 
96  /**
97  * 当本结点为主结点时,添加一个从结点
98  * add one slave node to the current node if it's one master node
99  * @return {bool} 添加是否成功,当从结点已经存在于当前主结点时则返回 false
100  * false will be returned when the slave to be added is already
101  * existing in the current master node
102  */
103  bool add_slave(redis_node* slave);
104 
105  /**
106  * 当本结点为主结点时,根据结点唯一标识符删除一个从结点
107  * when the current node is a master node, this function will
108  * remove one slave node by the unique ID
109  * @param id {const char*} redis 结点唯一标识符
110  * the unique ID of the redis node
111  * @return {const redis_node*} 返回被删除的从结点,如果不存在则返回 NULL
112  * the slave node according to the ID will be returned, and if
113  * not exists NULL will be returned
114  */
115  redis_node* remove_slave(const char* id);
116 
117  /**
118  * 当本结点为主结点时,清空本结点的所有从结点
119  * clear all the slave nodes in the current master node
120  * @param free_all {bool} 是否需要同时释放这些从结点
121  * if freeing the all slave nodes memory meanwhile
122  */
123  void clear_slaves(bool free_all = false);
124 
125  /**
126  * 当本结点为主结点时,添加哈希槽范围
127  * add hash-slots range to the master node
128  * @param min {size_t} 哈希槽范围的起始值
129  * the begin hash-slot of the slots range
130  * @param max {size_t} 哈希槽范围的结束值
131  * the end hash-slot of the slots range
132  */
133  void add_slot_range(size_t min, size_t max);
134 
135  /**
136  * 当本结点为主结点时,则获得主结点的哈希槽范围,当为从结点时则获得其对应的
137  * 主结点的哈希槽范围
138  * @return {const std::vector<std::pair<size_t, size_t> >&}
139  */
140  const std::vector<std::pair<size_t, size_t> >& get_slots() const;
141 
142  /**
143  * 获得当前结点的类型
144  * get the node's type
145  * @return {const char*}
146  */
147  const char* get_type() const
148  {
149  return type_.c_str();
150  }
151 
152  /**
153  * 判断当前结点是否为当前的连接对象结点
154  * check if the node belongs to the current connection
155  * @return {bool}
156  */
157  bool is_myself() const
158  {
159  return myself_;
160  }
161 
162  /**
163  * 判断当前结点是否正处于握手阶段
164  * check if the node is in handshaking status
165  * @return {bool}
166  */
167  bool is_handshaking() const
168  {
169  return handshaking_;
170  }
171 
172  /**
173  * 判断当前结点是否已经处于连线状态
174  * check if the node is connected in the cluster
175  * @return {bool}
176  */
177  bool is_connected() const
178  {
179  return connected_;
180  }
181 
182  /**
183  * 当本结点为从结点时,获得该从结点的主结点对象
184  * get the current slave's master node
185  * @return {const redis_node*}
186  */
187  const redis_node* get_master() const
188  {
189  return master_;
190  }
191 
192  /**
193  * 当本结点为从结点时,获得该从结点对应的主结点的 ID 标识
194  * when the current node is slave, getting its master's ID
195  * @return {const char*}
196  */
197  const char* get_master_id() const
198  {
199  return master_id_.c_str();
200  }
201 
202  /**
203  * 当本结点为主结点时,获得该主结点的所有从结点
204  * getting all the slaves of the master
205  * @return {const std::vector<redis_node*>*}
206  */
207  const std::vector<redis_node*>* get_slaves() const
208  {
209  return &slaves_;
210  }
211 
212  /**
213  * 判断当前结点是否为集群中的一个主结点
214  * check if the current node is a master in the redis cluster
215  * @return {bool}
216  */
217  bool is_master() const
218  {
219  return master_ == this;
220  }
221 
222  /**
223  * 获得当前结点的 ID 标识
224  * get the unique ID of the current node, set in constructor
225  * @return {const char*}
226  */
227  const char* get_id() const
228  {
229  return id_.c_str();
230  }
231 
232  /**
233  * 获得当前结点的监听地址
234  * get the listening addr of the current node, set in constructor
235  * @reutrn {const char*}
236  */
237  const char* get_addr() const
238  {
239  return addr_.c_str();
240  }
241 
242  /**
243  * result of CLUSTER NODES for redis.4.x.x:
244  * d52ea3cb4cdf7294ac1fb61c696ae6483377bcfc 127.0.0.1:16385@116385 master - 0 1428410625374 73 connected 5461-10922
245  * @return return 127.0.0.1:16385@116385 for redis.4.x.x
246  */
247  const char* get_addr_info() const
248  {
249  return addr_info_.c_str();
250  }
251 
252 private:
253  string id_;
254  string addr_;
255  string addr_info_;
256  string type_;
257  bool myself_;
258  bool handshaking_;
259  bool connected_;
260  const redis_node* master_;
261  string master_id_;
262  std::vector<redis_node*> slaves_;
263  std::vector<std::pair<size_t, size_t> > slots_;
264 };
265 
266 } // namespace acl
267 
268 #endif // !defined(ACL_CLIENT_ONLY) && !defined(ACL_REDIS_DISABLE)
const char * get_master_id() const
Definition: redis_node.hpp:197
bool is_connected() const
Definition: redis_node.hpp:177
bool is_myself() const
Definition: redis_node.hpp:157
const redis_node * get_master() const
Definition: redis_node.hpp:187
bool is_master() const
Definition: redis_node.hpp:217
const char * get_id() const
Definition: redis_node.hpp:227
bool is_handshaking() const
Definition: redis_node.hpp:167
const char * get_addr() const
Definition: redis_node.hpp:237
const char * get_type() const
Definition: redis_node.hpp:147
const std::vector< redis_node * > * get_slaves() const
Definition: redis_node.hpp:207
#define ACL_CPP_API
const char * get_addr_info() const
Definition: redis_node.hpp:247