acl  3.5.3.0
redis_key.hpp
浏览该文件的文档.
1 #pragma once
2 #include "../acl_cpp_define.hpp"
3 #include <vector>
4 #include "../stdlib/string.hpp"
5 #include "redis_command.hpp"
6 
7 #if !defined(ACL_CLIENT_ONLY) && !defined(ACL_REDIS_DISABLE)
8 
9 namespace acl {
10 
11 // redis 服务支持的数据类型分类
12 // the data type supported by redis
13 typedef enum
14 {
15  REDIS_KEY_NONE, // none
16  REDIS_KEY_STRING, // string
17  REDIS_KEY_HASH, // hash
18  REDIS_KEY_LIST, // list
19  REDIS_KEY_SET, // set
20  REDIS_KEY_ZSET // sorted set
21 } redis_key_t;
22 
23 class ACL_CPP_API redis_key : virtual public redis_command
24 {
25 public:
26  /**
27  * see redis_command::redis_command()
28  */
29  redis_key(void);
30 
31  /**
32  * see redis_command::redis_command(redis_client*)
33  */
34  redis_key(redis_client* conn);
35 
36  /**
37  * see redis_command::redis_command(redis_client_cluster*)
38  */
40 
42  redis_key(redis_client_cluster* cluster, size_t max_conns);
43 
45 
46  virtual ~redis_key(void);
47 
48  /**
49  * 删除一个或一组 KEY,对于变参的接口,则要求最后一个参数必须以 NULL 结束
50  * delete one or some keys from redis, for deleting a variable
51  * number of keys, the last key must be NULL indicating the end
52  * of the variable args
53  * @return {int} 返回所删除的 KEY 的个数,如下:
54  * 0: 未删除任何 KEY
55  * -1: 出错
56  * >0: 真正删除的 KEY 的个数,该值有可能少于输入的 KEY 的个数
57  * return the number of keys been deleted, return value as below:
58  * 0: none key be deleted
59  * -1: error happened
60  * >0: the number of keys been deleted
61  *
62  */
63  int del_one(const char* key);
64  int del_one(const char* key, size_t len);
65  int del(const char* key);
66  int del(const std::vector<string>& keys);
67  int del(const std::vector<const char*>& keys);
68  int del(const char* keys[], size_t argc);
69  int del(const char* keys[], const size_t lens[], size_t argc);
70  int del_keys(const char* first_key, ...);
71  int del_keys(const std::vector<string>& keys);
72  int del_keys(const std::vector<const char*>& keys);
73  int del_keys(const char* keys[], size_t argc);
74  int del_keys(const char* keys[], const size_t lens[], size_t argc);
75 
76  /**
77  * 序列化给定 key ,并返回被序列化的值,使用 RESTORE 命令可以将这个值反序列化
78  * 为 Redis 键
79  * serialize the object associate with the given key, and get the
80  * value after serializing, RESTORE command can be used to
81  * deserialize by the value
82  * @param key {const char*} 键值
83  * the key
84  * @param len {size_t} key 长度
85  * the key's length
86  * @param out {string&} 存储序列化的二进制数据
87  * buffur used to store the result
88  * @return {int} 序列化后数据长度
89  * the length of the data after serializing
90  */
91  int dump(const char* key, size_t len, string& out);
92  int dump(const char* key, string& out);
93 
94  /**
95  * 判断 KEY 是否存在
96  * check if the key exists in redis
97  * @param key {const char*} KEY 值
98  * the key
99  * @param len {size_t} key 长度
100  * the key's length
101  * @return {bool} 返回 true 表示存在,否则表示出错或不存在
102  * true returned if key existing, false if error or not existing
103  */
104  bool exists(const char* key, size_t len);
105  bool exists(const char* key);
106 
107  /**
108  * 设置 KEY 的生存周期,单位(秒)
109  * set a key's time to live in seconds
110  * @param key {const char*} 键值
111  * the key
112  * @param len {size_t} key 长度
113  * the key's length
114  * @param n {int} 生存周期(秒)
115  * lief cycle in seconds
116  * @return {int} 返回值含义如下:
117  * return value as below:
118  * > 0: 成功设置了生存周期
119  * set successfully
120  * 0:该 key 不存在
121  * the key doesn't exist
122  * < 0: 出错
123  * error happened
124  */
125  int expire(const char* key, size_t len, int n);
126  int expire(const char* key, int n);
127 
128  /**
129  * 用 UNIX 时间截设置 KEY 的生存周期
130  * set the expiration for a key as a UNIX timestamp
131  * @param key {const char*} 对象键值
132  * the key
133  * @param len {size_t} key 长度
134  * the key's length
135  * @param stamp {time_t} UNIX 时间截,即自 1970 年以来的秒数
136  * an absolute Unix timestamp (seconds since January 1, 1970).
137  * @return {int} 返回值的含义:
138  * return value:
139  * 1: 设置成功
140  * the timeout was set
141  * 0: 该 key 不存在
142  * the key doesn't exist or the timeout couldn't be set
143  * -1: 出错
144  * error happened
145  */
146  int expireat(const char* key, size_t len, time_t stamp);
147  int expireat(const char* key, time_t stamp);
148 
149  /**
150  * 查找所有符合给定模式 pattern 的 key
151  * find all keys matching the given pattern
152  * @param pattern {const char*} 匹配模式
153  * the give matching pattern
154  * @param out {std::vector<string>*} 非 NULL 时用来存储结果集
155  * store the matched keys
156  * @return {int} 结果集的数量,0--为空,<0 -- 表示出错
157  * return the number of the matched keys, 0 if none, < 0 if error
158  * 匹配模式举例:
159  * KEYS * 匹配数据库中所有 key 。
160  * KEYS h?llo 匹配 hello , hallo 和 hxllo 等。
161  * KEYS h*llo 匹配 hllo 和 heeeeello 等。
162  * KEYS h[ae]llo 匹配 hello 和 hallo ,但不匹配 hillo 。
163  *
164  * 操作成功后可以通过以下任一方式获得数据
165  * 1、基类方法 get_value 获得指定下标的元素数据
166  * 2、基类方法 get_child 获得指定下标的元素对象(redis_result),然后
167  * 再通过 redis_result::argv_to_string 方法获得元素数据
168  * 3、基类方法 get_result 方法取得总结果集对象 redis_result,然后再
169  * 通过 redis_result::get_child 获得一个元素对象,然后再通过方式 2
170  * 中指定的方法获得该元素的数据
171  * 4、基类方法 get_children 获得结果元素数组对象,再通过 redis_result
172  * 中的方法 argv_to_string 从每一个元素对象中获得元素数据
173  * 5、在调用方法中传入非空的存储结果对象的地址
174  */
175  int keys_pattern(const char* pattern, std::vector<string>* out);
176 
177  /**
178  * 将数据从一个 redis-server 迁移至另一个 redis-server
179  * atomically transfer a key from a redis instance to another one
180  * @param key {const char*} 数据对应的键值
181  * the key
182  * @param len {size_t} key 长度
183  * the key's length
184  * @param addr {const char*} 目标 redis-server 服务器地址,格式:ip:port
185  * the destination redis instance's address, format: ip:port
186  * @param dest_db {unsigned} 目标 redis-server 服务器的数据库 ID 号
187  * the databases ID in destination redis
188  * @param timeout {unsigned} 迁移过程的超时时间(毫秒级)
189  * timeout(microseconds) in transfering
190  * @param option {const char*} COPY 或 REPLACE
191  * transfer option: COPY or REPLACE
192  * @return {bool} 迁移是否成功
193  * if transfering successfully
194  */
195  bool migrate(const char* key, size_t len, const char* addr,
196  unsigned dest_db, unsigned timeout, const char* option = NULL);
197  bool migrate(const char* key, const char* addr, unsigned dest_db,
198  unsigned timeout, const char* option = NULL);
199 
200  /**
201  * 将数据移至本 redis-server 中的另一个数据库中
202  * move a key to another database
203  * @param key {const char*} 数据键值
204  * the key
205  * @param len {size_t} key 长度
206  * the key's length
207  * @param dest_db {unsigned} 目标数据库 ID 号
208  * the destination database
209  * @return {int} 迁移是否成功。-1: 表示出错,0:迁移失败,因为目标数据库中存在
210  * 相同键值,1:迁移成功
211  * if moving succcessfully. -1 if error, 0 if moving failed because
212  * the same key already exists, 1 if successful
213  */
214  int move(const char* key, size_t len, unsigned dest_db);
215  int move(const char* key, unsigned dest_db);
216 
217  /**
218  * 返回给定 key 引用所储存的值的次数。此命令主要用于除错。
219  * get the referring count of the object, which just for debugging
220  * @param key {const char*} 数据键值
221  * the key
222  * @param len {size_t} key 长度
223  * the key's length
224  * @return {int} 返回 0 表示该 key 不存在;< 0 表示出错
225  * 0 if key not exists, < 0 if error
226  */
227  int object_refcount(const char* key, size_t len);
228  int object_refcount(const char* key);
229 
230  /**
231  * 返回给定 key 键储存的值所使用的内部表示
232  * get the internal storing of the object assosicate with the key
233  * @param key {const char*} 数据键值
234  * the key
235  * @param len {size_t} key 长度
236  * @param out {string&} 存在结果
237  * store the result
238  * @return {bool} 是否成功
239  * if successful
240  */
241  bool object_encoding(const char* key, size_t len, string& out);
242  bool object_encoding(const char* key, string& out);
243 
244  /**
245  * 返回给定 key 自储存以来的空闲时间(idle, 没有被读取也没有被写入),以秒为单位
246  * get the key's idle time in seconds since its first stored
247  * @param key {const char*} 数据键值
248  * the key
249  * @param len {size_t} key 长度
250  * the key's length
251  * @return {int} 返回值 < 0 表示出错
252  * 0 if error happened
253  */
254  int object_idletime(const char* key, size_t len);
255  int object_idletime(const char* key);
256 
257  /**
258  * 移除给定 key 的生存时间,将这个 key 从"易失的"(带生存时间 key )转换成
259  * "持久的"(一个不带生存时间、永不过期的 key )
260  * remove the expiration from a key
261  * @param key {const char*} 对象键值
262  * the key
263  * @param len {size_t} key 长度
264  * the key's length
265  * @return {int} 返回值的含义如下:
266  * the value returned as below:
267  * 1 -- 设置成功
268  * set ok
269  * 0 -- 该 key 不存在或未设置过期时间
270  * the key not exists or not be set expiration
271  * -1 -- 出错
272  * error happened
273  */
274  int persist(const char* key, size_t len);
275  int persist(const char* key);
276 
277  /**
278  * 设置 KEY 的生存周期,单位(毫秒)
279  * set a key's time to live in milliseconds
280  * @param key {const char*} 键值
281  * the key
282  * @param len {size_t} key 长度
283  * the key's length
284  * @param n {int} 生存周期(毫秒)
285  * time to live in milliseconds
286  * @return {int} 返回值含义如下:
287  * value returned as below:
288  * > 0: 成功设置了生存周期
289  * set successfully
290  * 0:该 key 不存在
291  * the key doesn't exist
292  * < 0: 出错
293  * error happened
294  */
295  int pexpire(const char* key, size_t len, int n);
296  int pexpire(const char* key, int n);
297 
298  /**
299  * 以毫秒为单位设置 key 的过期 unix 时间戳
300  * set the expiration for a key as UNIX timestamp specified
301  * in milliseconds
302  * @param key {const char*} 键值
303  * the key
304  * @param len {size_t} key 长度
305  * the key's length
306  * @param n {long long int} UNIX 时间截,即自 1970 年以来的毫秒数
307  * the UNIX timestamp in milliseconds from 1970.1.1
308  * @return {int} 返回值含义如下:
309  * value resturned as below:
310  * > 0: 成功设置了生存周期
311  * set successfully
312  * 0:该 key 不存在
313  * the key doesn't exist
314  * < 0: 出错
315  * error happened
316  */
317  int pexpireat(const char* key, size_t len, long long int n);
318  int pexpireat(const char* key, long long int n);
319 
320  /**
321  * 获得 KEY 的剩余生存周期,单位(毫秒)
322  * get the time to live for a key in milliseconds
323  * @param key {const char*} 键值
324  * the key
325  * @param len {size_t} key 长度
326  * the key's length
327  * @return {int} 返回对应键值的生存周期
328  * value returned as below:
329  * >0: 该 key 剩余的生存周期(毫秒)
330  * the time to live for a key in milliseconds
331  * -3:出错
332  * error happened
333  * -2:key 不存在
334  * the key doesn't exist
335  * -1:当 key 存在但没有设置剩余时间
336  * th key were not be set expiration
337  * 注:对于 redis-server 2.8 以前版本,key 不存在或存在但未设置生存期则返回 -1
338  * notice: for redis version before 2.8, -1 will be returned if the
339  * key doesn't exist or the key were not be set expiration.
340  */
341  long long int pttl(const char* key, size_t len);
342  long long int pttl(const char* key);
343 
344  /**
345  * 从当前数据库中随机返回(不会删除)一个 key
346  * return a random key from the keyspace
347  *@param buf {string&} 成功获得随机 KEY 时存储结果
348  * store the key
349  * @return {bool} 操作是否成功,当出错或 key 不存在时返回 false
350  * true on success, or false be returned
351  */
352  bool randomkey(string& buf);
353 
354  /**
355  * 将 key 改名为 newkey
356  * rename a key
357  * @return {bool}
358  * true on success, or error happened
359  */
360  bool rename_key(const char* key, const char* newkey);
361 
362  /**
363  * 当且仅当 newkey 不存在时,将 key 改名为 newkey
364  * rename a key only if the new key does not exist
365  * @param key {const char*} 旧 key
366  * @param newkey {const char*} 新 key
367  * @return {int} 返回值 > 0: 成功,0: 目标 key 存在,< 0:失败
368  * return value > 0 on success, < 0 on error, == 0 when newkey exists
369  */
370  int renamenx(const char* key, const char* newkey);
371 
372  /**
373  * 反序列化给定的序列化值,并将它和给定的 key 关联
374  * create a key using the provided serialized value, previously
375  * obtained by using DUMP
376  * @param ttl {int} 以毫秒为单位为 key 设置生存时间,如果 ttl 为 0,
377  * 那么不设置生存时间
378  * the time to live for the key in milliseconds, if tll is 0,
379  * expiration will not be set
380  * @param replace {bool} 如果 key 存在是否直接覆盖
381  * if the key already exists, this parameter decides if replacing
382  * the existing key
383  * @return {bool}
384  * true on success, false on error
385  */
386  bool restore(const char* key, const char* value, size_t len,
387  int ttl, bool replace = false);
388 
389  /**
390  * 获得 KEY 的剩余生存周期,单位(秒)
391  * get the time to live for a key in seconds
392  * @param key {const char*} 键值
393  * the key
394  * @param len {size_t} key 长度
395  * the key's length
396  * @return {int} 返回对应键值的生存周期
397  * return value as below:
398  * > 0: 该 key 剩余的生存周期(秒)
399  * the time to live for a key in seconds
400  * -3:出错
401  * error happened
402  * -2:key 不存在
403  * the key doesn't exist
404  * -1:当 key 存在但没有设置剩余时间
405  * the key were not be set expiration
406  * 注:对于 redis-server 2.8 以前版本,key 不存在或存在但未设置生存期则返回 -1
407  * notice: for the redis version before 2.8, -1 will be returned
408  * if the key doesn't exist or the key were not be set expiration
409  */
410  int ttl(const char* key, size_t len);;
411  int ttl(const char* key);
412 
413  /**
414  * 获得 KEY 的存储类型
415  * get the the type stored at key
416  * @para key {const char*} KEY 值
417  * the key
418  * @param len {size_t} key 长度
419  * the key's length
420  * @return {redis_key_t} 返回 KEY 的存储类型
421  * return redis_key_t defined above as REDIS_KEY_
422  */
423  redis_key_t type(const char* key, size_t len);
424  redis_key_t type(const char* key);
425 
426  /**
427  * 命令用于迭代当前数据库中的数据库键
428  * incrementally iterate the keys space in the specified database
429  * @param cursor {int} 游标值,开始遍历时该值写 0
430  * the iterating cursor beginning with 0
431  * @param out {std::vector<acl::string>&} 存储结果集,内部以追加方式将本次
432  * 遍历结果集合添加进该数组中,为防止因总结果集过大导致该数组溢出,用户可在
433  * 调用本函数前后清理该数组对象
434  * string array storing the results, the array will be cleared
435  * internal and the string result will be appened to the array
436  * @param pattern {const char*} 匹配模式,glob 风格,非空时有效
437  & the matching pattern with glob style, only effective if not NULL
438  * @param count {const size_t*} 限定的结果集数量,非空指针时有效
439  * limit the max number of the results stored in array, only
440  * effective when not NULL
441  * @return {int} 下一个游标位置,含义如下:
442  * return the next cursor value as follow:
443  * 0:遍历结束,当遍历结束时还需要检查 out 中的结果集是否为空,如果
444  * 不为空,则需要继续进行处理
445  * iterating is finished and the out should be checked if emtpy
446  * -1: 出错
447  * some error happened
448  * >0: 游标的下一个位置,即使这样,具体有多少结果还需要检查 out,因为有可能为空
449  * the next cursor value for iterating
450  */
451  int scan(int cursor, std::vector<string>& out,
452  const char* pattern = NULL, const size_t* count = NULL);
453 };
454 
455 } // namespace acl
456 
457 #endif // !defined(ACL_CLIENT_ONLY) && !defined(ACL_REDIS_DISABLE)
redis_key_t
Definition: redis_key.hpp:13
#define ACL_CPP_DEPRECATED
Definition: atomic.hpp:86
#define ACL_CPP_API