acl  3.5.3.0
memcache.hpp
浏览该文件的文档.
1 #pragma once
2 #include "../acl_cpp_define.hpp"
3 #include <time.h>
4 #include "../connpool/connect_client.hpp"
5 #include "../stdlib/string.hpp"
6 #include "../mime/rfc2047.hpp"
7 
8 #ifndef ACL_CLIENT_ONLY
9 
10 namespace acl {
11 
12 class socket_stream;
13 
14 typedef class memcache mem_cache;
15 
16 /**
17  * memcached 客户端通信协议库,支持长连接与自动重连
18  */
20 {
21 public:
22  /**
23  * 构造函数
24  * @param addr {const char*} memcached 服务器监听地址,格式为:
25  * ip:port,如: 127.0.0.1:11211
26  * @param conn_timeout {int} 连接服务器的超时时间(秒)
27  * @param rw_timeout {int} 网络 IO 超时时间(秒)
28  */
29  memcache(const char* addr = "127.0.0.1:11211", int conn_timeout = 30,
30  int rw_timeout = 10);
31 
32  ~memcache();
33 
34  /**
35  * 设置 key 的前缀,即实际的 key 将由 该前缀+原始key 组成,缺省时不设
36  * 前缀,当多个应用共用同一个 memcached 服务时,建议应用设置自身的
37  * key 前缀,这样可以避免与其它应用的 key 产生重复问题
38  * @param keypre {const char*} 非空时设置 key 前缀,否则取消 key 前缀
39  * @return {memcache&}
40  */
41  memcache& set_prefix(const char* keypre);
42 
43  /**
44  * 在保持的长连接中断时是否要求自动重连,缺省为自动重连
45  * @param onoff {bool} 为 true 时表示长连接意外断开后自动重连
46  * @return {memcache&}
47  */
48  memcache& auto_retry(bool onoff);
49 
50  /**
51  * 设置是否针对 KEY 键值进行编码,缺少时不对 key 编码,当应用的 key 中
52  * 可能会有特殊字符或二进制值时,建议调用此函数对 key 进行编码
53  * @param onoff {bool} 为 true 表示内部需要对 key 进行编码
54  * @return {memcache&}
55  */
56  memcache& encode_key(bool onoff);
57 
58  /**
59  * 向 memcached 中修改或添加新的数据缓存对象
60  * @param key {const char*} 键值
61  * @param klen {size_t} key 键值长度
62  * @param dat {const void*} 数据
63  * @param dlen {size_t} data 数据长度
64  * @param timeout {time_t} 缓存超时时间(秒)
65  * @param flags {unsigned short} 附属的标志位
66  * @return {bool} 是否成功
67  */
68  bool set(const char* key, size_t klen,
69  const void* dat, size_t dlen,
70  time_t timeout = 0, unsigned short flags = 0);
71 
72  /**
73  * 向 memcached 中修改或添加新的数据缓存对象
74  * @param key {const char*} 字符串键值
75  * @param dat {const void*} 数据
76  * @param dlen {size_t} data 数据长度
77  * @param timeout {time_t} 缓存超时时间(秒)
78  * @param flags {unsigned short} 附属的标志位
79  * @return {bool} 是否成功
80  */
81  bool set(const char* key, const void* dat, size_t dlen,
82  time_t timeout = 0, unsigned short flags = 0);
83 
84  /**
85  * 更新 memcached 中已经存在的键的过期日期,因为目前 libmemcached 没有
86  * 提供此接口,所以该函数实现的方式是先调用 get 取出对应键的值,然后再
87  * 调用 set 重新设置该键的值及过期时间
88  * @param key {const char*} 键值
89  * @param klen {size_t} key 键值长度
90  * @param timeout {time_t} 过期时间(秒)
91  * @return {bool} 是否成功
92  */
93  bool set(const char* key, size_t klen, time_t timeout = 0);
94 
95  /**
96  * 更新 memcached 中已经存在的键的过期日期,因为目前 libmemcached 没有
97  * 提供此接口,所以该函数实现的方式是先调用 get 取出对应键的值,然后再
98  * 调用 set 重新设置该键的值及过期时间
99  * @param key {const char*} 字符串键值
100  * @param timeout {time_t} 过期时间(秒)
101  * @return {bool} 是否成功
102  */
103  bool set(const char* key, time_t timeout = 0);
104 
105  /**
106  * 以流式方式上传大数据时,该函数发送数据头
107  * @param key {const char*} 键值字符串
108  * @param dlen {size_t} 数据体的数据总长度
109  * @param timeout {time_t} 数据的过期时间(秒)
110  * @param flags {unsigned short} 附属的标志位
111  * @return {bool} 是否成功
112  */
113  bool set_begin(const char* key, size_t dlen,
114  time_t timeout = 0, unsigned short flags = 0);
115 
116  /**
117  * 循环调用本函数上传数据值,内部会自动计算已经上传的数据总和是否达到
118  * 了 set_begin 中设置的数据总长度,当达到后会自动补一个 "\r\n",调用
119  * 者不应再调用此函数上传数据,除非是一个新的上传过程开始了
120  * @param data {const void*} 数据地址指针
121  * @param len {data} data 数据长度
122  * @return {bool} 是否成功
123  */
124  bool set_data(const void* data, size_t len);
125 
126  /**
127  * 从 memcached 中获得对应键值的缓存数据
128  * @param key {const char*} 字符串键值
129  * @param klen {size_t} 键值长度
130  * @param buf {string&} 存储结果的缓冲区,内部首先会清空该缓冲区
131  * @param flags {unsigned short*} 存储附属的标志位
132  * @return {bool} 返回 true 表示正确获得结果值,否则表示键值对应的
133  * 数据不存在或出错
134  */
135  bool get(const char* key, size_t klen, string& buf,
136  unsigned short* flags = NULL);
137 
138  /**
139  * 从 memcached 中获得对应键值的缓存数据
140  * @param key {const char*} 字符串键值
141  * @param buf {string&} 存储结果的缓冲区,内部首先会清空该缓冲区
142  * @param flags {unsigned short*} 存储附属的标志位
143  * @return {bool} 返回 true 表示正确获得结果值,否则表示键值对应的
144  * 数据不存在或出错
145  */
146  bool get(const char* key, string& buf, unsigned short* flags = NULL);
147 
148  /**
149  * 流式方式从服务端获取数据,本函数发送请求协议
150  * @param key {const void*} 键值
151  * @param klen {size_t} key 键值长度
152  * @param flags {unsigned short*} 存储附属的标志位
153  * @return {int} 返回数据体的长度,分以下三种情形:
154  * 0:表示不存在
155  * -1:表示出错
156  * >0:表示数据体的长度
157  */
158  int get_begin(const void* key, size_t klen, unsigned short* flags = NULL);
159 
160  /**
161  * 流式方式从服务端获取数据,本函数发送请求协议
162  * @param key {const char*} 键值字符串
163  * @param flags {unsigned short*} 存储附属的标志位
164  * @return {int} 返回数据体的长度,分以下三种情形:
165  * 0:表示不存在
166  * -1:表示出错
167  * >0:表示数据体的长度
168  */
169  int get_begin(const char* key, unsigned short* flags = NULL);
170 
171  /**
172  * 流式方式从服务端获取数据,循环调用本函数接收数据
173  * @param buf {void*} 缓冲区地址
174  * @param size {size_t} 缓冲区大小
175  * @return {int} 已读到的数据大小,分为以下三种情形:
176  * 0:表示数据读完
177  * > 0: 表示本次读到的数据长度
178  * -1:表示出错
179  */
180  int get_data(void* buf, size_t size);
181 
182  /**
183  * 从 memcached 中删除数据
184  * @param key {const char*} 键值
185  * @param klen {size_t} 键值长度
186  * @return {bool} 删除是否成功
187  */
188  bool del(const char* key, size_t klen);
189 
190  /**
191  * 从 memcached 中删除数据
192  * @param key {const char*} 字符串键值
193  * @return {bool} 删除是否成功
194  */
195  bool del(const char* key);
196 
197  /**
198  * 获得上次操作 memcached 错误描述信息
199  * @return {const char*} 错误描述信息,永不为空
200  */
201  const char* last_serror() const;
202 
203  /**
204  * 获得上次操作 memcached 的错误号
205  * @return {int} 错误号
206  */
207  int last_error() const;
208 
209  /**
210  * 打开与 memcached 的连接, 因为 set/get/del 操作都会自动打开与
211  * memcached 的连接,所以不必显示地调用此函数来打开与 memcached
212  * 的连接
213  * @return {bool} 打开是否成功
214  */
215  virtual bool open();
216 
217  /**
218  * 关闭与 memcached 的连接,一般该函数不需要调用,因为类对象在
219  * 析构时会自动调用此函数
220  */
221  void close();
222 
223  /**
224  * 列出 memcached 连接的一些属性,调试用
225  */
226  void property_list();
227 
228 private:
229  bool set(const string& key, const void* dat, size_t dlen,
230  time_t timeout, unsigned short flags);
231  bool get(const string& key, string& buf, unsigned short* flags);
232  const string& build_key(const char* key, size_t klen);
233 
234  string* keypre_; // 非空时,该字符串被添加在 KEY 值前组成新的 KEY
235  rfc2047 coder_; // 当需要对 KEY 编码时的编码器
236  bool encode_key_; // 是否需要对 KEY 进行编码
237 
238  bool opened_; // 连接是否打开
239  bool retry_; // 是否支持连接中断重试
240  char* addr_; // 服务地址(ip:port)
241  int enum_; // 出错号,留作将来扩充用
242  string ebuf_; // 存储出错信息
243  string kbuf_; // 存储经转码后的 KEY 值缓冲区
244 
245  size_t content_length_; // 当采用流式上传/下载大数据时此值记录数据体的总长度
246  size_t length_; // 已经上传/下载的数据总和
247 
248  socket_stream* conn_; // 与后端服务的连接对象
249  string req_line_; // 存储请求数据
250  string res_line_; // 存储响应数据
251  bool error_happen(const char* line);
252 };
253 
254 } // namespace acl
255 
256 #endif // ACL_CLIENT_ONLY
ACL_CPP_API int last_error(void)
ACL_CPP_API const char * last_serror(void)
class memcache mem_cache
Definition: memcache.hpp:14
#define ACL_CPP_API