acl  3.5.3.0
redis_string.hpp
浏览该文件的文档.
1 #pragma once
2 #include "../acl_cpp_define.hpp"
3 #include <map>
4 #include <vector>
5 #include "redis_command.hpp"
6 
7 #if !defined(ACL_CLIENT_ONLY) && !defined(ACL_REDIS_DISABLE)
8 
9 namespace acl
10 {
11 
12 /**
13  * 所有的字符串对象的命令都已实现
14  * all the commands in redis Strings are be implemented.
15  */
16 class ACL_CPP_API redis_string : virtual public redis_command
17 {
18 public:
19  /**
20  * see redis_command::redis_command()
21  */
22  redis_string(void);
23 
24  /**
25  * see redis_command::redis_command(redis_client*)
26  */
28 
29  /**
30  * see redis_command::redis_command(redis_client_cluster*)
31  */
33 
35 
37  redis_string(redis_client_cluster* cluster, size_t max_conns);
38 
39  virtual ~redis_string(void);
40 
41  /////////////////////////////////////////////////////////////////////
42 
43  /**
44  * 将字符串值 value 关联到 key
45  * set the string value of a key
46  * @param key {const char*} 字符串对象的 key
47  * the key of a string
48  * @param value {const char*} 字符串对象的 value
49  * the value of a string
50  * @return {bool} 操作是否成功,返回 false 表示出错或该 key 对象非字符串对象
51  * true if SET was executed correctly, false if error happened or
52  * the key's object isn't a string.
53  */
54  bool set(const char* key, const char* value);
55  bool set(const char* key, size_t key_len,
56  const char* value, size_t value_len);
57 
58  #define SETFLAG_EX 0x02
59  #define SETFLAG_PX 0x03
60  #define SETFLAG_NX 0x08
61  #define SETFLAG_XX 0x0C
62  /**
63  * 从 Redis 2.6.12 版本开始, SET 命令的行为可以通过一系列参数来修改:
64  * EX seconds : 将键的过期时间设置为 seconds 秒。 执行 SET key value
65  * EX seconds 的效果等同于执行 SETEX key seconds value 。
66  * PX milliseconds : 将键的过期时间设置为 milliseconds 毫秒。
67  * 执行 SET key value PX milliseconds 的效果等同于执行
68  * PSETEX key milliseconds value 。
69  * NX :只在键不存在时,才对键进行设置操作。执行 SET key value NX 的
70  * 效果等同于执行 SETNX key value 。
71  * XX :只在键已经存在时, 才对键进行设置操作。
72  * @Note 因为 SET 命令可以通过参数来实现 SETNX 、 SETEX 以及 PSETEX
73  * 命令的效果, 所以 Redis 将来的版本可能会移除并废弃 SETNX 、 SETEX
74  * 和 PSETEX 这三个命令。
75  * @param key {const char*} 字符串对象的 key
76  * the key of a string
77  * @param value {const char*} 字符串对象的 value
78  * the value of a string
79  * @param timeout {int} 过期值,单位为秒(EX)/毫秒(PX)
80  * the timeout in seconds of a string
81  * @param flag {int} 标记,EX/PX | NX/XX
82  * the flag of a string
83  * @return {bool} 操作是否成功,返回 false 表示出错或该 key 对象非字符串对象
84  * true if SET was executed correctly, false if error happened or
85  * the key's object isn't a string.
86  */
87  bool set(const char* key, const char* value, int timeout, int flag);
88  bool set(const char* key, size_t key_len, const char* value,
89  size_t value_len, int timeout, int flag);
90 
91  /**
92  * 将值 value 关联到 key ,并将 key 的生存时间设为 timeout (以秒为单位),
93  * 如果 key 已经存在, SETEX 命令将覆写旧值
94  * set key to hold the strnig value, and set key to timeout after
95  * a given number of seconds.
96  * @param key {const char*} 字符串对象的 key
97  * the key of a string
98  * @param value {const char*} 字符串对象的 value
99  * the value of a string
100  * @param timeout {int} 过期值,单位为秒
101  * the timeout in seconds of a string
102  * @return {bool} 操作是否成功,返回 false 表示出错或该 key 对象非字符串对象
103  * true if SETEX was executed correctly, false if error happened
104  * or the object specified by the key is not a string
105  */
106  bool setex(const char* key, const char* value, int timeout);
107  bool setex(const char* key, size_t key_len, const char* value,
108  size_t value_len, int timeout);
109 
110  /**
111  * 将值 value 关联到 key ,并将 key 的生存时间设为 timeout (以毫秒为单位),
112  * 如果 key 已经存在, SETEX 命令将覆写旧值
113  * set key to hold the string value, and set key to timeout after
114  * a given number of milliseconds.
115  * @param key {const char*} 字符串对象的 key
116  * the key of a string
117  * @param value {const char*} 字符串对象的 value
118  * the value of a string
119  * @param timeout {int} 过期值,单位为毫秒
120  * the timeout in milliseconds of a string
121  * @return {bool} 操作是否成功,返回 false 表示出错或该 key 对象非字符串对象
122  * true if SETEX was executed correctly, false if error happened
123  * or the object specified by the key is not a string
124  */
125  bool psetex(const char* key, const char* value, int timeout);
126  bool psetex(const char* key, size_t key_len, const char* value,
127  size_t value_len, int timeout);
128 
129  /**
130  * 将 key 的值设为 value ,当且仅当 key 不存在,若给定的 key 已经存在,
131  * 则 SETNX 不做任何动作
132  * set the value of a key, only if the key does not exist.
133  * @param key {const char*} 字符串对象的 key
134  * the key of the string
135  * @param value {const char*} 字符串对象的 value
136  * the value of the string
137  * @return {int} 返回值含义如下:
138  * return the value as below:
139  * -1:出错或 key 非字符串对象
140  * error happened or the object by the key isn't a string
141  * 0:给定 key 的对象存在
142  * the string of the key already exists
143  * 1:添加成功
144  * the command was executed correctly
145  */
146  int setnx(const char* key, const char* value);
147  int setnx(const char* key, size_t key_len,
148  const char* value, size_t value_len);
149 
150  /**
151  * 如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来
152  * 的值的末尾;如果 key 不存在, APPEND 就简单地将给定 key 设为 value
153  * append a value to a key
154  * @param key {const char*} 字符串对象的 key
155  * the key of a string
156  * @param value {const char*} 字符串对象的值
157  * the value to be appended to a key
158  * @return {int} 返回当前该字符串的长度,-1 表示出错或 key 非字符串对象
159  * return the length of the string after appending, -1 if error
160  * happened or the key's object isn't a string
161  */
162  int append(const char* key, const char* value);
163  int append(const char* key, const char* value, size_t size);
164 
165  /**
166  * 返回 key 所关联的字符串值
167  * get the value of a key
168  * @param key {const char*} 字符串对象的 key
169  * the key of a string
170  * @param buf {string&} 操作成功后存储字符串对象的值,如果返回 true 且
171  * 该缓冲区为空则表示对应 key 不存在
172  * store the value of a key after GET executed correctly, key not
173  * exist if the buf is empty when return true
174  * @return {bool} 操作是否成功,返回 false 表示出错或 key 非字符串对象
175  * if the GET was executed correctly, false if error happened or
176  * is is not a string of the key
177  */
178  bool get(const char* key, size_t len, string& buf);
179  bool get(const char* key, string& buf);
180 
181  /**
182  * 返回 key 所关联的字符串值,当返回的字符串值比较大时,内部会自动进行切片,即将
183  * 一个大内存切成一些非连续的小内存,使用者需要根据返回的结果对象重新对结果数据进行
184  * 组装,比如可以调用: redis_result::get(size_t, size_t*) 函数获得某个切
185  * 片的片断数据,根据 redis_result::get_size() 获得分片数组的长度
186  * @param key {const char*} 字符串对象的 key
187  * @return {bool} 操作是否成功,返回 false 表示出错或 key 非字符串对象
188  */
189  const redis_result* get(const char* key);
190  const redis_result* get(const char* key, size_t len);
191 
192  /**
193  * 将给定 key 的值设为 value ,并返回 key 的旧值,当 key 存在但不是
194  * 字符串类型时,返回一个错误
195  * set the string value of a key and and return its old value
196  * @param key {const char*} 字符串对象的 key
197  * the key of string
198  * @param value {const char*} 设定的新的对象的值
199  * the new string value of the key
200  * @param buf {string&} 存储对象的旧的值
201  * store the old string value of the key
202  * @return {bool} 是否成功
203  * if GETSET was executed correctly.
204  */
205  bool getset(const char* key, const char* value, string& buf);
206  bool getset(const char* key, size_t key_len, const char* value,
207  size_t value_len, string& buf);
208 
209  /////////////////////////////////////////////////////////////////////
210 
211  /**
212  * 获得指定 key 的字符串对象的值的数据长度
213  * get the length of value stored in a key
214  * @param key {const char*} 字符串对象的 key
215  * the key of the string
216  * @return {int} 返回值含义如下:
217  * return value as below:
218  * -1:出错或非字符串对象
219  * error happened or the it isn't a string of the key
220  * 0:该 key 不存在
221  * the key doesn't exist
222  * >0:该字符串数据的长度
223  * the length of the value stored in a key
224  */
225  int get_strlen(const char* key);
226  int get_strlen(const char* key, size_t key_len);
227 
228  /**
229  * 用 value 参数覆写(overwrite)给定 key 所储存的字符串值,从偏移量 offset 开始,
230  * 不存在的 key 当作空白字符串处理
231  * overwrite part of a string at key starting at the specified offset
232  * @param key {const char*} 字符串对象的 key
233  * the key of a string
234  * @param offset {unsigned} 偏移量起始位置,该值可以大于字符串的数据长度,此时
235  * 是间的空洞将由 \0 补充
236  * the specified offset of the string
237  * @param value {const char*} 覆盖的值
238  * the value to be set
239  * @return {int} 当前字符串对象的数据长度
240  * the length of the string after SETRANGE
241  */
242  int setrange(const char* key, unsigned offset, const char* value);
243  int setrange(const char* key, size_t key_len, unsigned offset,
244  const char* value, size_t value_len);
245 
246  /**
247  * 返回 key 中字符串值的子字符串,字符串的截取范围由 start 和 end 两个偏移量决定
248  * (包括 start 和 end 在内)
249  * get substring of the string stored at a key
250  * @param key {const char*} 字符串对象的 key
251  * the key of string
252  * @param start {int} 起始下标值
253  * the starting offset of the string
254  * @param end {int} 结束下标值
255  * the ending offset of the string
256  * @param buf {string&} 成功时存储结果
257  * store the substring result
258  * @return {bool} 操作是否成功
259  * if GETRANGE was executed correctly.
260  * 注:下标位置可以为负值,表示从字符串尾部向前开始计数,如 -1 表示最后一个元素
261  */
262  bool getrange(const char* key, int start, int end, string& buf);
263  bool getrange(const char* key, size_t key_len,
264  int start, int end, string& buf);
265 
266  /////////////////////////////////////////////////////////////////////
267 
268  /**
269  * 对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit),
270  * 位的设置或清除取决于 value 参数,可以是 0 也可以是 1
271  * set or clear the bit at offset in the string value stored at key
272  * @param key {const char*} 字符串对象的 key
273  * the key of the string
274  * @param offset {unsigned} 指定偏移量的位置
275  * the offset at the string value
276  * @param bit {bool} 为 true 表示设置标志位,否则为取消标志位
277  * set bit if true, or clear bit if false at the specified offset
278  * @return {bool} 操作是否成功
279  * if the command was executed correctly
280  */
281  bool setbit_(const char* key, unsigned offset, bool bit);
282  bool setbit_(const char* key, size_t len, unsigned offset, bool bit);
283 
284  /**
285  * 对 key 所储存的字符串值,获取指定偏移量上的位(bit),当 offset 比字符串值
286  * 的长度大,或者 key 不存在时,返回 0
287  * get the bit at offset in the string value stored at key
288  * @param key {const char*} 字符串对象的 key
289  * the key of the string
290  * @param offset {unsigned} 指定偏移量的位置
291  * the offset in the string value
292  * @param bit {int&} 成功后存储指定位置的标志位
293  * on success it will stored the bit at the specified offset
294  * @return {bool} 操作是否成功,返回 false 表示出错或该 key 非字符串对象
295  * if the GETBIT was executed correctly, false if error happened,
296  * or the key doesn't store a string object
297  */
298  bool getbit(const char* key, unsigned offset, int& bit);
299  bool getbit(const char* key, size_t len, unsigned offset, int& bit);
300 
301  /**
302  * 计算给定字符串中,被设置为 1 的比特位的数量,若指定了 start/end,则计数在指定
303  * 区间内进行
304  * count set bits in a string
305  * @param key {const char*} 字符串对象的 key
306  * the key of a string
307  * @return {int} 标志位为 1 的数量,-1 表示出错或非字符串对象
308  * the count of bits been set, -1 if error happened or it's not
309  * a string
310  */
311  int bitcount(const char* key);
312  int bitcount(const char* key, size_t len);
313  int bitcount(const char* key, int start, int end);
314  int bitcount(const char* key, size_t len, int start, int end);
315 
316  /**
317  * 对一个或多个 key 求逻辑并,并将结果保存到 destkey
318  * BITOP AND on multiple source keys and save the result to another key
319  * @param destkey {const char*} 目标字符串对象的 key
320  * the key storing the result
321  * @param keys 源字符串对象集合
322  * the source keys
323  * @return {int} 存储在目标 key 中的字符串的长度
324  * the size of the string stored in the destination key, that is
325  * equal to the size of the longest input string
326  */
327  int bitop_and(const char* destkey, const std::vector<string>& keys);
328  int bitop_and(const char* destkey, const std::vector<const char*>& keys);
329  int bitop_and(const char* destkey, const char* key, ...);
330  int bitop_and(const char* destkey, const char* keys[], size_t size);
331 
332  /**
333  * 对一个或多个 key 求逻辑或,并将结果保存到 destkey
334  * BITOP OR on multiple source keys and save the result to another key
335  * @param destkey {const char*} 目标字符串对象的 key
336  * the destination key
337  * @param keys 源字符串对象集合
338  * the source keys
339  * @return {int}
340  * the size of the string stored in the destination key
341  */
342  int bitop_or(const char* destkey, const std::vector<string>& keys);
343  int bitop_or(const char* destkey, const std::vector<const char*>& keys);
344  int bitop_or(const char* destkey, const char* key, ...);
345  int bitop_or(const char* destkey, const char* keys[], size_t size);
346 
347  /**
348  * 对一个或多个 key 求逻辑异或,并将结果保存到 destkey
349  * BITOP XOR on multiple source keys and save the result to another key
350  * @param destkey {const char*} 目标字符串对象的 key
351  * the destination key
352  * @param keys 源字符串对象集合
353  * the source keys
354  * @return {int}
355  * the size of the string stored in the destination key
356  */
357  int bitop_xor(const char* destkey, const std::vector<string>& keys);
358  int bitop_xor(const char* destkey, const std::vector<const char*>& keys);
359  int bitop_xor(const char* destkey, const char* key, ...);
360  int bitop_xor(const char* destkey, const char* keys[], size_t size);
361 
362  /////////////////////////////////////////////////////////////////////
363 
364  /**
365  * 同时设置一个或多个 key-value 对
366  * set multiple key-value pair
367  * @param objs key-value 对集合
368  * the collection of multiple key-value pair
369  * @return {bool} 操作是否成功
370  * if the command was executed correctly
371  */
372  bool mset(const std::map<string, string>& objs);
373  bool mset(const std::vector<string>& keys,
374  const std::vector<string>& values);
375  bool mset(const char* keys[], const char* values[], size_t argc);
376  bool mset(const char* keys[], const size_t keys_len[],
377  const char* values[], const size_t values_len[], size_t argc);
378 
379  /////////////////////////////////////////////////////////////////////
380 
381  /**
382  * 当且仅当所有给定 key 都不存在时同时设置一个或多个 key-value 对
383  * set multiple keys to multiple values only if none of the keys exist
384  * @param objs key-value 对集合
385  * the collection of multile key-value pair
386  * @return {int} 返回值含义如下:
387  * return value as below:
388  * -1:出错或非字符串对象
389  * error happened or there were a object of not a string.
390  * 0:添加的 key 集合中至少有一个已经存在
391  * none be set because some of the keys already exist
392  * 1:添加成功
393  * add ok.
394  */
395  int msetnx(const std::map<string, string>& objs);
396  int msetnx(const std::vector<string>& keys,
397  const std::vector<string>& values);
398  int msetnx(const char* keys[], const char* values[], size_t argc);
399  int msetnx(const char* keys[], const size_t keys_len[],
400  const char* values[], const size_t values_len[], size_t argc);
401 
402  /////////////////////////////////////////////////////////////////////
403 
404  /**
405  * 返回所有(一个或多个)给定 key 的值,如果给定的 key 里面,有某个 key 不存在,
406  * 那么这个 key 返回空串添加进结果数组中
407  * get the values of the given keys
408  * @param keys {const std::vector<string>&} 字符串 key 集合
409  * the given keys
410  * @param out {std::vector<acl::string>*} 非空时存储字符串值集合数组,
411  * 对于不存在的 key 也会存储一个空串对象
412  * acl::string array storing the result. if one key not exists,
413  * a empty string "" will also be stored in the array.
414  * @return {bool} 操作是否成功,操作成功后可以通过以下任一种方式获得数据:
415  * if successul, one of below ways can be used to get the result:
416  *
417  * 1、在调用方法中传入非空的存储结果对象的地址
418  * input the no-NULL result parameter when call hmget, when
419  * success, the result will store the values of the given fileds
420  *
421  * 2、基类方法 get_value 获得指定下标的元素数据
422  * call redis_command::result_value with the specified subscript
423  *
424  * 3、基类方法 get_child 获得指定下标的元素对象(redis_result),然后再通过
425  * redis_result::argv_to_string 方法获得元素数据
426  * redis_result::argv_to_string 方法获得元素数据
427  * call redis_command::result_child with specified subscript to
428  * get redis_result object, then call redis_result::argv_to_string
429  * with above result to get the values of the give fileds
430  *
431  * 4、基类方法 get_result 方法取得总结果集对象 redis_result,然后再通过
432  * redis_result::get_child 获得一个元素对象,然后再通过方式 2 中指定
433  * 的方法获得该元素的数据
434  * call redis_command::get_result with the specified subscript to
435  * get redis_result object, and use redis_result::get_child to
436  * get one result object, then call redis_result::argv_to_string
437  * to get the value of one filed.
438  *
439  * 5、基类方法 get_children 获得结果元素数组对象,再通过 redis_result 中
440  * 的方法 argv_to_string 从每一个元素对象中获得元素数据
441  * use redis_command::get_children to get the redis_result array,
442  * then use redis_result::argv_to_string to get every value of
443  * the given fileds
444  */
445  bool mget(const std::vector<string>& keys,
446  std::vector<string>* out = NULL);
447  bool mget(const std::vector<const char*>& keys,
448  std::vector<string>* out = NULL);
449 
450  bool mget(std::vector<string>* result, const char* first_key, ...);
451  bool mget(const char* keys[], size_t argc,
452  std::vector<string>* out = NULL);
453  bool mget(const char* keys[], const size_t keys_len[], size_t argc,
454  std::vector<string>* out = NULL);
455 
456  /////////////////////////////////////////////////////////////////////
457 
458  /**
459  * 将 key 中储存的数字值增一
460  * 1)如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作;
461  * 2)如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误;
462  * 3)本操作的值限制在 64 位(bit)有符号数字表示之内
463  * increment the integer value of a key by one
464  * 1) if key not exists, the key's value will be set 0 and INCR
465  * 2) if key's value is not a number an error will be returned
466  * 3) the number is a 64 signed integer
467  * @param key {const char*} 字符串对象的 key
468  * the given key
469  * @param result {long long int*} 非空时存储操作结果
470  * store the result after INCR if it isn't NULL
471  * @return {bool} 操作是否成功
472  * if the INCR was executed correctly
473  */
474  bool incr(const char* key, long long int* result = NULL);
475 
476  /**
477  * 将 key 所储存的值加上增量 increment
478  * 1)如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCRBY 命令
479  * 2)如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误
480  * 3)本操作的值限制在 64 位(bit)有符号数字表示之内
481  * increment the integer value of a key by a given amount
482  * 1) if key not exists, the key's value will be set 0 and INCRBY
483  * 2) if key's value is not a number an error will be returned
484  * 3) the number is a 64 signed integer
485  * @param key {const char*} 字符串对象的 key
486  * the given key
487  * @param inc {long long int} 增量值
488  * the given amount
489  * @param result {long long int*} 非空时存储操作结果
490  * store the result after INCR if it isn't NULL
491  * @return {bool} 操作是否成功
492  * if the INCRBY was executed correctly
493  */
494  bool incrby(const char* key, long long int inc,
495  long long int* result = NULL);
496 
497  /**
498  * 为 key 中所储存的值加上浮点数增量
499  * 1) 如果 key 不存在,那么 INCRBYFLOAT 会先将 key 的值设为 0 ,再执行加法操作
500  * 2) 如果命令执行成功,那么 key 的值会被更新为(执行加法之后的)新值,并且新值会
501  * 以字符串的形式返回给调用者
502  * 3) 计算结果也最多只能表示小数点的后十七位
503  * increment the float value of a key by the given amount
504  * 1) if key not exists, the key's value will be set 0 and INCRBYFLOAT
505  * 2) if key's value is not a float an error will be returned
506  * @param key {const char*} 字符串对象的 key
507  * the given key
508  * @param inc {double} 增量值
509  * the given amount
510  * @param result {double*} 非空时存储操作结果
511  * store the result after INCR if it isn't NULL
512  * @return {bool} 操作是否成功
513  * if the INCRBYFLOAT was executed correctly
514  */
515  bool incrbyfloat(const char* key, double inc, double* result = NULL);
516 
517  /**
518  * 将 key 中储存的数字值减一
519  * 1) 如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 DECR 操作
520  * 2) 如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误
521  * 3) 本操作的值限制在 64 位(bit)有符号数字表示之内
522  * decrement the integer value of a key by one
523  * 1) if key not exists, the key's value will be set 0 and DECR
524  * 2) if key's value is not a number an error will be returned
525  * 3) the number is a 64 signed integer
526  * @param key {const char*} 字符串对象的 key
527  * the given key
528  * @param result {long long int*} 非空时存储操作结果
529  * store the result after INCR if it isn't NULL
530  * @return {bool} 操作是否成功
531  * if the DECR was executed correctly
532  */
533  bool decr(const char* key, long long int* result = NULL);
534 
535  /**
536  * 将 key 所储存的值减去减量 decrement
537  * 1) 如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 DECRBY 操作
538  * 2) 如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误
539  * 3) 本操作的值限制在 64 位(bit)有符号数字表示之内
540  * decrement the integer value of a key by the given amount
541  * @param key {const char*} 字符串对象的 key
542  * the given key
543  * @param dec {long long int} 减量值
544  * the given amount
545  * @param result {long long int*} 非空时存储操作结果
546  * store the result after INCR if it isn't NULL
547  * @return {bool} 操作是否成功
548  * if the DECRBY was executed correctly
549  */
550  bool decrby(const char* key, long long int dec,
551  long long int* result = NULL);
552 
553 private:
554  int bitop(const char* op, const char* destkey,
555  const std::vector<string>& keys);
556  int bitop(const char* op, const char* destkey,
557  const std::vector<const char*>& keys);
558  int bitop(const char* op, const char* destkey,
559  const char* keys[], size_t size);
560 
561  bool incoper(const char* cmd, const char* key, long long int* inc,
562  long long int* result);
563 
564 };
565 
566 } // namespace acl
567 
568 #endif // !defined(ACL_CLIENT_ONLY) && !defined(ACL_REDIS_DISABLE)
#define ACL_CPP_DEPRECATED
Definition: atomic.hpp:86
#define ACL_CPP_API