cpp_redis  4.0.0
cpp_redis is a C++11 Asynchronous Multi-Platform Lightweight Redis Client, with support for synchronous operations and pipelining.
client.hpp
1 // The MIT License (MIT)
2 //
3 // Copyright (c) 2015-2017 Simon Ninon <simon.ninon@gmail.com>
4 //
5 // Permission is hereby granted, free of charge, to any person obtaining a copy
6 // of this software and associated documentation files (the "Software"), to deal
7 // in the Software without restriction, including without limitation the rights
8 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 // copies of the Software, and to permit persons to whom the Software is
10 // furnished to do so, subject to the following conditions:
11 //
12 // The above copyright notice and this permission notice shall be included in all
13 // copies or substantial portions of the Software.
14 //
15 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 // SOFTWARE.
22 
23 #pragma once
24 
25 #include <atomic>
26 #include <condition_variable>
27 #include <functional>
28 #include <future>
29 #include <map>
30 #include <mutex>
31 #include <queue>
32 #include <string>
33 #include <vector>
34 
35 #include <cpp_redis/core/sentinel.hpp>
36 #include <cpp_redis/helpers/variadic_template.hpp>
37 #include <cpp_redis/misc/logger.hpp>
38 #include <cpp_redis/network/redis_connection.hpp>
39 #include <cpp_redis/network/tcp_client_iface.hpp>
40 
41 namespace cpp_redis {
42 
48 class client {
49 public:
54  enum class client_type {
55  normal,
56  master,
57  pubsub,
58  slave
59  };
60 
71  enum class connect_state {
72  dropped,
73  start,
74  sleeping,
75  ok,
76  failed,
77  lookup_failed,
78  stopped
79  };
80 
81 public:
82 #ifndef __CPP_REDIS_USE_CUSTOM_TCP_CLIENT
83  client(void);
85 #endif /* __CPP_REDIS_USE_CUSTOM_TCP_CLIENT */
86 
92  explicit client(const std::shared_ptr<network::tcp_client_iface>& tcp_client);
93 
95  ~client(void);
96 
98  client(const client&) = delete;
100  client& operator=(const client&) = delete;
101 
102 public:
106  typedef std::function<void(const std::string& host, std::size_t port, connect_state status)> connect_callback_t;
107 
118  void connect(
119  const std::string& host = "127.0.0.1",
120  std::size_t port = 6379,
121  const connect_callback_t& connect_callback = nullptr,
122  std::uint32_t timeout_msecs = 0,
123  std::int32_t max_reconnects = 0,
124  std::uint32_t reconnect_interval_msecs = 0);
125 
135  void connect(
136  const std::string& name,
137  const connect_callback_t& connect_callback = nullptr,
138  std::uint32_t timeout_msecs = 0,
139  std::int32_t max_reconnects = 0,
140  std::uint32_t reconnect_interval_msecs = 0);
141 
145  bool is_connected(void) const;
146 
152  void disconnect(bool wait_for_removal = false);
153 
157  bool is_reconnecting(void) const;
158 
162  void cancel_reconnect(void);
163 
164 public:
169  typedef std::function<void(reply&)> reply_callback_t;
170 
180  client& send(const std::vector<std::string>& redis_cmd, const reply_callback_t& callback);
181 
189  std::future<reply> send(const std::vector<std::string>& redis_cmd);
190 
199  client& commit(void);
200 
207  client& sync_commit(void);
208 
215  template <class Rep, class Period>
216  client&
217  sync_commit(const std::chrono::duration<Rep, Period>& timeout) {
220  if (!is_reconnecting()) {
221  try_commit();
222  }
223 
224  std::unique_lock<std::mutex> lock_callback(m_callbacks_mutex);
225  __CPP_REDIS_LOG(debug, "cpp_redis::client waiting for callbacks to complete");
226  if (!m_sync_condvar.wait_for(lock_callback, timeout, [=] { return m_callbacks_running == 0 && m_commands.empty(); })) {
227  __CPP_REDIS_LOG(debug, "cpp_redis::client finished waiting for callback");
228  }
229  else {
230  __CPP_REDIS_LOG(debug, "cpp_redis::client timed out waiting for callback");
231  }
232 
233  return *this;
234  }
235 
236 private:
240  bool should_reconnect(void) const;
241 
245  void resend_failed_commands(void);
246 
250  void sleep_before_next_reconnect_attempt(void);
251 
256  void reconnect(void);
257 
261  void re_auth(void);
262 
266  void re_select(void);
267 
268 private:
276  void unprotected_send(const std::vector<std::string>& redis_cmd, const reply_callback_t& callback);
277 
285  void unprotected_auth(const std::string& password, const reply_callback_t& reply_callback);
286 
294  void unprotected_select(int index, const reply_callback_t& reply_callback);
295 
296 public:
303  void add_sentinel(const std::string& host, std::size_t port);
304 
310  const sentinel& get_sentinel(void) const;
311 
318  sentinel& get_sentinel(void);
319 
323  void clear_sentinels(void);
324 
325 public:
331  enum class aggregate_method {
332  sum,
333  min,
334  max,
335  server_default
336  };
337 
344  std::string aggregate_method_to_string(aggregate_method method) const;
345 
346 public:
351  enum class geo_unit {
352  m,
353  km,
354  ft,
355  mi
356  };
357 
364  std::string geo_unit_to_string(geo_unit unit) const;
365 
366 public:
372  enum class overflow_type {
373  wrap,
374  sat,
375  fail,
376  server_default
377  };
378 
385  std::string overflow_type_to_string(overflow_type type) const;
386 
387 public:
393  get,
394  set,
395  incrby
396  };
397 
404  std::string
406 
407 public:
416 
420  std::string type;
421 
425  int offset;
426 
430  int value;
431 
436 
445  static bitfield_operation get(const std::string& type, int offset, overflow_type overflow = overflow_type::server_default);
446 
456  static bitfield_operation set(const std::string& type, int offset, int value, overflow_type overflow = overflow_type::server_default);
457 
467  static bitfield_operation incrby(const std::string& type, int offset, int increment, overflow_type overflow = overflow_type::server_default);
468  };
469 
470 public:
471  client&
472  append(const std::string& key, const std::string& value, const reply_callback_t& reply_callback);
473  std::future<reply> append(const std::string& key, const std::string& value);
474 
475  client& auth(const std::string& password, const reply_callback_t& reply_callback);
476  std::future<reply> auth(const std::string& password);
477 
478  client& bgrewriteaof(const reply_callback_t& reply_callback);
479  std::future<reply> bgrewriteaof();
480 
481  client& bgsave(const reply_callback_t& reply_callback);
482  std::future<reply> bgsave();
483 
484  client& bitcount(const std::string& key, const reply_callback_t& reply_callback);
485  std::future<reply> bitcount(const std::string& key);
486 
487  client& bitcount(const std::string& key, int start, int end, const reply_callback_t& reply_callback);
488  std::future<reply> bitcount(const std::string& key, int start, int end);
489 
490  client& bitfield(const std::string& key, const std::vector<bitfield_operation>& operations, const reply_callback_t& reply_callback);
491  std::future<reply> bitfield(const std::string& key, const std::vector<bitfield_operation>& operations);
492 
493  client& bitop(const std::string& operation, const std::string& destkey, const std::vector<std::string>& keys, const reply_callback_t& reply_callback);
494  std::future<reply> bitop(const std::string& operation, const std::string& destkey, const std::vector<std::string>& keys);
495 
496  client& bitpos(const std::string& key, int bit, const reply_callback_t& reply_callback);
497  std::future<reply> bitpos(const std::string& key, int bit);
498 
499  client& bitpos(const std::string& key, int bit, int start, const reply_callback_t& reply_callback);
500  std::future<reply> bitpos(const std::string& key, int bit, int start);
501 
502  client& bitpos(const std::string& key, int bit, int start, int end, const reply_callback_t& reply_callback);
503  std::future<reply> bitpos(const std::string& key, int bit, int start, int end);
504 
505  client& blpop(const std::vector<std::string>& keys, int timeout, const reply_callback_t& reply_callback);
506  std::future<reply> blpop(const std::vector<std::string>& keys, int timeout);
507 
508  client& brpop(const std::vector<std::string>& keys, int timeout, const reply_callback_t& reply_callback);
509  std::future<reply> brpop(const std::vector<std::string>& keys, int timeout);
510 
511  client& brpoplpush(const std::string& src, const std::string& dst, int timeout, const reply_callback_t& reply_callback);
512  std::future<reply> brpoplpush(const std::string& src, const std::string& dst, int timeout);
513 
514  template <typename T, typename... Ts>
515  client& client_kill(const std::string& host, int port, const T& arg, const Ts&... args);
516  client& client_kill(const std::string& host, int port);
517  template <typename... Ts>
518  client& client_kill(const char* host, int port, const Ts&... args);
519  template <typename T, typename... Ts>
520  client& client_kill(const T&, const Ts&...);
521  template <typename T, typename... Ts>
522  std::future<reply> client_kill_future(const T, const Ts...);
523 
524  client& client_list(const reply_callback_t& reply_callback);
525  std::future<reply> client_list();
526 
527  client& client_getname(const reply_callback_t& reply_callback);
528  std::future<reply> client_getname();
529 
530  client& client_pause(int timeout, const reply_callback_t& reply_callback);
531  std::future<reply> client_pause(int timeout);
532 
533  client& client_reply(const std::string& mode, const reply_callback_t& reply_callback);
534  std::future<reply> client_reply(const std::string& mode);
535 
536  client& client_setname(const std::string& name, const reply_callback_t& reply_callback);
537  std::future<reply> client_setname(const std::string& name);
538 
539  client& cluster_addslots(const std::vector<std::string>& p_slots, const reply_callback_t& reply_callback);
540  std::future<reply> cluster_addslots(const std::vector<std::string>& p_slots);
541 
542  client& cluster_count_failure_reports(const std::string& node_id, const reply_callback_t& reply_callback);
543  std::future<reply> cluster_count_failure_reports(const std::string& node_id);
544 
545  client& cluster_countkeysinslot(const std::string& slot, const reply_callback_t& reply_callback);
546  std::future<reply> cluster_countkeysinslot(const std::string& slot);
547 
548  client& cluster_delslots(const std::vector<std::string>& p_slots, const reply_callback_t& reply_callback);
549  std::future<reply> cluster_delslots(const std::vector<std::string>& p_slots);
550 
551  client& cluster_failover(const reply_callback_t& reply_callback);
552  std::future<reply> cluster_failover();
553 
554  client& cluster_failover(const std::string& mode, const reply_callback_t& reply_callback);
555  std::future<reply> cluster_failover(const std::string& mode);
556 
557  client& cluster_forget(const std::string& node_id, const reply_callback_t& reply_callback);
558  std::future<reply> cluster_forget(const std::string& node_id);
559 
560  client& cluster_getkeysinslot(const std::string& slot, int count, const reply_callback_t& reply_callback);
561  std::future<reply> cluster_getkeysinslot(const std::string& slot, int count);
562 
563  client& cluster_info(const reply_callback_t& reply_callback);
564  std::future<reply> cluster_info();
565 
566  client& cluster_keyslot(const std::string& key, const reply_callback_t& reply_callback);
567  std::future<reply> cluster_keyslot(const std::string& key);
568 
569  client& cluster_meet(const std::string& ip, int port, const reply_callback_t& reply_callback);
570  std::future<reply> cluster_meet(const std::string& ip, int port);
571 
572  client& cluster_nodes(const reply_callback_t& reply_callback);
573  std::future<reply> cluster_nodes();
574 
575  client& cluster_replicate(const std::string& node_id, const reply_callback_t& reply_callback);
576  std::future<reply> cluster_replicate(const std::string& node_id);
577 
578  client& cluster_reset(const reply_callback_t& reply_callback);
579  client& cluster_reset(const std::string& mode, const reply_callback_t& reply_callback);
580  std::future<reply> cluster_reset(const std::string& mode = "soft");
581 
582  client& cluster_saveconfig(const reply_callback_t& reply_callback);
583  std::future<reply> cluster_saveconfig();
584 
585  client& cluster_set_config_epoch(const std::string& epoch, const reply_callback_t& reply_callback);
586  std::future<reply> cluster_set_config_epoch(const std::string& epoch);
587 
588  client& cluster_setslot(const std::string& slot, const std::string& mode, const reply_callback_t& reply_callback);
589  std::future<reply> cluster_setslot(const std::string& slot, const std::string& mode);
590 
591  client& cluster_setslot(const std::string& slot, const std::string& mode, const std::string& node_id, const reply_callback_t& reply_callback);
592  std::future<reply> cluster_setslot(const std::string& slot, const std::string& mode, const std::string& node_id);
593 
594  client& cluster_slaves(const std::string& node_id, const reply_callback_t& reply_callback);
595  std::future<reply> cluster_slaves(const std::string& node_id);
596 
597  client& cluster_slots(const reply_callback_t& reply_callback);
598  std::future<reply> cluster_slots();
599 
600  client& command(const reply_callback_t& reply_callback);
601  std::future<reply> command();
602 
603  client& command_count(const reply_callback_t& reply_callback);
604  std::future<reply> command_count();
605 
606  client& command_getkeys(const reply_callback_t& reply_callback);
607  std::future<reply> command_getkeys();
608 
609  client& command_info(const std::vector<std::string>& command_name, const reply_callback_t& reply_callback);
610  std::future<reply> command_info(const std::vector<std::string>& command_name);
611 
612  client& config_get(const std::string& param, const reply_callback_t& reply_callback);
613  std::future<reply> config_get(const std::string& param);
614 
615  client& config_rewrite(const reply_callback_t& reply_callback);
616  std::future<reply> config_rewrite();
617 
618  client& config_set(const std::string& param, const std::string& val, const reply_callback_t& reply_callback);
619  std::future<reply> config_set(const std::string& param, const std::string& val);
620 
621  client& config_resetstat(const reply_callback_t& reply_callback);
622  std::future<reply> config_resetstat();
623 
624  client& dbsize(const reply_callback_t& reply_callback);
625  std::future<reply> dbsize();
626 
627  client& debug_object(const std::string& key, const reply_callback_t& reply_callback);
628  std::future<reply> debug_object(const std::string& key);
629 
630  client& debug_segfault(const reply_callback_t& reply_callback);
631  std::future<reply> debug_segfault();
632 
633  client& decr(const std::string& key, const reply_callback_t& reply_callback);
634  std::future<reply> decr(const std::string& key);
635 
636  client& decrby(const std::string& key, int val, const reply_callback_t& reply_callback);
637  std::future<reply> decrby(const std::string& key, int val);
638 
639  client& del(const std::vector<std::string>& key, const reply_callback_t& reply_callback);
640  std::future<reply> del(const std::vector<std::string>& key);
641 
642  client& discard(const reply_callback_t& reply_callback);
643  std::future<reply> discard();
644 
645  client& dump(const std::string& key, const reply_callback_t& reply_callback);
646  std::future<reply> dump(const std::string& key);
647 
648  client& echo(const std::string& msg, const reply_callback_t& reply_callback);
649  std::future<reply> echo(const std::string& msg);
650 
651  client& eval(const std::string& script, int numkeys, const std::vector<std::string>& keys, const std::vector<std::string>& args, const reply_callback_t& reply_callback);
652  std::future<reply> eval(const std::string& script, int numkeys, const std::vector<std::string>& keys, const std::vector<std::string>& args);
653 
654  client& evalsha(const std::string& sha1, int numkeys, const std::vector<std::string>& keys, const std::vector<std::string>& args, const reply_callback_t& reply_callback);
655  std::future<reply> evalsha(const std::string& sha1, int numkeys, const std::vector<std::string>& keys, const std::vector<std::string>& args);
656 
657  client& exec(const reply_callback_t& reply_callback);
658  std::future<reply> exec();
659 
660  client& exists(const std::vector<std::string>& keys, const reply_callback_t& reply_callback);
661  std::future<reply> exists(const std::vector<std::string>& keys);
662 
663  client& expire(const std::string& key, int seconds, const reply_callback_t& reply_callback);
664  std::future<reply> expire(const std::string& key, int seconds);
665 
666  client& expireat(const std::string& key, int timestamp, const reply_callback_t& reply_callback);
667  std::future<reply> expireat(const std::string& key, int timestamp);
668 
669  client& flushall(const reply_callback_t& reply_callback);
670  std::future<reply> flushall();
671 
672  client& flushdb(const reply_callback_t& reply_callback);
673  std::future<reply> flushdb();
674 
675  client& geoadd(const std::string& key, const std::vector<std::tuple<std::string, std::string, std::string>>& long_lat_memb, const reply_callback_t& reply_callback);
676  std::future<reply> geoadd(const std::string& key, const std::vector<std::tuple<std::string, std::string, std::string>>& long_lat_memb);
677 
678  client& geohash(const std::string& key, const std::vector<std::string>& members, const reply_callback_t& reply_callback);
679  std::future<reply> geohash(const std::string& key, const std::vector<std::string>& members);
680 
681  client& geopos(const std::string& key, const std::vector<std::string>& members, const reply_callback_t& reply_callback);
682  std::future<reply> geopos(const std::string& key, const std::vector<std::string>& members);
683 
684  client& geodist(const std::string& key, const std::string& member_1, const std::string& member_2, const reply_callback_t& reply_callback);
685  client& geodist(const std::string& key, const std::string& member_1, const std::string& member_2, const std::string& unit, const reply_callback_t& reply_callback);
686  std::future<reply> geodist(const std::string& key, const std::string& member_1, const std::string& member_2, const std::string& unit = "m");
687 
688  client& georadius(const std::string& key, double longitude, double latitude, double radius, geo_unit unit, bool with_coord, bool with_dist, bool with_hash, bool asc_order, const reply_callback_t& reply_callback);
689  client& georadius(const std::string& key, double longitude, double latitude, double radius, geo_unit unit, bool with_coord, bool with_dist, bool with_hash, bool asc_order, std::size_t count, const reply_callback_t& reply_callback);
690  client& georadius(const std::string& key, double longitude, double latitude, double radius, geo_unit unit, bool with_coord, bool with_dist, bool with_hash, bool asc_order, const std::string& store_key, const reply_callback_t& reply_callback);
691  client& georadius(const std::string& key, double longitude, double latitude, double radius, geo_unit unit, bool with_coord, bool with_dist, bool with_hash, bool asc_order, const std::string& store_key, const std::string& storedist_key, const reply_callback_t& reply_callback);
692  client& georadius(const std::string& key, double longitude, double latitude, double radius, geo_unit unit, bool with_coord, bool with_dist, bool with_hash, bool asc_order, std::size_t count, const std::string& store_key, const reply_callback_t& reply_callback);
693  client& georadius(const std::string& key, double longitude, double latitude, double radius, geo_unit unit, bool with_coord, bool with_dist, bool with_hash, bool asc_order, std::size_t count, const std::string& store_key, const std::string& storedist_key, const reply_callback_t& reply_callback);
694  std::future<reply> georadius(const std::string& key, double longitude, double latitude, double radius, geo_unit unit, bool with_coord = false, bool with_dist = false, bool with_hash = false, bool asc_order = false, std::size_t count = 0, const std::string& store_key = "", const std::string& storedist_key = "");
695 
696  client& georadiusbymember(const std::string& key, const std::string& member, double radius, geo_unit unit, bool with_coord, bool with_dist, bool with_hash, bool asc_order, const reply_callback_t& reply_callback);
697  client& georadiusbymember(const std::string& key, const std::string& member, double radius, geo_unit unit, bool with_coord, bool with_dist, bool with_hash, bool asc_order, std::size_t count, const reply_callback_t& reply_callback);
698  client& georadiusbymember(const std::string& key, const std::string& member, double radius, geo_unit unit, bool with_coord, bool with_dist, bool with_hash, bool asc_order, const std::string& store_key, const reply_callback_t& reply_callback);
699  client& georadiusbymember(const std::string& key, const std::string& member, double radius, geo_unit unit, bool with_coord, bool with_dist, bool with_hash, bool asc_order, const std::string& store_key, const std::string& storedist_key, const reply_callback_t& reply_callback);
700  client& georadiusbymember(const std::string& key, const std::string& member, double radius, geo_unit unit, bool with_coord, bool with_dist, bool with_hash, bool asc_order, std::size_t count, const std::string& store_key, const reply_callback_t& reply_callback);
701  client& georadiusbymember(const std::string& key, const std::string& member, double radius, geo_unit unit, bool with_coord, bool with_dist, bool with_hash, bool asc_order, std::size_t count, const std::string& store_key, const std::string& storedist_key, const reply_callback_t& reply_callback);
702  std::future<reply> georadiusbymember(const std::string& key, const std::string& member, double radius, geo_unit unit, bool with_coord = false, bool with_dist = false, bool with_hash = false, bool asc_order = false, std::size_t count = 0, const std::string& store_key = "", const std::string& storedist_key = "");
703 
704  client& get(const std::string& key, const reply_callback_t& reply_callback);
705  std::future<reply> get(const std::string& key);
706 
707  client& getbit(const std::string& key, int offset, const reply_callback_t& reply_callback);
708  std::future<reply> getbit(const std::string& key, int offset);
709 
710  client& getrange(const std::string& key, int start, int end, const reply_callback_t& reply_callback);
711  std::future<reply> getrange(const std::string& key, int start, int end);
712 
713  client& getset(const std::string& key, const std::string& val, const reply_callback_t& reply_callback);
714  std::future<reply> getset(const std::string& key, const std::string& val);
715 
716  client& hdel(const std::string& key, const std::vector<std::string>& fields, const reply_callback_t& reply_callback);
717  std::future<reply> hdel(const std::string& key, const std::vector<std::string>& fields);
718 
719  client& hexists(const std::string& key, const std::string& field, const reply_callback_t& reply_callback);
720  std::future<reply> hexists(const std::string& key, const std::string& field);
721 
722  client& hget(const std::string& key, const std::string& field, const reply_callback_t& reply_callback);
723  std::future<reply> hget(const std::string& key, const std::string& field);
724 
725  client& hgetall(const std::string& key, const reply_callback_t& reply_callback);
726  std::future<reply> hgetall(const std::string& key);
727 
728  client& hincrby(const std::string& key, const std::string& field, int incr, const reply_callback_t& reply_callback);
729  std::future<reply> hincrby(const std::string& key, const std::string& field, int incr);
730 
731  client& hincrbyfloat(const std::string& key, const std::string& field, float incr, const reply_callback_t& reply_callback);
732  std::future<reply> hincrbyfloat(const std::string& key, const std::string& field, float incr);
733 
734  client& hkeys(const std::string& key, const reply_callback_t& reply_callback);
735  std::future<reply> hkeys(const std::string& key);
736 
737  client& hlen(const std::string& key, const reply_callback_t& reply_callback);
738  std::future<reply> hlen(const std::string& key);
739 
740  client& hmget(const std::string& key, const std::vector<std::string>& fields, const reply_callback_t& reply_callback);
741  std::future<reply> hmget(const std::string& key, const std::vector<std::string>& fields);
742 
743  client& hmset(const std::string& key, const std::vector<std::pair<std::string, std::string>>& field_val, const reply_callback_t& reply_callback);
744  std::future<reply> hmset(const std::string& key, const std::vector<std::pair<std::string, std::string>>& field_val);
745 
746  client& hscan(const std::string& key, std::size_t cursor, const reply_callback_t& reply_callback);
747  std::future<reply> hscan(const std::string& key, std::size_t cursor);
748 
749  client& hscan(const std::string& key, std::size_t cursor, const std::string& pattern, const reply_callback_t& reply_callback);
750  std::future<reply> hscan(const std::string& key, std::size_t cursor, const std::string& pattern);
751 
752  client& hscan(const std::string& key, std::size_t cursor, std::size_t count, const reply_callback_t& reply_callback);
753  std::future<reply> hscan(const std::string& key, std::size_t cursor, std::size_t count);
754 
755  client& hscan(const std::string& key, std::size_t cursor, const std::string& pattern, std::size_t count, const reply_callback_t& reply_callback);
756  std::future<reply> hscan(const std::string& key, std::size_t cursor, const std::string& pattern, std::size_t count);
757 
758  client& hset(const std::string& key, const std::string& field, const std::string& value, const reply_callback_t& reply_callback);
759  std::future<reply> hset(const std::string& key, const std::string& field, const std::string& value);
760 
761  client& hsetnx(const std::string& key, const std::string& field, const std::string& value, const reply_callback_t& reply_callback);
762  std::future<reply> hsetnx(const std::string& key, const std::string& field, const std::string& value);
763 
764  client& hstrlen(const std::string& key, const std::string& field, const reply_callback_t& reply_callback);
765  std::future<reply> hstrlen(const std::string& key, const std::string& field);
766 
767  client& hvals(const std::string& key, const reply_callback_t& reply_callback);
768  std::future<reply> hvals(const std::string& key);
769 
770  client& incr(const std::string& key, const reply_callback_t& reply_callback);
771  std::future<reply> incr(const std::string& key);
772 
773  client& incrby(const std::string& key, int incr, const reply_callback_t& reply_callback);
774  std::future<reply> incrby(const std::string& key, int incr);
775 
776  client& incrbyfloat(const std::string& key, float incr, const reply_callback_t& reply_callback);
777  std::future<reply> incrbyfloat(const std::string& key, float incr);
778 
779  client& info(const reply_callback_t& reply_callback);
780  client& info(const std::string& section, const reply_callback_t& reply_callback);
781  std::future<reply> info(const std::string& section = "default");
782 
783  client& keys(const std::string& pattern, const reply_callback_t& reply_callback);
784  std::future<reply> keys(const std::string& pattern);
785 
786  client& lastsave(const reply_callback_t& reply_callback);
787  std::future<reply> lastsave();
788 
789  client& lindex(const std::string& key, int index, const reply_callback_t& reply_callback);
790  std::future<reply> lindex(const std::string& key, int index);
791 
792  client& linsert(const std::string& key, const std::string& before_after, const std::string& pivot, const std::string& value, const reply_callback_t& reply_callback);
793  std::future<reply> linsert(const std::string& key, const std::string& before_after, const std::string& pivot, const std::string& value);
794 
795  client& llen(const std::string& key, const reply_callback_t& reply_callback);
796  std::future<reply> llen(const std::string& key);
797 
798  client& lpop(const std::string& key, const reply_callback_t& reply_callback);
799  std::future<reply> lpop(const std::string& key);
800 
801  client& lpush(const std::string& key, const std::vector<std::string>& values, const reply_callback_t& reply_callback);
802  std::future<reply> lpush(const std::string& key, const std::vector<std::string>& values);
803 
804  client& lpushx(const std::string& key, const std::string& value, const reply_callback_t& reply_callback);
805  std::future<reply> lpushx(const std::string& key, const std::string& value);
806 
807  client& lrange(const std::string& key, int start, int stop, const reply_callback_t& reply_callback);
808  std::future<reply> lrange(const std::string& key, int start, int stop);
809 
810  client& lrem(const std::string& key, int count, const std::string& value, const reply_callback_t& reply_callback);
811  std::future<reply> lrem(const std::string& key, int count, const std::string& value);
812 
813  client& lset(const std::string& key, int index, const std::string& value, const reply_callback_t& reply_callback);
814  std::future<reply> lset(const std::string& key, int index, const std::string& value);
815 
816  client& ltrim(const std::string& key, int start, int stop, const reply_callback_t& reply_callback);
817  std::future<reply> ltrim(const std::string& key, int start, int stop);
818 
819  client& mget(const std::vector<std::string>& keys, const reply_callback_t& reply_callback);
820  std::future<reply> mget(const std::vector<std::string>& keys);
821 
822  client& migrate(const std::string& host, int port, const std::string& key, const std::string& dest_db, int timeout, const reply_callback_t& reply_callback);
823  client& migrate(const std::string& host, int port, const std::string& key, const std::string& dest_db, int timeout, bool copy, bool replace, const std::vector<std::string>& keys, const reply_callback_t& reply_callback);
824  std::future<reply> migrate(const std::string& host, int port, const std::string& key, const std::string& dest_db, int timeout, bool copy = false, bool replace = false, const std::vector<std::string>& keys = {});
825 
826  client& monitor(const reply_callback_t& reply_callback);
827  std::future<reply> monitor();
828 
829  client& move(const std::string& key, const std::string& db, const reply_callback_t& reply_callback);
830  std::future<reply> move(const std::string& key, const std::string& db);
831 
832  client& mset(const std::vector<std::pair<std::string, std::string>>& key_vals, const reply_callback_t& reply_callback);
833  std::future<reply> mset(const std::vector<std::pair<std::string, std::string>>& key_vals);
834 
835  client& msetnx(const std::vector<std::pair<std::string, std::string>>& key_vals, const reply_callback_t& reply_callback);
836  std::future<reply> msetnx(const std::vector<std::pair<std::string, std::string>>& key_vals);
837 
838  client& multi(const reply_callback_t& reply_callback);
839  std::future<reply> multi();
840 
841  client& object(const std::string& subcommand, const std::vector<std::string>& args, const reply_callback_t& reply_callback);
842  std::future<reply> object(const std::string& subcommand, const std::vector<std::string>& args);
843 
844  client& persist(const std::string& key, const reply_callback_t& reply_callback);
845  std::future<reply> persist(const std::string& key);
846 
847  client& pexpire(const std::string& key, int milliseconds, const reply_callback_t& reply_callback);
848  std::future<reply> pexpire(const std::string& key, int milliseconds);
849 
850  client& pexpireat(const std::string& key, int milliseconds_timestamp, const reply_callback_t& reply_callback);
851  std::future<reply> pexpireat(const std::string& key, int milliseconds_timestamp);
852 
853  client& pfadd(const std::string& key, const std::vector<std::string>& elements, const reply_callback_t& reply_callback);
854  std::future<reply> pfadd(const std::string& key, const std::vector<std::string>& elements);
855 
856  client& pfcount(const std::vector<std::string>& keys, const reply_callback_t& reply_callback);
857  std::future<reply> pfcount(const std::vector<std::string>& keys);
858 
859  client& pfmerge(const std::string& destkey, const std::vector<std::string>& sourcekeys, const reply_callback_t& reply_callback);
860  std::future<reply> pfmerge(const std::string& destkey, const std::vector<std::string>& sourcekeys);
861 
862  client& ping(const reply_callback_t& reply_callback);
863  std::future<reply> ping();
864 
865  client& ping(const std::string& message, const reply_callback_t& reply_callback);
866  std::future<reply> ping(const std::string& message);
867 
868  client& psetex(const std::string& key, int milliseconds, const std::string& val, const reply_callback_t& reply_callback);
869  std::future<reply> psetex(const std::string& key, int milliseconds, const std::string& val);
870 
871  client& publish(const std::string& channel, const std::string& message, const reply_callback_t& reply_callback);
872  std::future<reply> publish(const std::string& channel, const std::string& message);
873 
874  client& pubsub(const std::string& subcommand, const std::vector<std::string>& args, const reply_callback_t& reply_callback);
875  std::future<reply> pubsub(const std::string& subcommand, const std::vector<std::string>& args);
876 
877  client& pttl(const std::string& key, const reply_callback_t& reply_callback);
878  std::future<reply> pttl(const std::string& key);
879 
880  client& quit(const reply_callback_t& reply_callback);
881  std::future<reply> quit();
882 
883  client& randomkey(const reply_callback_t& reply_callback);
884  std::future<reply> randomkey();
885 
886  client& readonly(const reply_callback_t& reply_callback);
887  std::future<reply> readonly();
888 
889  client& readwrite(const reply_callback_t& reply_callback);
890  std::future<reply> readwrite();
891 
892  client& rename(const std::string& key, const std::string& newkey, const reply_callback_t& reply_callback);
893  std::future<reply> rename(const std::string& key, const std::string& newkey);
894 
895  client& renamenx(const std::string& key, const std::string& newkey, const reply_callback_t& reply_callback);
896  std::future<reply> renamenx(const std::string& key, const std::string& newkey);
897 
898  client& restore(const std::string& key, int ttl, const std::string& serialized_value, const reply_callback_t& reply_callback);
899  std::future<reply> restore(const std::string& key, int ttl, const std::string& serialized_value);
900 
901  client& restore(const std::string& key, int ttl, const std::string& serialized_value, const std::string& replace, const reply_callback_t& reply_callback);
902  std::future<reply> restore(const std::string& key, int ttl, const std::string& serialized_value, const std::string& replace);
903 
904  client& role(const reply_callback_t& reply_callback);
905  std::future<reply> role();
906 
907  client& rpop(const std::string& key, const reply_callback_t& reply_callback);
908  std::future<reply> rpop(const std::string& key);
909 
910  client& rpoplpush(const std::string& source, const std::string& destination, const reply_callback_t& reply_callback);
911  std::future<reply> rpoplpush(const std::string& src, const std::string& dst);
912 
913  client& rpush(const std::string& key, const std::vector<std::string>& values, const reply_callback_t& reply_callback);
914  std::future<reply> rpush(const std::string& key, const std::vector<std::string>& values);
915 
916  client& rpushx(const std::string& key, const std::string& value, const reply_callback_t& reply_callback);
917  std::future<reply> rpushx(const std::string& key, const std::string& value);
918 
919  client& sadd(const std::string& key, const std::vector<std::string>& members, const reply_callback_t& reply_callback);
920  std::future<reply> sadd(const std::string& key, const std::vector<std::string>& members);
921 
922  client& save(const reply_callback_t& reply_callback);
923  std::future<reply> save();
924 
925  client& scan(std::size_t cursor, const reply_callback_t& reply_callback);
926  std::future<reply> scan(std::size_t cursor);
927 
928  client& scan(std::size_t cursor, const std::string& pattern, const reply_callback_t& reply_callback);
929  std::future<reply> scan(std::size_t cursor, const std::string& pattern);
930 
931  client& scan(std::size_t cursor, std::size_t count, const reply_callback_t& reply_callback);
932  std::future<reply> scan(std::size_t cursor, std::size_t count);
933 
934  client& scan(std::size_t cursor, const std::string& pattern, std::size_t count, const reply_callback_t& reply_callback);
935  std::future<reply> scan(std::size_t cursor, const std::string& pattern, std::size_t count);
936 
937  client& scard(const std::string& key, const reply_callback_t& reply_callback);
938  std::future<reply> scard(const std::string& key);
939 
940  client& script_debug(const std::string& mode, const reply_callback_t& reply_callback);
941  std::future<reply> script_debug(const std::string& mode);
942 
943  client& script_exists(const std::vector<std::string>& scripts, const reply_callback_t& reply_callback);
944  std::future<reply> script_exists(const std::vector<std::string>& scripts);
945 
946  client& script_flush(const reply_callback_t& reply_callback);
947  std::future<reply> script_flush();
948 
949  client& script_kill(const reply_callback_t& reply_callback);
950  std::future<reply> script_kill();
951 
952  client& script_load(const std::string& script, const reply_callback_t& reply_callback);
953  std::future<reply> script_load(const std::string& script);
954 
955  client& sdiff(const std::vector<std::string>& keys, const reply_callback_t& reply_callback);
956  std::future<reply> sdiff(const std::vector<std::string>& keys);
957 
958  client& sdiffstore(const std::string& destination, const std::vector<std::string>& keys, const reply_callback_t& reply_callback);
959  std::future<reply> sdiffstore(const std::string& dst, const std::vector<std::string>& keys);
960 
961  client& select(int index, const reply_callback_t& reply_callback);
962  std::future<reply> select(int index);
963 
964  client& set(const std::string& key, const std::string& value, const reply_callback_t& reply_callback);
965  std::future<reply> set(const std::string& key, const std::string& value);
966 
967  client& set_advanced(const std::string& key, const std::string& value, const reply_callback_t& reply_callback);
968  client& set_advanced(const std::string& key, const std::string& value, bool ex, int ex_sec, bool px, int px_milli, bool nx, bool xx, const reply_callback_t& reply_callback);
969  std::future<reply> set_advanced(const std::string& key, const std::string& value, bool ex = false, int ex_sec = 0, bool px = false, int px_milli = 0, bool nx = false, bool xx = false);
970 
971  client& setbit_(const std::string& key, int offset, const std::string& value, const reply_callback_t& reply_callback);
972  std::future<reply> setbit_(const std::string& key, int offset, const std::string& value);
973 
974  client& setex(const std::string& key, int seconds, const std::string& value, const reply_callback_t& reply_callback);
975  std::future<reply> setex(const std::string& key, int seconds, const std::string& value);
976 
977  client& setnx(const std::string& key, const std::string& value, const reply_callback_t& reply_callback);
978  std::future<reply> setnx(const std::string& key, const std::string& value);
979 
980  client& setrange(const std::string& key, int offset, const std::string& value, const reply_callback_t& reply_callback);
981  std::future<reply> setrange(const std::string& key, int offset, const std::string& value);
982 
983  client& shutdown(const reply_callback_t& reply_callback);
984  std::future<reply> shutdown();
985 
986  client& shutdown(const std::string& save, const reply_callback_t& reply_callback);
987  std::future<reply> shutdown(const std::string& save);
988 
989  client& sinter(const std::vector<std::string>& keys, const reply_callback_t& reply_callback);
990  std::future<reply> sinter(const std::vector<std::string>& keys);
991 
992  client& sinterstore(const std::string& destination, const std::vector<std::string>& keys, const reply_callback_t& reply_callback);
993  std::future<reply> sinterstore(const std::string& dst, const std::vector<std::string>& keys);
994 
995  client& sismember(const std::string& key, const std::string& member, const reply_callback_t& reply_callback);
996  std::future<reply> sismember(const std::string& key, const std::string& member);
997 
998  client& slaveof(const std::string& host, int port, const reply_callback_t& reply_callback);
999  std::future<reply> slaveof(const std::string& host, int port);
1000 
1001  client& slowlog(const std::string subcommand, const reply_callback_t& reply_callback);
1002  std::future<reply> slowlog(const std::string& subcommand);
1003 
1004  client& slowlog(const std::string subcommand, const std::string& argument, const reply_callback_t& reply_callback);
1005  std::future<reply> slowlog(const std::string& subcommand, const std::string& argument);
1006 
1007  client& smembers(const std::string& key, const reply_callback_t& reply_callback);
1008  std::future<reply> smembers(const std::string& key);
1009 
1010  client& smove(const std::string& source, const std::string& destination, const std::string& member, const reply_callback_t& reply_callback);
1011  std::future<reply> smove(const std::string& src, const std::string& dst, const std::string& member);
1012 
1013  client& sort(const std::string& key, const reply_callback_t& reply_callback);
1014  std::future<reply> sort(const std::string& key);
1015 
1016  client& sort(const std::string& key, const std::vector<std::string>& get_patterns, bool asc_order, bool alpha, const reply_callback_t& reply_callback);
1017  std::future<reply> sort(const std::string& key, const std::vector<std::string>& get_patterns, bool asc_order, bool alpha);
1018 
1019  client& sort(const std::string& key, std::size_t offset, std::size_t count, const std::vector<std::string>& get_patterns, bool asc_order, bool alpha, const reply_callback_t& reply_callback);
1020  std::future<reply> sort(const std::string& key, std::size_t offset, std::size_t count, const std::vector<std::string>& get_patterns, bool asc_order, bool alpha);
1021 
1022  client& sort(const std::string& key, const std::string& by_pattern, const std::vector<std::string>& get_patterns, bool asc_order, bool alpha, const reply_callback_t& reply_callback);
1023  std::future<reply> sort(const std::string& key, const std::string& by_pattern, const std::vector<std::string>& get_patterns, bool asc_order, bool alpha);
1024 
1025  client& sort(const std::string& key, const std::vector<std::string>& get_patterns, bool asc_order, bool alpha, const std::string& store_dest, const reply_callback_t& reply_callback);
1026  std::future<reply> sort(const std::string& key, const std::vector<std::string>& get_patterns, bool asc_order, bool alpha, const std::string& store_dest);
1027 
1028  client& sort(const std::string& key, std::size_t offset, std::size_t count, const std::vector<std::string>& get_patterns, bool asc_order, bool alpha, const std::string& store_dest, const reply_callback_t& reply_callback);
1029  std::future<reply> sort(const std::string& key, std::size_t offset, std::size_t count, const std::vector<std::string>& get_patterns, bool asc_order, bool alpha, const std::string& store_dest);
1030 
1031  client& sort(const std::string& key, const std::string& by_pattern, const std::vector<std::string>& get_patterns, bool asc_order, bool alpha, const std::string& store_dest, const reply_callback_t& reply_callback);
1032  std::future<reply> sort(const std::string& key, const std::string& by_pattern, const std::vector<std::string>& get_patterns, bool asc_order, bool alpha, const std::string& store_dest);
1033 
1034  client& sort(const std::string& key, const std::string& by_pattern, std::size_t offset, std::size_t count, const std::vector<std::string>& get_patterns, bool asc_order, bool alpha, const reply_callback_t& reply_callback);
1035  std::future<reply> sort(const std::string& key, const std::string& by_pattern, std::size_t offset, std::size_t count, const std::vector<std::string>& get_patterns, bool asc_order, bool alpha);
1036 
1037  client& sort(const std::string& key, const std::string& by_pattern, std::size_t offset, std::size_t count, const std::vector<std::string>& get_patterns, bool asc_order, bool alpha, const std::string& store_dest, const reply_callback_t& reply_callback);
1038  std::future<reply> sort(const std::string& key, const std::string& by_pattern, std::size_t offset, std::size_t count, const std::vector<std::string>& get_patterns, bool asc_order, bool alpha, const std::string& store_dest);
1039 
1040  client& spop(const std::string& key, const reply_callback_t& reply_callback);
1041  std::future<reply> spop(const std::string& key);
1042 
1043  client& spop(const std::string& key, int count, const reply_callback_t& reply_callback);
1044  std::future<reply> spop(const std::string& key, int count);
1045 
1046  client& srandmember(const std::string& key, const reply_callback_t& reply_callback);
1047  std::future<reply> srandmember(const std::string& key);
1048 
1049  client& srandmember(const std::string& key, int count, const reply_callback_t& reply_callback);
1050  std::future<reply> srandmember(const std::string& key, int count);
1051 
1052  client& srem(const std::string& key, const std::vector<std::string>& members, const reply_callback_t& reply_callback);
1053  std::future<reply> srem(const std::string& key, const std::vector<std::string>& members);
1054 
1055  client& sscan(const std::string& key, std::size_t cursor, const reply_callback_t& reply_callback);
1056  std::future<reply> sscan(const std::string& key, std::size_t cursor);
1057 
1058  client& sscan(const std::string& key, std::size_t cursor, const std::string& pattern, const reply_callback_t& reply_callback);
1059  std::future<reply> sscan(const std::string& key, std::size_t cursor, const std::string& pattern);
1060 
1061  client& sscan(const std::string& key, std::size_t cursor, std::size_t count, const reply_callback_t& reply_callback);
1062  std::future<reply> sscan(const std::string& key, std::size_t cursor, std::size_t count);
1063 
1064  client& sscan(const std::string& key, std::size_t cursor, const std::string& pattern, std::size_t count, const reply_callback_t& reply_callback);
1065  std::future<reply> sscan(const std::string& key, std::size_t cursor, const std::string& pattern, std::size_t count);
1066 
1067  client& strlen(const std::string& key, const reply_callback_t& reply_callback);
1068  std::future<reply> strlen(const std::string& key);
1069 
1070  client& sunion(const std::vector<std::string>& keys, const reply_callback_t& reply_callback);
1071  std::future<reply> sunion(const std::vector<std::string>& keys);
1072 
1073  client& sunionstore(const std::string& destination, const std::vector<std::string>& keys, const reply_callback_t& reply_callback);
1074  std::future<reply> sunionstore(const std::string& dst, const std::vector<std::string>& keys);
1075 
1076  client& sync(const reply_callback_t& reply_callback);
1077  std::future<reply> sync();
1078 
1079  client& time(const reply_callback_t& reply_callback);
1080  std::future<reply> time();
1081 
1082  client& ttl(const std::string& key, const reply_callback_t& reply_callback);
1083  std::future<reply> ttl(const std::string& key);
1084 
1085  client& type(const std::string& key, const reply_callback_t& reply_callback);
1086  std::future<reply> type(const std::string& key);
1087 
1088  client& unwatch(const reply_callback_t& reply_callback);
1089  std::future<reply> unwatch();
1090 
1091  client& wait(int numslaves, int timeout, const reply_callback_t& reply_callback);
1092  std::future<reply> wait(int numslaves, int timeout);
1093 
1094  client& watch(const std::vector<std::string>& keys, const reply_callback_t& reply_callback);
1095  std::future<reply> watch(const std::vector<std::string>& keys);
1096 
1097  client& zadd(const std::string& key, const std::vector<std::string>& options, const std::multimap<std::string, std::string>& score_members, const reply_callback_t& reply_callback);
1098  std::future<reply> zadd(const std::string& key, const std::vector<std::string>& options, const std::multimap<std::string, std::string>& score_members);
1099 
1100  client& zcard(const std::string& key, const reply_callback_t& reply_callback);
1101  std::future<reply> zcard(const std::string& key);
1102 
1103  client& zcount(const std::string& key, int min, int max, const reply_callback_t& reply_callback);
1104  std::future<reply> zcount(const std::string& key, int min, int max);
1105 
1106  client& zcount(const std::string& key, double min, double max, const reply_callback_t& reply_callback);
1107  std::future<reply> zcount(const std::string& key, double min, double max);
1108 
1109  client& zcount(const std::string& key, const std::string& min, const std::string& max, const reply_callback_t& reply_callback);
1110  std::future<reply> zcount(const std::string& key, const std::string& min, const std::string& max);
1111 
1112  client& zincrby(const std::string& key, int incr, const std::string& member, const reply_callback_t& reply_callback);
1113  std::future<reply> zincrby(const std::string& key, int incr, const std::string& member);
1114 
1115  client& zincrby(const std::string& key, double incr, const std::string& member, const reply_callback_t& reply_callback);
1116  std::future<reply> zincrby(const std::string& key, double incr, const std::string& member);
1117 
1118  client& zincrby(const std::string& key, const std::string& incr, const std::string& member, const reply_callback_t& reply_callback);
1119  std::future<reply> zincrby(const std::string& key, const std::string& incr, const std::string& member);
1120 
1121  client& zinterstore(const std::string& destination, std::size_t numkeys, const std::vector<std::string>& keys, const std::vector<std::size_t> weights, aggregate_method method, const reply_callback_t& reply_callback);
1122  std::future<reply> zinterstore(const std::string& destination, std::size_t numkeys, const std::vector<std::string>& keys, const std::vector<std::size_t> weights, aggregate_method method);
1123 
1124  client& zlexcount(const std::string& key, int min, int max, const reply_callback_t& reply_callback);
1125  std::future<reply> zlexcount(const std::string& key, int min, int max);
1126 
1127  client& zlexcount(const std::string& key, double min, double max, const reply_callback_t& reply_callback);
1128  std::future<reply> zlexcount(const std::string& key, double min, double max);
1129 
1130  client& zlexcount(const std::string& key, const std::string& min, const std::string& max, const reply_callback_t& reply_callback);
1131  std::future<reply> zlexcount(const std::string& key, const std::string& min, const std::string& max);
1132 
1133  client& zrange(const std::string& key, int start, int stop, const reply_callback_t& reply_callback);
1134  client& zrange(const std::string& key, int start, int stop, bool withscores, const reply_callback_t& reply_callback);
1135  std::future<reply> zrange(const std::string& key, int start, int stop, bool withscores = false);
1136 
1137  client& zrange(const std::string& key, double start, double stop, const reply_callback_t& reply_callback);
1138  client& zrange(const std::string& key, double start, double stop, bool withscores, const reply_callback_t& reply_callback);
1139  std::future<reply> zrange(const std::string& key, double start, double stop, bool withscores = false);
1140 
1141  client& zrange(const std::string& key, const std::string& start, const std::string& stop, const reply_callback_t& reply_callback);
1142  client& zrange(const std::string& key, const std::string& start, const std::string& stop, bool withscores, const reply_callback_t& reply_callback);
1143  std::future<reply> zrange(const std::string& key, const std::string& start, const std::string& stop, bool withscores = false);
1144 
1145  client& zrangebylex(const std::string& key, int min, int max, const reply_callback_t& reply_callback);
1146  client& zrangebylex(const std::string& key, int min, int max, bool withscores, const reply_callback_t& reply_callback);
1147  std::future<reply> zrangebylex(const std::string& key, int min, int max, bool withscores = false);
1148 
1149  client& zrangebylex(const std::string& key, double min, double max, const reply_callback_t& reply_callback);
1150  client& zrangebylex(const std::string& key, double min, double max, bool withscores, const reply_callback_t& reply_callback);
1151  std::future<reply> zrangebylex(const std::string& key, double min, double max, bool withscores = false);
1152 
1153  client& zrangebylex(const std::string& key, const std::string& min, const std::string& max, const reply_callback_t& reply_callback);
1154  client& zrangebylex(const std::string& key, const std::string& min, const std::string& max, bool withscores, const reply_callback_t& reply_callback);
1155  std::future<reply> zrangebylex(const std::string& key, const std::string& min, const std::string& max, bool withscores = false);
1156 
1157  client& zrangebylex(const std::string& key, int min, int max, std::size_t offset, std::size_t count, const reply_callback_t& reply_callback);
1158  client& zrangebylex(const std::string& key, int min, int max, std::size_t offset, std::size_t count, bool withscores, const reply_callback_t& reply_callback);
1159  std::future<reply> zrangebylex(const std::string& key, int min, int max, std::size_t offset, std::size_t count, bool withscores = false);
1160 
1161  client& zrangebylex(const std::string& key, double min, double max, std::size_t offset, std::size_t count, const reply_callback_t& reply_callback);
1162  client& zrangebylex(const std::string& key, double min, double max, std::size_t offset, std::size_t count, bool withscores, const reply_callback_t& reply_callback);
1163  std::future<reply> zrangebylex(const std::string& key, double min, double max, std::size_t offset, std::size_t count, bool withscores = false);
1164 
1165  client& zrangebylex(const std::string& key, const std::string& min, const std::string& max, std::size_t offset, std::size_t count, const reply_callback_t& reply_callback);
1166  client& zrangebylex(const std::string& key, const std::string& min, const std::string& max, std::size_t offset, std::size_t count, bool withscores, const reply_callback_t& reply_callback);
1167  std::future<reply> zrangebylex(const std::string& key, const std::string& min, const std::string& max, std::size_t offset, std::size_t count, bool withscores = false);
1168 
1169  client& zrangebyscore(const std::string& key, int min, int max, const reply_callback_t& reply_callback);
1170  client& zrangebyscore(const std::string& key, int min, int max, bool withscores, const reply_callback_t& reply_callback);
1171  std::future<reply> zrangebyscore(const std::string& key, int min, int max, bool withscores = false);
1172 
1173  client& zrangebyscore(const std::string& key, double min, double max, const reply_callback_t& reply_callback);
1174  client& zrangebyscore(const std::string& key, double min, double max, bool withscores, const reply_callback_t& reply_callback);
1175  std::future<reply> zrangebyscore(const std::string& key, double min, double max, bool withscores = false);
1176 
1177  client& zrangebyscore(const std::string& key, const std::string& min, const std::string& max, const reply_callback_t& reply_callback);
1178  client& zrangebyscore(const std::string& key, const std::string& min, const std::string& max, bool withscores, const reply_callback_t& reply_callback);
1179  std::future<reply> zrangebyscore(const std::string& key, const std::string& min, const std::string& max, bool withscores = false);
1180 
1181  client& zrangebyscore(const std::string& key, int min, int max, std::size_t offset, std::size_t count, const reply_callback_t& reply_callback);
1182  client& zrangebyscore(const std::string& key, int min, int max, std::size_t offset, std::size_t count, bool withscores, const reply_callback_t& reply_callback);
1183  std::future<reply> zrangebyscore(const std::string& key, int min, int max, std::size_t offset, std::size_t count, bool withscores = false);
1184 
1185  client& zrangebyscore(const std::string& key, double min, double max, std::size_t offset, std::size_t count, const reply_callback_t& reply_callback);
1186  client& zrangebyscore(const std::string& key, double min, double max, std::size_t offset, std::size_t count, bool withscores, const reply_callback_t& reply_callback);
1187  std::future<reply> zrangebyscore(const std::string& key, double min, double max, std::size_t offset, std::size_t count, bool withscores = false);
1188 
1189  client& zrangebyscore(const std::string& key, const std::string& min, const std::string& max, std::size_t offset, std::size_t count, const reply_callback_t& reply_callback);
1190  client& zrangebyscore(const std::string& key, const std::string& min, const std::string& max, std::size_t offset, std::size_t count, bool withscores, const reply_callback_t& reply_callback);
1191  std::future<reply> zrangebyscore(const std::string& key, const std::string& min, const std::string& max, std::size_t offset, std::size_t count, bool withscores = false);
1192 
1193  client& zrank(const std::string& key, const std::string& member, const reply_callback_t& reply_callback);
1194  std::future<reply> zrank(const std::string& key, const std::string& member);
1195 
1196  client& zrem(const std::string& key, const std::vector<std::string>& members, const reply_callback_t& reply_callback);
1197  std::future<reply> zrem(const std::string& key, const std::vector<std::string>& members);
1198 
1199  client& zremrangebylex(const std::string& key, int min, int max, const reply_callback_t& reply_callback);
1200  std::future<reply> zremrangebylex(const std::string& key, int min, int max);
1201 
1202  client& zremrangebylex(const std::string& key, double min, double max, const reply_callback_t& reply_callback);
1203  std::future<reply> zremrangebylex(const std::string& key, double min, double max);
1204 
1205  client& zremrangebylex(const std::string& key, const std::string& min, const std::string& max, const reply_callback_t& reply_callback);
1206  std::future<reply> zremrangebylex(const std::string& key, const std::string& min, const std::string& max);
1207 
1208  client& zremrangebyrank(const std::string& key, int start, int stop, const reply_callback_t& reply_callback);
1209  std::future<reply> zremrangebyrank(const std::string& key, int start, int stop);
1210 
1211  client& zremrangebyrank(const std::string& key, double start, double stop, const reply_callback_t& reply_callback);
1212  std::future<reply> zremrangebyrank(const std::string& key, double start, double stop);
1213 
1214  client& zremrangebyrank(const std::string& key, const std::string& start, const std::string& stop, const reply_callback_t& reply_callback);
1215  std::future<reply> zremrangebyrank(const std::string& key, const std::string& start, const std::string& stop);
1216 
1217  client& zremrangebyscore(const std::string& key, int min, int max, const reply_callback_t& reply_callback);
1218  std::future<reply> zremrangebyscore(const std::string& key, int min, int max);
1219 
1220  client& zremrangebyscore(const std::string& key, double min, double max, const reply_callback_t& reply_callback);
1221  std::future<reply> zremrangebyscore(const std::string& key, double min, double max);
1222 
1223  client& zremrangebyscore(const std::string& key, const std::string& min, const std::string& max, const reply_callback_t& reply_callback);
1224  std::future<reply> zremrangebyscore(const std::string& key, const std::string& min, const std::string& max);
1225 
1226  client& zrevrange(const std::string& key, int start, int stop, const reply_callback_t& reply_callback);
1227  client& zrevrange(const std::string& key, int start, int stop, bool withscores, const reply_callback_t& reply_callback);
1228  std::future<reply> zrevrange(const std::string& key, int start, int stop, bool withscores = false);
1229 
1230  client& zrevrange(const std::string& key, double start, double stop, const reply_callback_t& reply_callback);
1231  client& zrevrange(const std::string& key, double start, double stop, bool withscores, const reply_callback_t& reply_callback);
1232  std::future<reply> zrevrange(const std::string& key, double start, double stop, bool withscores = false);
1233 
1234  client& zrevrange(const std::string& key, const std::string& start, const std::string& stop, const reply_callback_t& reply_callback);
1235  client& zrevrange(const std::string& key, const std::string& start, const std::string& stop, bool withscores, const reply_callback_t& reply_callback);
1236  std::future<reply> zrevrange(const std::string& key, const std::string& start, const std::string& stop, bool withscores = false);
1237 
1238  client& zrevrangebylex(const std::string& key, int max, int min, const reply_callback_t& reply_callback);
1239  client& zrevrangebylex(const std::string& key, int max, int min, bool withscores, const reply_callback_t& reply_callback);
1240  std::future<reply> zrevrangebylex(const std::string& key, int max, int min, bool withscores = false);
1241 
1242  client& zrevrangebylex(const std::string& key, double max, double min, const reply_callback_t& reply_callback);
1243  client& zrevrangebylex(const std::string& key, double max, double min, bool withscores, const reply_callback_t& reply_callback);
1244  std::future<reply> zrevrangebylex(const std::string& key, double max, double min, bool withscores = false);
1245 
1246  client& zrevrangebylex(const std::string& key, const std::string& max, const std::string& min, const reply_callback_t& reply_callback);
1247  client& zrevrangebylex(const std::string& key, const std::string& max, const std::string& min, bool withscores, const reply_callback_t& reply_callback);
1248  std::future<reply> zrevrangebylex(const std::string& key, const std::string& max, const std::string& min, bool withscores = false);
1249 
1250  client& zrevrangebylex(const std::string& key, int max, int min, std::size_t offset, std::size_t count, const reply_callback_t& reply_callback);
1251  client& zrevrangebylex(const std::string& key, int max, int min, std::size_t offset, std::size_t count, bool withscores, const reply_callback_t& reply_callback);
1252  std::future<reply> zrevrangebylex(const std::string& key, int max, int min, std::size_t offset, std::size_t count, bool withscores = false);
1253 
1254  client& zrevrangebylex(const std::string& key, double max, double min, std::size_t offset, std::size_t count, const reply_callback_t& reply_callback);
1255  client& zrevrangebylex(const std::string& key, double max, double min, std::size_t offset, std::size_t count, bool withscores, const reply_callback_t& reply_callback);
1256  std::future<reply> zrevrangebylex(const std::string& key, double max, double min, std::size_t offset, std::size_t count, bool withscores = false);
1257 
1258  client& zrevrangebylex(const std::string& key, const std::string& max, const std::string& min, std::size_t offset, std::size_t count, const reply_callback_t& reply_callback);
1259  client& zrevrangebylex(const std::string& key, const std::string& max, const std::string& min, std::size_t offset, std::size_t count, bool withscores, const reply_callback_t& reply_callback);
1260  std::future<reply> zrevrangebylex(const std::string& key, const std::string& max, const std::string& min, std::size_t offset, std::size_t count, bool withscores = false);
1261 
1262  client& zrevrangebyscore(const std::string& key, int max, int min, const reply_callback_t& reply_callback);
1263  client& zrevrangebyscore(const std::string& key, int max, int min, bool withscores, const reply_callback_t& reply_callback);
1264  std::future<reply> zrevrangebyscore(const std::string& key, int max, int min, bool withscores = false);
1265 
1266  client& zrevrangebyscore(const std::string& key, double max, double min, const reply_callback_t& reply_callback);
1267  client& zrevrangebyscore(const std::string& key, double max, double min, bool withscores, const reply_callback_t& reply_callback);
1268  std::future<reply> zrevrangebyscore(const std::string& key, double max, double min, bool withscores = false);
1269 
1270  client& zrevrangebyscore(const std::string& key, const std::string& max, const std::string& min, const reply_callback_t& reply_callback);
1271  client& zrevrangebyscore(const std::string& key, const std::string& max, const std::string& min, bool withscores, const reply_callback_t& reply_callback);
1272  std::future<reply> zrevrangebyscore(const std::string& key, const std::string& max, const std::string& min, bool withscores = false);
1273 
1274  client& zrevrangebyscore(const std::string& key, int max, int min, std::size_t offset, std::size_t count, const reply_callback_t& reply_callback);
1275  client& zrevrangebyscore(const std::string& key, int max, int min, std::size_t offset, std::size_t count, bool withscores, const reply_callback_t& reply_callback);
1276  std::future<reply> zrevrangebyscore(const std::string& key, int max, int min, std::size_t offset, std::size_t count, bool withscores = false);
1277 
1278  client& zrevrangebyscore(const std::string& key, double max, double min, std::size_t offset, std::size_t count, const reply_callback_t& reply_callback);
1279  client& zrevrangebyscore(const std::string& key, double max, double min, std::size_t offset, std::size_t count, bool withscores, const reply_callback_t& reply_callback);
1280  std::future<reply> zrevrangebyscore(const std::string& key, double max, double min, std::size_t offset, std::size_t count, bool withscores = false);
1281 
1282  client& zrevrangebyscore(const std::string& key, const std::string& max, const std::string& min, std::size_t offset, std::size_t count, const reply_callback_t& reply_callback);
1283  client& zrevrangebyscore(const std::string& key, const std::string& max, const std::string& min, std::size_t offset, std::size_t count, bool withscores, const reply_callback_t& reply_callback);
1284  std::future<reply> zrevrangebyscore(const std::string& key, const std::string& max, const std::string& min, std::size_t offset, std::size_t count, bool withscores = false);
1285 
1286  client& zrevrank(const std::string& key, const std::string& member, const reply_callback_t& reply_callback);
1287  std::future<reply> zrevrank(const std::string& key, const std::string& member);
1288 
1289  client& zscan(const std::string& key, std::size_t cursor, const reply_callback_t& reply_callback);
1290  std::future<reply> zscan(const std::string& key, std::size_t cursor);
1291 
1292  client& zscan(const std::string& key, std::size_t cursor, const std::string& pattern, const reply_callback_t& reply_callback);
1293  std::future<reply> zscan(const std::string& key, std::size_t cursor, const std::string& pattern);
1294 
1295  client& zscan(const std::string& key, std::size_t cursor, std::size_t count, const reply_callback_t& reply_callback);
1296  std::future<reply> zscan(const std::string& key, std::size_t cursor, std::size_t count);
1297 
1298  client& zscan(const std::string& key, std::size_t cursor, const std::string& pattern, std::size_t count, const reply_callback_t& reply_callback);
1299  std::future<reply> zscan(const std::string& key, std::size_t cursor, const std::string& pattern, std::size_t count);
1300 
1301  client& zscore(const std::string& key, const std::string& member, const reply_callback_t& reply_callback);
1302  std::future<reply> zscore(const std::string& key, const std::string& member);
1303 
1304  client& zunionstore(const std::string& destination, std::size_t numkeys, const std::vector<std::string>& keys, const std::vector<std::size_t> weights, aggregate_method method, const reply_callback_t& reply_callback);
1305  std::future<reply> zunionstore(const std::string& destination, std::size_t numkeys, const std::vector<std::string>& keys, const std::vector<std::size_t> weights, aggregate_method method);
1306 
1307 private:
1309  template <typename T>
1310  typename std::enable_if<std::is_same<T, client_type>::value>::type
1311  client_kill_unpack_arg(std::vector<std::string>& redis_cmd, reply_callback_t&, client_type type);
1312 
1313  template <typename T>
1314  typename std::enable_if<std::is_same<T, bool>::value>::type
1315  client_kill_unpack_arg(std::vector<std::string>& redis_cmd, reply_callback_t&, bool skip);
1316 
1317  template <typename T>
1318  typename std::enable_if<std::is_integral<T>::value>::type
1319  client_kill_unpack_arg(std::vector<std::string>& redis_cmd, reply_callback_t&, uint64_t id);
1320 
1321  template <typename T>
1322  typename std::enable_if<std::is_class<T>::value>::type
1323  client_kill_unpack_arg(std::vector<std::string>&, reply_callback_t& reply_callback, const T& cb);
1324 
1325  template <typename T, typename... Ts>
1326  void
1327  client_kill_impl(std::vector<std::string>& redis_cmd, reply_callback_t& reply, const T& arg, const Ts&... args);
1328 
1329  template <typename T>
1330  void
1331  client_kill_impl(std::vector<std::string>& redis_cmd, reply_callback_t& reply, const T& arg);
1332 
1333 private:
1335  client& sort(const std::string& key, const std::string& by_pattern, bool limit, std::size_t offset, std::size_t count, const std::vector<std::string>& get_patterns, bool asc_order, bool alpha, const std::string& store_dest, const reply_callback_t& reply_callback);
1336 
1338  client& zrevrangebyscore(const std::string& key, const std::string& max, const std::string& min, bool limit, std::size_t offset, std::size_t count, bool withscores, const reply_callback_t& reply_callback);
1339 
1341  client& zrangebyscore(const std::string& key, const std::string& min, const std::string& max, bool limit, std::size_t offset, std::size_t count, bool withscores, const reply_callback_t& reply_callback);
1342 
1344  client& zrevrangebylex(const std::string& key, const std::string& max, const std::string& min, bool limit, std::size_t offset, std::size_t count, bool withscores, const reply_callback_t& reply_callback);
1345 
1347  client& zrangebylex(const std::string& key, const std::string& min, const std::string& max, bool limit, std::size_t offset, std::size_t count, bool withscores, const reply_callback_t& reply_callback);
1348 
1349 private:
1356  void connection_receive_handler(network::redis_connection& connection, reply& reply);
1357 
1363  void connection_disconnection_handler(network::redis_connection& connection);
1364 
1368  void clear_callbacks(void);
1369 
1374  void try_commit(void);
1375 
1377  std::future<reply> exec_cmd(const std::function<client&(const reply_callback_t&)>& f);
1378 
1379 private:
1383  struct command_request {
1384  std::vector<std::string> command;
1385  reply_callback_t callback;
1386  };
1387 
1388 private:
1392  std::string m_redis_server;
1396  std::size_t m_redis_port = 0;
1400  std::string m_master_name;
1404  std::string m_password;
1408  int m_database_index = 0;
1409 
1413  network::redis_connection m_client;
1414 
1418  cpp_redis::sentinel m_sentinel;
1419 
1423  std::uint32_t m_connect_timeout_msecs = 0;
1427  std::int32_t m_max_reconnects = 0;
1431  std::int32_t m_current_reconnect_attempts = 0;
1435  std::uint32_t m_reconnect_interval_msecs = 0;
1436 
1440  std::atomic_bool m_reconnecting;
1444  std::atomic_bool m_cancel;
1445 
1449  std::queue<command_request> m_commands;
1450 
1454  connect_callback_t m_connect_callback;
1455 
1459  std::mutex m_callbacks_mutex;
1460 
1464  std::condition_variable m_sync_condvar;
1465 
1469  std::atomic<unsigned int> m_callbacks_running;
1470 }; // namespace cpp_redis
1471 
1472 } // namespace cpp_redis
1473 
1474 #include <cpp_redis/impl/client.ipp>
Definition: redis_connection.hpp:45
std::future< reply > client_kill_future(const T, const Ts...)
Definition: client.ipp:122
client(void)
ctor
Definition: client.hpp:48
client & operator=(const client &)=delete
assignment operator
Definition: client.hpp:411
void cancel_reconnect(void)
geo_unit
Definition: client.hpp:351
bitfield_operation_type operation_type
Definition: client.hpp:415
client & client_kill(const std::string &host, int port, const T &arg, const Ts &... args)
Definition: client.ipp:93
Definition: reply.hpp:37
bitfield_operation_type
Definition: client.hpp:392
std::string aggregate_method_to_string(aggregate_method method) const
client & sync_commit(const std::chrono::duration< Rep, Period > &timeout)
Definition: client.hpp:217
std::string geo_unit_to_string(geo_unit unit) const
bool is_reconnecting(void) const
connect_state
Definition: client.hpp:71
std::function< void(reply &)> reply_callback_t
Definition: client.hpp:169
std::string type
Definition: client.hpp:420
std::string overflow_type_to_string(overflow_type type) const
void disconnect(bool wait_for_removal=false)
client & sync_commit(void)
client & send(const std::vector< std::string > &redis_cmd, const reply_callback_t &callback)
Definition: sentinel.hpp:39
std::string bitfield_operation_type_to_string(bitfield_operation_type operation) const
void clear_sentinels(void)
overflow_type overflow
Definition: client.hpp:435
void add_sentinel(const std::string &host, std::size_t port)
void connect(const std::string &host="127.0.0.1", std::size_t port=6379, const connect_callback_t &connect_callback=nullptr, std::uint32_t timeout_msecs=0, std::int32_t max_reconnects=0, std::uint32_t reconnect_interval_msecs=0)
const sentinel & get_sentinel(void) const
client_type
Definition: client.hpp:54
std::function< void(const std::string &host, std::size_t port, connect_state status)> connect_callback_t
Definition: client.hpp:106
int offset
Definition: client.hpp:425
overflow_type
Definition: client.hpp:372
int value
Definition: client.hpp:430
~client(void)
dtor
bool is_connected(void) const
client & commit(void)
Definition: array_builder.hpp:29
aggregate_method
Definition: client.hpp:331