acl  3.5.3.0
redis_client.hpp
浏览该文件的文档.
1 #pragma once
2 #include "../acl_cpp_define.hpp"
3 #include <vector>
4 #include "../stream/socket_stream.hpp"
5 #include "../connpool/connect_client.hpp"
6 
7 #if !defined(ACL_CLIENT_ONLY) && !defined(ACL_REDIS_DISABLE)
8 
9 namespace acl
10 {
11 
12 class string;
13 class dbuf_pool;
14 class redis_result;
15 class redis_request;
16 class redis_command;
17 class sslbase_conf;
18 
19 /**
20  * redis 客户端对象网络通信类,通过此类将组织好的 redis 请求命令发给 redis
21  * 服务端,同时接收 redis 服务端响应结果;该类继承于 connect_client 类,主要
22  * 为了使用连接池功能。
23  * redis client network IO class. The redis request is sent to server
24  * and the server's respond is handled in this class. The class inherits
25  * connect_client, which can use the connection pool function.
26  */
28 {
29 public:
30  /**
31  * 构造函数
32  * constructor
33  * @param addr {const char*} redis-server 监听地址
34  * the redis-server listening addr
35  * @param conn_timeout {int} 连接 redis-server 的超时时间(秒)
36  * the timeout in seconds to connect the redis-server
37  * @param rw_timeout {int} 与 redis-server 进行通信的 IO 超时时间(秒)
38  * the network IO timeout in seconds with the redis-server
39  */
40  redis_client(const char* addr, int conn_timeout = 60,
41  int rw_timeout = 30, bool retry = true);
42  virtual ~redis_client(void);
43 
44  /**
45  * 设置 SSL 通信方式下的配置句柄,内部缺省值为 NULL,如果设置了 SSL 连
46  * 接配置对象,则内部切换成 SSL 通信方式
47  * set SSL communication with Redis-server if ssl_conf not NULL
48  * @param ssl_conf {sslbase_conf*}
49  */
50  void set_ssl_conf(sslbase_conf* ssl_conf);
51 
52  /**
53  * 调用本函数设置连接 redis 服务的连接密码
54  * @param pass {const char*}
55  */
56  void set_password(const char* pass);
57 
58  /**
59  * 设置本连接所对应的 db,当连接建立后如果指定的 db 值大于 0,则内部自动
60  * 选择对应的 db,注意:该功能仅针对非集群模式
61  * if db > 0 in no cluster mode, select the db when the connection
62  * is created.
63  * @param dbnum {int}
64  */
65  void set_db(int dbnum);
66 
67  /**
68  * 获得本连接所选择的 db
69  * get db for the connection
70  * @return {int}
71  */
72  int get_db(void) const
73  {
74  return dbnum_;
75  }
76 
77  /**
78  * 获得当前连接的服务器地址,即由 redis_client 构造时传入的地址
79  * @return {const char*}
80  */
81  const char* get_addr(void) const
82  {
83  return addr_;
84  }
85 
86  /**
87  * 在进行每个命令处理前,是否要求检查 socket 句柄与地址的匹配情况,当
88  * 打开该选项时,将会严格检查匹配情况,但会影响一定性能,因此该设置仅
89  * 用在 DEBUG 时的运行场景
90  * @param on {bool}
91  */
92  void set_check_addr(bool on);
93 
94  /**
95  * 判断该网络连接对象是否已经关闭
96  * check if the connection has been finish
97  * @return {bool}
98  */
99  bool eof(void) const;
100 
101  /**
102  * 关闭网络连接
103  * close the connection to the redis-server
104  */
105  void close(void);
106 
107  /**
108  * 获得网络连接流,当连接关闭时内部会自动重连一次
109  * get acl::socket_stream from the connection
110  * @param auto_connect {bool} 内部是否需要自动连接服务端
111  * if we should connect the redis server automaticlly
112  * @return {acl::socket_stream*} 如果连接已经关闭则返回 NULL
113  * NULL will be returned if the connectioin has been closed
114  */
115  socket_stream* get_stream(bool auto_connect = true);
116 
117  /**
118  * 对于请求数据包,此函数设置在组装请求数据包的时候合成一个数据包发送
119  * just for request package, setting flag for sending data with
120  * multi data chunks; this is useful when the request data is large
121  * @param on {bool} 当为 true 时则不会将请求数据合成一个数据包发送
122  * if true the request data will not be combined one package
123  */
124  void set_slice_request(bool on);
125 
126  /**
127  * 对于响应数据包,此函数设置是否将 redis-server 响应的数据分拆成多个数据块,
128  * 这对于大的数据包有用处,可以不必一次性分配一个连续性的大内存
129  * just for response package, settint flag for receiving data
130  * if split the large response data into multi little chunks
131  * @param on {bool} 当为 true 时则对响应数据包进行拆分
132  * if true the response data will be splitted into multi little
133  * data, which is useful for large reponse data for avoiding
134  * malloc large continuously memory from system.
135  */
136  void set_slice_respond(bool on);
137 
138  /**
139  * 用于非分片发送方式,向 redis-server 发送请求数据,同时读取并分析
140  * 服务端返回的响应数据
141  * send request to redis-server, and read/anlyse response from server,
142  * this function will be used for no-slice request mode.
143  * @param pool {dbuf_pool*} 内存池管理器对象
144  * memory pool manager
145  * @param req {const string&} 请求数据包
146  * the request package
147  * @param nchildren {size_t} 响应数据有几个数据对象
148  * the data object number in the server's response data
149  * @return {const redis_result*} 读到的服务器响应对象,返回 NULL 则出错,
150  * 该对象不必手工释放,因为其是在 pool 内存池对象上动态分配的,所以当
151  * 释放 pool 时该结果对象一同被释放
152  * the result object from server's response, NULL will be returned
153  * when some error happens; the result object needn't be freed
154  * manually, which was created in the pool object, and will be freed
155  * when the pool were freed.
156  *
157  */
158  const redis_result* run(dbuf_pool* pool, const string& req,
159  size_t nchildren, int* rw_timeout = NULL);
160 
161  /**
162  * 用于分片发送请求方式
163  * just for sending proccess in slice request mode
164  * @param req {const redis_request&} 请求数据对象
165  * request object
166  */
167  const redis_result* run(dbuf_pool* pool, const redis_request& req,
168  size_t nchildren, int* rw_timeout = NULL);
169 
170  const redis_result* run(redis_command* cmd, size_t nchildren,
171  int* rw_timeout = NULL);
172 
173 protected:
174  // 基类虚函数
175  // @override
176  bool open(void);
177 
178 protected:
181  char* addr_;
182  char* pass_;
183  bool retry_;
184  bool authing_;
187  int dbnum_;
189 
190 public:
191  redis_result* get_objects(socket_stream& conn,
192  dbuf_pool* pool, size_t nobjs);
193  redis_result* get_object(socket_stream& conn, dbuf_pool* pool);
194  redis_result* get_error(socket_stream& conn, dbuf_pool* pool);
195  redis_result* get_status(socket_stream& conn, dbuf_pool* pool);
196  redis_result* get_integer(socket_stream& conn, dbuf_pool* pool);
197  redis_result* get_string(socket_stream& conn, dbuf_pool* pool);
198  redis_result* get_array(socket_stream& conn, dbuf_pool* pool);
199 
200 private:
201  void put_data(dbuf_pool* pool, redis_result* rr,
202  const char* data, size_t len);
203  bool check_connection(socket_stream& conn);
204 };
205 
206 } // end namespace acl
207 
208 #endif // !defined(ACL_CLIENT_ONLY) && !defined(ACL_REDIS_DISABLE)
socket_stream conn_
#define ACL_CPP_API
const char * get_addr(void) const
int get_db(void) const
sslbase_conf * ssl_conf_