acl  3.5.3.0
redis_pubsub.hpp
浏览该文件的文档.
1 #pragma once
2 #include "../acl_cpp_define.hpp"
3 #include <vector>
4 #include <map>
5 #include "redis_command.hpp"
6 
7 #if !defined(ACL_CLIENT_ONLY) && !defined(ACL_REDIS_DISABLE)
8 
9 namespace acl
10 {
11 
12 class ACL_CPP_API redis_pubsub : virtual public redis_command
13 {
14 public:
15  /**
16  * see redis_command::redis_command()
17  */
18  redis_pubsub(void);
19 
20  /**
21  * see redis_command::redis_command(redis_client*)
22  */
24 
25  /**
26  * see redis_command::redis_command(redis_client_cluster*)
27  */
29 
31  redis_pubsub(redis_client_cluster* cluster, size_t max_conns);
32 
34 
35  virtual ~redis_pubsub(void);
36 
37  /////////////////////////////////////////////////////////////////////
38 
39  /**
40  * 将信息发送到指定的频道 channel
41  * post a message to a channel
42  * @param channel {const char*} 所发送消息的目标频道
43  * the specified channel
44  * @param msg {const char*} 消息内容
45  * the message to be sent
46  * @param len {size_t} 消息长度
47  * the message's length
48  * @return {int} 成功发送至订阅该频道的订阅者数量
49  * the number of clients that received the message
50  * -1:表示出错
51  * error happened
52  * 0:没有订阅者
53  * no client subscribe the channel
54  * >0:订阅该频道的订阅者数量
55  * the number of clients that received the message
56  */
57  int publish(const char* channel, const char* msg, size_t len);
58 
59  /**
60  * 订阅给定的一个或多个频道的信息;在调用本函数后的操作只能发送的命令有:
61  * subscribe、unsubscribe、psubscribe、punsubscribe、get_message,只有
62  * 取消订阅了所有频道(或连接重建)后才摆脱该限制
63  * subscribe one or more channel(s). Once the client enters the
64  * subscribed state it is not supposed to issue any other commands,
65  * except for additional SUBSCRIBE, PSUBSCRIBE, UNSUBSCRIBE
66  * and PUNSUBSCRIBE commands
67  * @param first_channel {const char*} 所订阅的频道列表的第一个非空字符串
68  * 的频道,对于变参列表中的最后一个必须是 NULL
69  * the first non-NULL channel in the channel list, and the last
70  * parameter must be NULL indicating the end of the channel list
71  * @return {int} 返回当前已经成功订阅的频道个数(即所订阅的所有频道数量)
72  * the number of channels subscribed by the current client
73  */
74  int subscribe(const char* first_channel, ...);
75  int subscribe(const std::vector<const char*>& channels);
76  int subscribe(const std::vector<string>& channels);
77 
78  /**
79  * 取消订阅给定的一个或多个频道的信息
80  * stop listening for messages posted to the given channels
81  * @param first_channel {const char*} 所取消的所订阅频道列表的第一个频道
82  * the fist channel in channel list, and the last parameter must be
83  * NULL indicating the end of the channel list
84  * @return {int} 返回剩余的所订阅的频道的个数
85  * the rest channels listened by the current client
86  */
87  int unsubscribe(const char* first_channel, ...);
88  int unsubscribe(const std::vector<const char*>& channels);
89  int unsubscribe(const std::vector<string>& channels);
90 
91  /**
92  * 订阅一个或多个符合给定模式的频道;每个模式以 * 作为匹配符;在调用本函数后的操作
93  * 只能发送的命令有:subscribe、unsubscribe、psubscribe、punsubscribe、
94  * get_message,只有取消订阅了所有频道(或连接重建)后才摆脱该限制
95  * listen for messages published to channels matching the give patterns
96  * @param first_pattern {const char*} 第一个匹配模式串
97  * the first pattern in pattern list, the last parameter must be NULL
98  * int the variable args
99  * @return {int} 返回当前已经成功订阅的频道个数(即所订阅的所有频道数量)
100  * the number of channels listened by the current client
101  */
102  int psubscribe(const char* first_pattern, ...);
103  int psubscribe(const std::vector<const char*>& patterns);
104  int psubscribe(const std::vector<string>& patterns);
105 
106  /**
107  * 根据模式匹配串取消订阅给定的一个或多个频道的信息
108  * stop listening for messaged posted to channels matching
109  * the given patterns
110  * @param first_pattern {const char*} 第一个匹配模式串
111  * the first parttern in a variable args ending with NULL
112  * @return {int} 返回剩余的所订阅的频道的个数
113  * the rest number of channels be listened by the client
114  */
115  int punsubscribe(const char* first_pattern, ...);
116  int punsubscribe(const std::vector<const char*>& patterns);
117  int punsubscribe(const std::vector<string>& patterns);
118 
119  /**
120  * 在订阅频道后可以循环调用本函数从所订阅的频道中获取订阅消息;
121  * 在调用 subscribe 或 psubscribe 后才可调用本函数来获取所订阅的频道的消息
122  * get messages posted to channels after SUBSCRIBE or PSUBSCRIBE
123  * @param channel {string&} 存放当前有消息的频道名
124  * buffer for storing the channel associate with the msg
125  * @param msg {string&} 存放当前获得的消息内容
126  * store the message posted to the channel
127  * @param message_type {string*} will store messsage or pmessage
128  * @param pattern {string*} will store pattern set by psubscribe
129  * @param timeout {int} 当该值 >= 0 时,表示等待消息超时时间(秒)
130  * when timeout >= 0, which was used as the waiting time for reading(second)
131  * @return {bool} 是否成功,如果返回 false 则表示出错或超时
132  * true on success, false on error or waiting timeout
133  */
134  bool get_message(string& channel, string& msg, string* message_type = NULL,
135  string* pattern = NULL, int timeout = -1);
136 
137  /**
138  * 列出当前的活跃频道:活跃频道指的是那些至少有一个订阅者的频道, 订阅模式的
139  * 客户端不计算在内
140  * Lists the currently active channels.
141  * @param channels {std::vector<string>*} 非空时存放频道结果集
142  * store the active channels
143  * @param first_pattern {const char*} 作为附加的匹配模式第一个匹配字符串,
144  * 该指针可以为 NULL,此时获取指所有的活跃频道;对于变参而言最后一个参数需为 NULL
145  * the first pattern in a variable args ending with NULL arg, and
146  * the first arg can be NULL.
147  * @return {int} 返回活跃频道数; -1 表示出错
148  * the number of active channels. -1 if error
149  *
150  * 操作成功后可以通过以下任一方式获得数据
151  * 1、基类方法 get_value 获得指定下标的元素数据
152  * 2、基类方法 get_child 获得指定下标的元素对象(redis_result),然后再通过
153  * redis_result::argv_to_string 方法获得元素数据
154  * 3、基类方法 get_result 方法取得总结果集对象 redis_result,然后再通过
155  * redis_result::get_child 获得一个元素对象,然后再通过方式 2 中指定
156  * 的方法获得该元素的数据
157  * 4、基类方法 get_children 获得结果元素数组对象,再通过 redis_result 中
158  * 的方法 argv_to_string 从每一个元素对象中获得元素数据
159  * 5、在调用方法中传入非空的存储结果对象的地址
160  *
161  */
162  int pubsub_channels(std::vector<string>* channels,
163  const char* first_pattern, ...);
164  int pubsub_channels(const std::vector<const char*>& patterns,
165  std::vector<string>* channels);
166  int pubsub_channels(const std::vector<string>& patterns,
167  std::vector<string>* channels);
168 
169  /**
170  * 返回给定频道的订阅者数量, 订阅模式的客户端不计算在内
171  * Returns the number of subscribers (not counting clients
172  * subscribed to patterns) for the specified channels.
173  * @param out {std::map<string, int>&} 存储查询结果,其中 out->first 存放
174  * 频道名,out->second 在座该频道的订阅者数量
175  * store the results
176  * @param first_channel {const char*} 第一个频道
177  * 该指针可以为 NULL,此时获取指所有的活跃频道;对于变参而言最后一个参数需为 NULL
178  * the first pattern in a variable args ending with NULL arg, and
179  * the first arg can be NULL.
180  * @return {int} 频道的数量,-1 表示出错
181  */
182  int pubsub_numsub(std::map<string, int>& out,
183  const char* first_channel, ...);
184  int pubsub_numsub(const std::vector<const char*>& channels,
185  std::map<string, int>& out);
186  int pubsub_numsub(const std::vector<string>& channels,
187  std::map<string, int>& out);
188 
189  /**
190  * 返回订阅模式的数量,这个命令返回的不是订阅模式的客户端的数量, 而是客户端订阅的
191  * 所有模式的数量总和
192  * Returns the number of subscriptions to patterns.
193  * @return {int} 客户端所有订阅模式的总和,-1 表示出错
194  * the number of patterns all the clients are subscribed to,
195  * -1 if error.
196  */
197  int pubsub_numpat();
198 
199 private:
200  int subop(const char* cmd, const std::vector<const char*>& channels);
201  int subop_result(const char* cmd, const std::vector<const char*>& channels);
202  int subop(const char* cmd, const std::vector<string>& channels);
203  int subop_result(const char* cmd, const std::vector<string>& channels);
204  int check_channel(const redis_result* obj, const char* cmd,
205  const char* channel);
206  int pubsub_numsub(std::map<string, int>& out);
207 };
208 
209 } // namespace acl
210 
211 #endif // !defined(ACL_CLIENT_ONLY) && !defined(ACL_REDIS_DISABLE)
#define ACL_CPP_DEPRECATED
Definition: atomic.hpp:86
#define ACL_CPP_API