acl  3.5.3.0
redis_hash.hpp
浏览该文件的文档.
1 #pragma once
2 #include "../acl_cpp_define.hpp"
3 #include <map>
4 #include <vector>
5 #include "../stdlib/string.hpp"
6 #include "redis_command.hpp"
7 
8 #if !defined(ACL_CLIENT_ONLY) && !defined(ACL_REDIS_DISABLE)
9 
10 namespace acl
11 {
12 
13 /**
14  * redis Hash(哈希表) 类,本类的实现的主要命令:
15  * redis Hash class, include commands as below:
16  * HDEL/HEXISTS/HGET/HGETALL/HINCRBY/HINCRBYFLOAT/HKEYS/HLEN/HMGET/HMSET
17  * HSET/HSETNX/HVALS/HSCAN
18  */
19 class ACL_CPP_API redis_hash : virtual public redis_command
20 {
21 public:
22  /**
23  * see redis_command::redis_command()
24  */
25  redis_hash(void);
26 
27  /**
28  * see redis_command::redis_command(redis_client*)
29  */
30  redis_hash(redis_client* conn);
31 
32  /**
33  * see redis_command::redis_command(redis_client_cluster*)
34  */
36 
38  redis_hash(redis_client_cluster* cluster, size_t max_conns);
39 
41 
42  virtual ~redis_hash(void);
43 
44  /////////////////////////////////////////////////////////////////////
45 
46  /**
47  * 将多个"域-值"对添加至 KEY 对应的哈希表中
48  * HMSET: set the key's multiple fileds in redis-server
49  * @param key {const char*} 哈希表 key 值
50  * the hash key for Hash class
51  * @param attrs {const std::map<acl::string, ...>&} the fileds in map
52  * @return {bool} 添加是否成功
53  * if successful for HMSET command
54  */
55  bool hmset(const char* key, const std::map<string, string>& attrs);
56  bool hmset(const char* key, size_t klen,
57  const std::map<string, string>& attrs);
58  bool hmset(const char* key, const std::map<string, const char*>& attrs);
59  bool hmset(const char* key, const std::vector<string>& names,
60  const std::vector<string>& values);
61  bool hmset(const char* key, size_t klen,
62  const std::vector<string>& names,
63  const std::vector<string>& values);
64  bool hmset(const char* key, const std::vector<const char*>& names,
65  const std::vector<const char*>& values);
66  bool hmset(const char* key, const char* names[], const char* values[],
67  size_t argc);
68  bool hmset(const char* key, const char* names[], const size_t names_len[],
69  const char* values[], const size_t values_len[], size_t argc);
70  bool hmset(const char* key, size_t klen, const char* names[],
71  const size_t names_len[], const char* values[],
72  const size_t values_len[], size_t argc);
73 
74  /////////////////////////////////////////////////////////////////////
75 
76  /**
77  * 根据 KEY 值将多个"域-值"对从哈希表中取出
78  * get the values associated with the specified fields
79  * in the hash stored at key
80  * @param key {const char*} 哈希表 key 值
81  * the hash key
82  * @param names 对应 key 的域值对
83  * the given hash fileds
84  * @param result {std::vector<acl::string>*} 当该对象指针非空时存储查询结果;
85  * 如果该参数为 NULL 时,则可以通过基类 result_/get_ 获得数据
86  * store the result of the given hash files if not NULL.
87  * If NULL, the base class's method like result_/get can be used
88  * to get the values
89  * @return {bool} 操作是否成功,操作成功后可以通过以下任一种方式获得数据:
90  * if successul, one of below ways can be used to get the result:
91  *
92  * 1、在调用方法中传入非空的存储结果对象的地址
93  * input the no-NULL result parameter when call hmget, when
94  * success, the result will store the values of the given fileds
95  *
96  * 2、基类方法 result_value 获得指定下标的元素数据
97  * call redis_command::result_value with the specified subscript
98  *
99  * 3、基类方法 result_child 获得指定下标的元素对象(redis_result),然后再通过
100  * redis_result::argv_to_string 方法获得元素数据
101  * call redis_command::result_child with specified subscript to
102  * get redis_result object, then call redis_result::argv_to_string
103  * with above result to get the values of the give fileds
104  *
105  * 4、基类方法 get_result 方法取得总结果集对象 redis_result,然后再通过
106  * redis_result::get_child 获得一个元素对象,然后再通过方式 2 中指定
107  * 的方法获得该元素的数据
108  * call redis_command::get_result with the specified subscript to
109  * get redis_result object, and use redis_result::get_child to
110  * get one result object, then call redis_result::argv_to_string
111  * to get the value of one filed.
112  *
113  * 5、基类方法 get_children 获得结果元素数组对象,再通过 redis_result 中
114  * 的方法 argv_to_string 从每一个元素对象中获得元素数据
115  * use redis_command::get_children to get the redis_result array,
116  * then use redis_result::argv_to_string to get every value of
117  * the given fileds
118  */
119  bool hmget(const char* key, const std::vector<string>& names,
120  std::vector<string>* result = NULL);
121  bool hmget(const char* key, size_t klen,
122  const std::vector<string>& names,
123  std::vector<string>* result = NULL);
124  bool hmget(const char* key, const std::vector<const char*>& names,
125  std::vector<string>* result = NULL);
126 
127  bool hmget(const char* key, const char* names[], size_t argc,
128  std::vector<string>* result = NULL);
129  bool hmget(const char* key, const char* names[], const size_t lens[],
130  size_t argc, std::vector<string>* result = NULL);
131  bool hmget(const char* key, size_t klen,
132  const char* names[], const size_t lens[],
133  size_t argc, std::vector<string>* result = NULL);
134 
135  /////////////////////////////////////////////////////////////////////
136 
137  /**
138  * 设置 key 对象中某个域字段的值
139  * set one field's value in the hash stored at key.
140  * @param key {const char*} key 键值
141  * the hash key
142  * @param name {const char*} key 对象的域名称
143  * the filed name of the hash key
144  * @param value {const char*} key 对象的域值
145  * the filed value of the hash key
146  * @return {int} 返回值含义:
147  * 1 -- 表示新添加的域字段添加成功
148  * 0 -- 表示更新已经存在的域字段成功
149  * -1 -- 表示出错或该 key 对象非哈希对象或从结点禁止修改
150  * return int value as below:
151  * 1 -- this is a new filed and set ok
152  * 0 -- thie is a old filed and set ok
153  * -1 -- error happend or the key is not a Hash type
154  */
155  int hset(const char* key, const char* name, const char* value);
156  int hset(const char* key, const char* name,
157  const char* value, size_t value_len);
158  int hset(const char* key, const char* name, size_t name_len,
159  const char* value, size_t value_len);
160  int hset(const char* key, size_t klen, const char* name,
161  size_t name_len, const char* value, size_t value_len);
162 
163  /**
164  * 当且仅当 key 对象中的某个域字段不存在时才更新该域字段值
165  * set one new field of one key in hash only when the filed isn't
166  * existing.
167  * @param key {const char*} key 键值
168  * the hash key
169  * @param name {const char*} key 对象的域名称
170  * the field name
171  * @param value {const char*} key 对象的域值
172  * the field value
173  * @return {int} 返回值含义:
174  * 1 -- 表示新添加的域字段添加成功
175  * 0 -- 该域字段存在且未对其进行更新
176  * -1 -- 表示出错或该 key 对象非哈希对象或从结点禁止修改
177  *
178  * return int value as below:
179  * 1 -- this is a new filed and set ok
180  * 0 -- thie is a old filed and not set
181  * -1 -- error happend or the key is not a Hash type
182  */
183  int hsetnx(const char* key, const char* name, const char* value);
184  int hsetnx(const char* key, const char* name,
185  const char* value, size_t value_len);
186  int hsetnx(const char* key, const char* name, size_t name_len,
187  const char* value, size_t value_len);
188  int hsetnx(const char* key, size_t klen, const char* name,
189  size_t name_len, const char* value, size_t value_len);
190 
191  /**
192  * 从 redis 哈希表中获取某个 key 对象的某个域的值
193  * get the value assosiated with field in the hash stored at key
194  * @param key {const char*} key 键值
195  * the hash key
196  * @param name {const char*} key 对象的域字段名称
197  * the field's name
198  * @param result {acl::string&} 存储查询结果值(内部对该 string 进行内容追加)
199  * store the value result of the given field
200  * @return {bool} 返回值含义:
201  * true -- 操作成功,当result为空时表示 KEY 或字段域不存在
202  * get the value associated with field; if result is empty then
203  * the key or the name field doesn't exist
204  * false -- 域字段不存在或操作失败或该 key 对象非哈希对象
205  * the field not exists, or error happened,
206  * or the key isn't a hash key
207  */
208  bool hget(const char* key, const char* name, string& result);
209  bool hget(const char* key, const char* name,
210  size_t name_len, string& result);
211  bool hget(const char* key, size_t klen, const char* name,
212  size_t name_len, string& result);
213 
214  /**
215  * 从 redis 哈希表中获取某个 key 对象的所有域字段的值
216  * get all the fields and values in hash stored at key
217  * @param key {const char*} key 键值
218  * the hash key
219  * @param result {std::map<string, string>&} 存储域字段名-值查询结果集
220  * store the result of all the fileds and values
221  * @return {bool} 操作是否成功,含义:
222  * if ok, show below:
223  * true -- 操作成功,当该域不存在时也返回成功,需要检查 result 内容是否变化,
224  * 比如可以通过检查 result.size() 的变化来表明是否查询到结果
225  * successful if the key is a hash key or the key not exists
226  * false -- 操作失败或该 key 对象非哈希对象
227  * error happened or the key isn't a hash key
228  */
229  bool hgetall(const char* key, std::map<string, string>& result);
230  bool hgetall(const char* key, size_t klen,
231  std::map<string, string>& result);
232  bool hgetall(const char* key, std::vector<string>& names,
233  std::vector<string>& values);
234  bool hgetall(const char* key, size_t klen,
235  std::vector<string>& names, std::vector<string>& values);
236  bool hgetall(const char* key, std::vector<const char*>& names,
237  std::vector<const char*>& values);
238 
239  /**
240  * 从 redis 哈希表中删除某个 key 对象的某些域字段
241  * remove one or more fields from hash stored at key
242  * @param key {const char*} key 键值
243  * the hash key
244  * @param first_name {const char*} 第一个域字段名,最后一个字段必须是 NULL
245  * the first field of the fields list, the last field must be NULL
246  * indicating the end of vary parameters
247  * @return {int} 成功删除的域字段个数,返回 -1 表示出错或该 key 对象非哈希对象
248  * return the number of fields be removed successfully, or -1 when
249  * error happened or operating on a no hash key
250  */
251  int hdel(const char* key, const char* first_name);
252  int hdel(const char* key, const char* names[], size_t argc);
253  int hdel(const char* key, const char* names[],
254  const size_t names_len[], size_t argc);
255  int hdel(const char* key, size_t klen, const char* names[],
256  const size_t names_len[], size_t argc);
257  int hdel(const char* key, const std::vector<string>& names);
258  int hdel(const char* key, size_t klen, const std::vector<string>& names);
259  int hdel(const char* key, const std::vector<const char*>& names);
260  int hdel_fields(const char* key, const char* names[], size_t argc);
261  int hdel_fields(const char* key, const char* names[],
262  const size_t names_len[], size_t argc);
263  int hdel_fields(const char* key, size_t klen,
264  const char* names[], const size_t names_len[], size_t argc);
265  int hdel_fields(const char* key, const std::vector<string>& names);
266  int hdel_fields(const char* key, size_t klen,
267  const std::vector<string>& names);
268  int hdel_fields(const char* key, const std::vector<const char*>& names);
269  int hdel_fields(const char* key, const char* first_name, ...);
270 
271  /**
272  * 当某个 key 对象中的某个域字段为整数时,对其进行加减操作
273  * inc(+n) or dec(-n) on a integer filed in hash stored at key
274  * @param key {const char*} key 键值
275  * the hash key
276  * @param name {const char*} key 对象的域字段名称
277  * the filed name of integer type
278  * @param inc {long long int} 增加的值,可以为负值
279  * the integer value to be inc or dec on the field's value
280  * @param result {long long int*} 非 NULL 时存储结果值
281  * store the result if non-NULL
282  * @return {bool} 操作是否成功,当返回 false 时表明出错或该 key 对象非哈希
283  * 对象或该域字段非整数类型
284  * if successful: false when error, not a hash, or the field isn't
285  * integer type
286  */
287  bool hincrby(const char* key, const char* name,
288  long long int inc, long long int* result = NULL);
289 
290  /**
291  * 当某个 key 对象中的某个域字段为浮点数时,对其进行加减操作
292  * inc(+n) or dec(-n) on a float filed in hash stored at key
293  * @param key {const char*} key 键值
294  * the hash key
295  * @param name {const char*} key 对象的域字段名称
296  * the filed name of float type
297  * @param inc {double} 增加的值,可以为负值
298  * the float value to be inc or dec on the field's value
299  * @param result {double*} 非 NULL 时存储结果值
300  * store the result if non-NULL
301  * @return {bool} 操作是否成功,当返回 false 时表明出错或该 key 对象非哈希
302  * 对象或该域字段非浮点数类型
303  * if successful: false when error, not a hash, or the field isn't
304  * float type
305  */
306  bool hincrbyfloat(const char* key, const char* name,
307  double inc, double* result = NULL);
308 
309  /**
310  * 返回 key 对象中所有域字段名称
311  * get all the fields in hash stored at key
312  * @param key {const char*} key 键值
313  * the hash key
314  * @param names {std::vector<string>&} 存储该 key 对象所有域字段名称
315  * store all the names of all fileds
316  * @return {bool} 操作是否成功,返回 false 表明出错或该 key 对象非哈希对象
317  * return true on success, false if error happened or the
318  * key wasn't a hash key
319  */
320  bool hkeys(const char* key, std::vector<string>& names);
321  bool hkeys(const char* key, size_t klen, std::vector<string>& names);
322 
323  /**
324  * 检查 key 对象中某个域字段是否存在
325  * check if the field exists in hash stored at key
326  * @param key {const char*} key 键值
327  * the hash key
328  * @param name {const char*} key 对象的域字段名称
329  * the filed's name of the key
330  * @return {bool} 操作是否成功,返回 false 表明出错或该 key 对象非哈希对象
331  * 或该域字段不存在
332  * return true on success, false if error happened or the
333  * key wasn't a hash key
334  */
335  bool hexists(const char* key, const char* name);
336  bool hexists(const char* key, const char* name, size_t name_len);
337  bool hexists(const char* key, size_t klen, const char* name, size_t name_len);
338 
339  /**
340  * 获得指定 key 的所有字段值
341  * get all fields' values with the specified key
342  * @param key {const char*} key 键值
343  * the hash key
344  * @param values {std::vector<string>&} 存储结果
345  * store the results
346  * @return {bool} 操作是否成功
347  * return true on success, or failed when error happened
348  */
349  bool hvals(const char* key, std::vector<string>& values);
350  bool hvals(const char* key, size_t klen, std::vector<string>& values);
351 
352  /**
353  * 获得某个 key 对象中所有域字段的数量
354  * get the count of fields in hash stored at key
355  * @param key {const char*} key 键值
356  * the hash key
357  * @return {int} 返回值含义:
358  * return int value as below:
359  * -1 -- 出错或该 key 对象非哈希对象
360  * error or not a hash key
361  * >0 -- 域字段数量
362  * the count of fields
363  * 0 -- 该 key 不存在或域字段数量为 0
364  * key not exists or no fields in hash stored at key
365  */
366  int hlen(const char* key);
367  int hlen(const char* key, size_t klen);
368 
369  /**
370  * 获得某个 key 中的指定域的数据长度
371  * Returns the string length of the value associated with field
372  * in the hash stored at key
373  * @param key {const char*} key 键值
374  * the hash key
375  * @param name {const char*} key 对象的域字段名称
376  * the field's name
377  * @return {int} 如果 key 或 name 不存在,则返回 0,如果 key 非哈希
378  * 键或出错,则返回 -1
379  * If the key or the field do not exist, 0 is returned; If the key is
380  * not the hash key or error happened, -1 is returned.
381  */
382  int hstrlen(const char* key, const char* name, size_t name_len);
383  int hstrlen(const char* key, size_t klen, const char* name, size_t name_len);
384  int hstrlen(const char* key, const char *name);
385 
386  /**
387  * 命令用于迭代哈希键中的键值对
388  * scan the name and value of all fields in hash stored at key
389  * @param key {const char*} 哈希键值
390  * the hash key
391  * @param cursor {int} 游标值,开始遍历时该值写 0
392  * the cursor value, which is 0 at begin
393  * @param out {std::map<acl::string>&} 存储结果集,内部以追加方式将本次
394  * 遍历结果添加进该对象中,为防止因总结果集过大导致该数组溢出,用户可在
395  * 调用本函数前后清理该对象
396  * store scaning result in appending mode
397  * @param pattern {const char*} 匹配模式,glob 风格,非空时有效
398  * match pattern, effective only on no-NULL
399  * @param count {const size_t*} 限定的结果集数量,非空指针时有效
400  * the max count of one scan process, effective only on no-NULL
401  * @return {int} 下一个游标位置,含义如下:
402  * return the next cursor position, as below:
403  * 0:遍历结束
404  * scan finish
405  * -1: 出错
406  * some error happened
407  * >0: 游标的下一个位置,即使这样,具体有多少结果还需要检查 out,因为有可能为空
408  * the next cursor postion to scan
409  */
410  int hscan(const char* key, int cursor, std::map<string, string>& out,
411  const char* pattern = NULL, const size_t* count = NULL);
412  int hscan(const char* key, size_t klen, int cursor,
413  std::map<string, string>& out, const char* pattern = NULL,
414  const size_t* count = NULL);
415 };
416 
417 } // namespace acl
418 
419 #endif // !defined(ACL_CLIENT_ONLY) && !defined(ACL_REDIS_DISABLE)
HTTP_API void const char * name
Definition: lib_http.h:620
#define ACL_CPP_DEPRECATED
Definition: atomic.hpp:86
#define ACL_CPP_API