acl  3.5.3.0
redis_list.hpp
浏览该文件的文档.
1 #pragma once
2 #include "../acl_cpp_define.hpp"
3 #include "redis_command.hpp"
4 
5 #if !defined(ACL_CLIENT_ONLY) && !defined(ACL_REDIS_DISABLE)
6 
7 namespace acl
8 {
9 
10 class ACL_CPP_API redis_list : virtual public redis_command
11 {
12 public:
13  /**
14  * see redis_command::redis_command()
15  */
16  redis_list(void);
17 
18  /**
19  * see redis_command::redis_command(redis_client*)
20  */
21  redis_list(redis_client* conn);
22 
23  /**
24  * see redis_command::redis_command(redis_client_cluster*)
25  */
27 
29  redis_list(redis_client_cluster* cluster, size_t max_conns);
30 
32 
33  virtual ~redis_list(void);
34 
35  /////////////////////////////////////////////////////////////////////
36 
37  /**
38  * 从 key 列表对象中弹出一个元素对象(name/value对),采用阻塞方式从头部弹出;
39  * 当给定多个 key 参数时,按参数 key 的先后顺序依次检查各个列表,弹出第一个
40  * 非空列表的头元素
41  * remove and get a element from list head, or block until one
42  * is available; when multiple keys were given, multiple elements
43  * will be gotten according the sequence of keys given.
44  * @param result {std::pair<string, string>&} 存储结果元素对象,该对象的
45  * 第一个字符串表示是列表对象的 key,第二个为该对象的头部元素
46  * store the elements result, the first string of pair is the key,
47  * and the second string of pair is the element
48  * @param timeout {size_t} 等待阻塞时间(秒),在超时时间内没有获得元素对象,
49  * 则返回 false;如果该值为 0 则一直等待至获得元素对象或出错
50  * the blocking timeout in seconds before one element availble;
51  * false will be returned when the timeout is arrived; if the timeout
52  * was set to be 0, this function will block until a element was
53  * available or some error happened.
54  * @param first_key {const char*} 第一个非空字符串的 key 键,最后一个参数
55  * 必须以 NULL 结束,表示变参列表的结束
56  * the first key of a variable args, the last arg must be NULL
57  * indicating the end of the variable args.
58  * @return {bool} 是否获得了头部元素对象,如果返回 false 则有以下可能原因:
59  * true if got a element in the head of list, when false was be
60  * returned, there'are some reasons show below:
61  * 1、出错
62  * error happened.
63  * 2、有一个 key 非列表对象
64  * at least one key was not a list object.
65  * 3、key 不存在或超时未获得元素对象
66  * key not exist or timeout was got.
67 
68  */
69  bool blpop(std::pair<string, string>& result, size_t timeout,
70  const char* first_key, ...);
71  bool blpop(const std::vector<const char*>& keys, size_t timeout,
72  std::pair<string, string>& result);
73  bool blpop(const std::vector<string>& keys, size_t timeout,
74  std::pair<string, string>& result);
75 
76  /**
77  * 含义参见 blpop,唯一区别为该方法弹出尾部元素对象
78  * the meaning is same as the blpop above except that this function
79  * is used to pop element from the tail of the list
80  * @see blpop
81  */
82  bool brpop(std::pair<string, string>& result, size_t timeout,
83  const char* first_key, ...);
84  bool brpop(const std::vector<const char*>& keys, size_t timeout,
85  std::pair<string, string>& result);
86  bool brpop(const std::vector<string>& keys, size_t timeout,
87  std::pair<string, string>& result);
88 
89  /**
90  * 阻塞式执行以下两个动作:
91  * 1) 将列表 src 中的最后一个元素(尾元素)弹出,并返回给客户端。
92  * 2) 将 src 弹出的元素插入到列表 dst ,作为 dst 列表的的头元素
93  * two actions will be executed in blocking mode as below:
94  * 1) pop a element from src list's tail, and return it to caller
95  * 2) push the element to dst list's head
96  * @param src {const char*} 源列表对象 key
97  * the key of source list
98  * @param dst {const char*} 目标列表对象 key
99  * the key of destination list
100  * @param buf {string*} 非空时存储 src 的尾部元素 key 值
101  * if not NULL, buf will store the element poped from the head of src
102  * @param timeout {size_t} 等待超时时间,如果为 0 则一直等待直到有数据或出错
103  * the timeout to wait, if the timeout is 0 this function will
104  * block until a element was available or error happened.
105  * @return {bool} 当从 src 列表中成功弹出尾部元素并放入 dst 列表头部后
106  * 该方法返回 true;返回 false 表示超时、出错或 src/dst 有一个非列表对象
107  * true if success, false if timeout arrived, or error happened,
108  * or one of the src and dst is not a list object
109  * @see rpoplpush
110  */
111  bool brpoplpush(const char* src, const char* dst, size_t timeout,
112  string* buf = NULL);
113 
114  /**
115  * 返回 key 对应的列表对象中,指定下标的元素
116  * return the element of the specified subscript from the list at key
117  * @param key {const char*} 列表对象的 key
118  * the key of one list object
119  * @param idx {size_t} 下标值
120  * the specified subscript
121  * @param buf {string&} 存储结果
122  * store the result
123  * @return {bool} 返回 true 表明操作成功,此时若 buf 数据非空则表明正确获得了
124  * 指定下标的元素,如果 buf.empty()表示没有获得元素;返回 false 时表明操作失败
125  * true if success, and if buf is empty, no element was got;
126  * false if error happened
127  */
128  bool lindex(const char* key, size_t idx, string& buf);
129 
130  /**
131  * 在列表对象中将一个新元素添加至指定元素的前面
132  * insert one new element before the specified element in list
133  * @param key {const char*} 列表对象的 key
134  * the key of specified list
135  * @param pivot {const char*} 列表对象中的一个指定元素名
136  * the speicifed element of list
137  * @param value {const char*} 新的元素名
138  * the new element to be inserted
139  * @reutrn {int} 返回该列表对象的元素个数,含义如下:
140  * return the number of list specified by the given key, as below:
141  * -1 -- 表示出错或 key 非列表对象
142  * error happened or the object of the key is not a list
143  * >0 -- 当前列表对象的元素个数
144  * the number of elements of the specified list
145  */
146  int linsert_before(const char* key, const char* pivot,
147  const char* value);
148  int linsert_before(const char* key, const char* pivot,
149  size_t pivot_len, const char* value, size_t value_len);
150 
151  /**
152  * 在列表对象中将一个新元素添加至指定元素的后面
153  * append a new element after the specified element in the list
154  * @param key {const char*} 列表对象的 key
155  * the key of the specified list
156  * @param pivot {const char*} 列表对象中的一个指定元素名
157  * the specified element
158  * @param value {const char*} 新的元素名
159  * the new element
160  * @reutrn {int} 返回该列表对象的元素个数,含义如下:
161  * return the number of elements in the list specifed by the key:
162  * -1 -- 表示出错或 key 非列表对象
163  * error happened or it is not a list object specified by key
164  * >0 -- 当前列表对象的元素个数
165  * the number of elements in list specified by the key
166  */
167  int linsert_after(const char* key, const char* pivot,
168  const char* value);
169  int linsert_after(const char* key, const char* pivot,
170  size_t pivot_len, const char* value, size_t value_len);
171 
172  /**
173  * 返回指定列表对象的元素个数
174  * get the number of elements in list specified the given key
175  * @param key {const char*} 列表对象的 key
176  * the list's key
177  * @return {int} 返回指定列表对象的长度(即元素个数), -1 if error happened
178  * return the number of elements in list, -1 if error
179  */
180  int llen(const char* key);
181 
182  /**
183  * 从列表对象中移除并返回头部元素
184  * remove and get the element in the list's head
185  * @param key {const char*} 元素对象的 key
186  * the key of one list
187  * @param buf {string&} 存储弹出的元素值
188  * store the element when successful.
189  * @return {int} 返回值含义:>0 -- 表示成功弹出一个元素且返回值表示元素的长度,
190  * -1 -- 表示出错,或该对象非列表对象,或该对象已经为空
191  * return value as below:
192  * >0: get one element successfully and return the length of element
193  * -1: error happened, or the oject is not a list specified
194  * by the key, or the list specified by key is empty
195  */
196  int lpop(const char* key, string& buf);
197 
198  /**
199  * 将一个或多个值元素插入到列表对象 key 的表头
200  * add one or more element(s) to the head of a list
201  * @param key {const char*} 列表对象的 key
202  * the list key
203  * @param first_value {const char*} 第一个非空字符串,该变参的列表的最后一个
204  * 必须设为 NULL
205  * the first no-NULL element of the variable args, the last arg must
206  * be NULL indicating the end of the args.
207  * @return {int} 返回添加完后当前列表对象中的元素个数,返回 -1 表示出错或该 key
208  * 对象非列表对象,当该 key 不存在时会添加新的列表对象及对象中的元素
209  * return the number of elements in list. -1 if error happened,
210  * or the object specified by key is not a list.
211  */
212  int lpush(const char* key, const char* first_value, ...);
213  int lpush(const char* key, const char* values[], size_t argc);
214  int lpush(const char* key, const std::vector<string>& values);
215  int lpush(const char* key, const std::vector<const char*>& values);
216  int lpush(const char* key, const char* values[], const size_t lens[],
217  size_t argc);
218 
219  /**
220  * 将一个新的列表对象的元素添加至已经存在的指定列表对象的头部,当该列表对象
221  * 不存在时则不添加
222  * add a new element before the head of a list, only if the list exists
223  * @param key {const char*} 列表对象的 key
224  * the list's key
225  * @param value {const char*} 新加的列表对象的元素
226  * the new element to be added
227  * @return {int} 返回当前列表对象的元素个数,含义如下:
228  * return the number of elements in the list:
229  * -1:出错,或该 key 非列表对象
230  * error or the key isn't refer to a list
231  * 0:该 key 对象不存在
232  * the list specified by the given key doesn't exist
233  * >0:添加完后当前列表对象中的元素个数
234  * the number of elements in list specifed by key after added
235  */
236  int lpushx(const char* key, const char* value);
237  int lpushx(const char* key, const char* value, size_t len);
238 
239  /**
240  * 返回列表 key 中指定区间内(闭区间)的元素,区间以偏移量 start 和 end 指定;
241  * 下标起始值从 0 开始,-1 表示最后一个下标值
242  * get a range of elements from list, the range is specified by
243  * start and end, and the start begins with 0, -1 means the end
244  * @param key {const char*} 列表对象的 key
245  * the specified key of one list
246  * @param start {int} 起始下标值
247  * the start subscript of list
248  * @param end {int} 结束下标值
249  * the end subscript of list
250  * @param result {std::vector<string>*} 非空时存储列表对象中指定区间的元素集合
251  * if not NULL, result will be used to store the results
252  * @return {bool} 操作是否成功,当返回 false 表示出错或 key 非列表对象
253  * if success for this operation, false if the key is not a list or
254  * error happened
255  * 举例:
256  * for example:
257  * 1) 当 start = 0, end = 10 时则指定从下标 0 开始至 10 的 11 个元素
258  * if start is 0 and end is 10, then the subscript range is
259  * between 0 and 10(include 10).
260  * 2) 当 start = -1, end = -2 时则指定从最后一个元素第倒数第二个共 2 个元素
261  * if start is -1 and end is -2, the range is from the end and
262  * backward the second element.
263  *
264  * 操作成功后可以通过以下任一方式获得数据
265  * the result can be got by one of the ways as below:
266  *
267  * 1、在调用方法中传入非空的存储结果对象的地址
268  * the most easily way is to set a non-NULL result parameter
269  * for this function
270  * 2、基类方法 get_value 获得指定下标的元素数据
271  * get the specified subscript's element by redis_command::get_value
272  * 3、基类方法 get_child 获得指定下标的元素对象(redis_result),然后再通过
273  * redis_result::argv_to_string 方法获得元素数据
274  * get redis_result object with the given subscript, and get the
275  * element by redis_result::argv_to_string
276  * 4、基类方法 get_result 方法取得总结果集对象 redis_result,然后再通过
277  * redis_result::get_child 获得一个元素对象,然后再通过方式 2 中指定
278  * 的方法获得该元素的数据
279  * get redis_result object by redis_command::get_result, and get
280  * the first element by redis_result::get_child, then get the
281  * element by the way same as the way 2 above.
282  * 5、基类方法 get_children 获得结果元素数组对象,再通过 redis_result 中
283  * 的方法 argv_to_string 从每一个元素对象中获得元素数据
284  * get child array by redis_command::get_children, and get the
285  * element from one of redis_result array by argv_to_string.
286  */
287  bool lrange(const char* key, int start, int end,
288  std::vector<string>* result);
289 
290  /**
291  * 根据元素值从列表对象中移除指定数量的元素
292  * remove the first count occurrences of elements equal to value
293  * from the list stored at key
294  * @param key {const char*} 列表对象的 key
295  * the key of a list
296  * @param count {int} 移除元素的数量限制,count 的含义如下:
297  * the first count of elements to be removed, as below:
298  * count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count
299  * remove elements equal to value moving from head to tail
300  * count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值
301  * remove elements equal to value moving from tail to head
302  * count = 0 : 移除表中所有与 value 相等的值
303  * remove all elements equal to value
304  * @param value {const char*} 指定的元素值,需要从列表对象中遍历所有与该值比较
305  * the specified value for removing elements
306  * @return {int} 被移除的对象数量,返回值含义如下:
307  * the count of elements removed, meaning show below:
308  * -1:出错或该 key 对象非列表对象
309  * error happened or the key is not refer to a list
310  * 0:key 不存在或移除的元素个数为 0
311  * the key does not exist or the count of elements removed is 0
312  * >0:被成功移除的元素数量
313  * the count of elements removed successfully
314  */
315  int lrem(const char* key, int count, const char* value);
316  int lrem(const char* key, int count, const char* value, size_t len);
317 
318  /**
319  * 将列表 key 下标为 idx 的元素的值设置为 value,当 idx 参数超出范围,或对
320  * 一个空列表( key 不存在)进行 lset 时,返回一个错误
321  * set the value of a element in a list by its index, if the index
322  * out of bounds or the key of list not exist, an error will happen.
323  * @param key {const char*} 列表对象的 key
324  * the key of list
325  * @param idx {int} 下标位置,当为负值时则从尾部向头尾部定位,否则采用顺序方式;
326  * 如:0 表示头部第一个元素,-1 表示尾部开始的第一个元素
327  * the index in the list, if it's negative, iterating data will be
328  * from tail to head, or be from head to tail.
329  * @param value {const char*} 元素新值
330  * the new value of the element by its index
331  * @return {bool} 当 key 非列表对象或 key 不存在或 idx 超出范围则返回 false
332  * if success. false if the object of the key isn't list, or key's
333  * list not exist, or the index out of bounds.
334  */
335  bool lset(const char* key, int idx, const char* value);
336  bool lset(const char* key, int idx, const char* value, size_t len);
337 
338  /**
339  * 对指定的列表对象,对一个列表进行修剪,让列表只保留指定区间内的元素,
340  * 不在指定区间之内的元素都将被删除;区间以偏移量 start 和 end 指定;
341  * 下标起始值从 0 开始,-1 表示最后一个下标值
342  * remove elements in a list by range betwwen start and end.
343  * @param key {const char*} 列表对象的 key
344  * the key of a list
345  * @param start {int} 起始下标值
346  * the start index in a list
347  * @param end {int} 结束下标值
348  * the end index in a list
349  * @return {bool} 操作是否成功,当返回 false 时表示出错或指定的 key 对象非
350  * 列表对象;当成功删除或 key 对象不存在时则返回 true
351  * if success. false if error happened, or the key's object is not
352  * a list, or the key's object not exist.
353  */
354  bool ltrim(const char* key, int start, int end);
355 
356  /**
357  * 从列表对象中移除并返回尾部元素
358  * remove and get the last element of a list
359  * @param key {const char*} 元素对象的 key
360  * the key of the list
361  * @param buf {string&} 存储弹出的元素值
362  * store the element pop from list
363  * @return {int} 返回值含义:>0 -- 表示成功弹出一个元素且返回值表示元素的长度,
364  * -1 -- 表示出错,或该对象非列表对象,或该对象已经为空
365  * return value as below:
366  * >0: get one element successfully and return the length of element
367  * -1: error happened, or the oject is not a list specified
368  * by the key, or the list specified by key is empty
369  */
370  int rpop(const char* key, string& buf);
371 
372  /**
373  * 在一个原子时间内,非阻塞方式执行以下两个动作:
374  * 将列表 src 中的最后一个元素(尾元素)弹出,并返回给客户端。
375  * 将 src 弹出的元素插入到列表 dst ,作为 dst 列表的的头元素
376  * remove the last element in a list, prepend it to another list
377  * and return it.
378  * @param src {const char*} 源列表对象 key
379  * the key of the source list
380  * @param dst {const char*} 目标列表对象 key
381  * the key of the destination list
382  * @param buf {string*} 非空时存储 src 的尾部元素 key 值
383  * if not NULL, it will store the element
384  * @return {bool} 当从 src 列表中成功弹出尾部元素并放入 dst 列表头部后
385  * 该方法返回 true;返回 false 出错或 src/dst 有一个非列表对象
386  * true if the element was removed from a list to another list,
387  * false if error happened, one of src or dst is not a list.
388  */
389  bool rpoplpush(const char* src, const char* dst, string* buf = NULL);
390 
391  /**
392  * 将一个或多个值元素插入到列表对象 key 的表尾
393  * append one or multiple values to a list
394  * @param key {const char*} 列表对象的 key
395  * the key of a list
396  * @param first_value {const char*} 第一个非空字符串,该变参的列表的最后一个
397  * 必须设为 NULL
398  * the first element of a variable args must be not NULL, and the
399  * last arg must be NULL indicating the end of the args.
400  * @return {int} 返回添加完后当前列表对象中的元素个数,返回 -1 表示出错或该 key
401  * 对象非列表对象,当该 key 不存在时会添加新的列表对象及对象中的元素
402  * return the number of a list specified by a key. -1 if error
403  * happened, or the key's object isn't a list, if the list by the
404  * key doese not exist, a new list will be created with the key.
405  */
406  int rpush(const char* key, const char* first_value, ...);
407  int rpush(const char* key, const char* values[], size_t argc);
408  int rpush(const char* key, const std::vector<string>& values);
409  int rpush(const char* key, const std::vector<const char*>& values);
410  int rpush(const char* key, const char* values[], const size_t lens[],
411  size_t argc);
412 
413  /**
414  * 将一个新的列表对象的元素添加至已经存在的指定列表对象的尾部,当该列表对象
415  * 不存在时则不添加
416  * append one or multiple values to a list only if the list exists.
417  * @param key {const char*} 列表对象的 key
418  * the key of a list
419  * @param value {const char*} 新加的列表对象的元素
420  * the new element to be added.
421  * @return {int} 返回当前列表对象的元素个数,含义如下:
422  * return the number of the list, as below:
423  * -1:出错,或该 key 非列表对象
424  * error happened, or the key's object isn't a list
425  * 0:该 key 对象不存在
426  * the key's object doesn't exist
427  * >0:添加完后当前列表对象中的元素个数
428  * the number of elements in the list after adding.
429  */
430  int rpushx(const char* key, const char* value);
431  int rpushx(const char* key, const char* value, size_t len);
432 
433 private:
434  int linsert(const char* key, const char* pos, const char* pivot,
435  size_t pivot_len, const char* value, size_t value_len);
436  int pushx(const char* cmd, const char* key,
437  const char* value, size_t len);
438  int pop(const char* cmd, const char* key, string& buf);
439  bool bpop(const char* cmd, const std::vector<const char*>& keys,
440  size_t timeout, std::pair<string, string>& result);
441  bool bpop(const char* cmd, const std::vector<string>& keys,
442  size_t timeout, std::pair<string, string>& result);
443  bool bpop(std::pair<string, string>& result);
444 };
445 
446 } // namespace acl
447 
448 #endif // !defined(ACL_CLIENT_ONLY) && !defined(ACL_REDIS_DISABLE)
#define ACL_CPP_DEPRECATED
Definition: atomic.hpp:86
#define ACL_CPP_API