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 
85  client();
86 
87 #endif /* __CPP_REDIS_USE_CUSTOM_TCP_CLIENT */
88 
94  explicit client(const std::shared_ptr<network::tcp_client_iface> &tcp_client);
95 
97  ~client();
98 
100  client(const client &) = delete;
101 
103  client &operator=(const client &) = delete;
104 
105  public:
109  typedef std::function<void(const std::string &host, std::size_t port, connect_state status)> connect_callback_t;
110 
121  void connect(
122  const std::string &host = "127.0.0.1",
123  std::size_t port = 6379,
124  const connect_callback_t &connect_callback = nullptr,
125  std::uint32_t timeout_ms = 0,
126  std::int32_t max_reconnects = 0,
127  std::uint32_t reconnect_interval_ms = 0);
128 
138  void connect(
139  const std::string &m_name,
140  const connect_callback_t &connect_callback = nullptr,
141  std::uint32_t timeout_ms = 0,
142  std::int32_t max_reconnects = 0,
143  std::uint32_t reconnect_interval_ms = 0);
144 
148  bool is_connected() const;
149 
155  void disconnect(bool wait_for_removal = false);
156 
160  bool is_reconnecting() const;
161 
165  void cancel_reconnect();
166 
167  public:
172  typedef std::function<void(reply &)> reply_callback_t;
173 
183  client &send(const std::vector<std::string> &redis_cmd, const reply_callback_t &callback);
184 
192  std::future<reply> send(const std::vector<std::string> &redis_cmd);
193 
202  client &commit();
203 
210  client &sync_commit();
211 
218  template<class Rep, class Period>
219  client &
220  sync_commit(const std::chrono::duration<Rep, Period> &timeout) {
223  if (!is_reconnecting()) {
224  try_commit();
225  }
226 
227  std::unique_lock<std::mutex> lock_callback(m_callbacks_mutex);
228  __CPP_REDIS_LOG(debug, "cpp_redis::client waiting for callbacks to complete");
229  if (!m_sync_condvar.wait_for(lock_callback, timeout,
230  [=] { return m_callbacks_running == 0 && m_commands.empty(); })) {
231  __CPP_REDIS_LOG(debug, "cpp_redis::client finished waiting for callback");
232  } else {
233  __CPP_REDIS_LOG(debug, "cpp_redis::client timed out waiting for callback");
234  }
235 
236  return *this;
237  }
238 
239  private:
243  bool should_reconnect() const;
244 
248  void resend_failed_commands();
249 
253  void sleep_before_next_reconnect_attempt();
254 
259  void reconnect();
260 
264  void re_auth();
265 
269  void re_select();
270 
271  private:
279  void unprotected_send(const std::vector<std::string> &redis_cmd, const reply_callback_t &callback);
280 
288  void unprotected_auth(const std::string &password, const reply_callback_t &reply_callback);
289 
297  void unprotected_select(int index, const reply_callback_t &reply_callback);
298 
299  public:
307  void add_sentinel(const std::string &host, std::size_t port, std::uint32_t timeout_ms = 0);
308 
314  const sentinel &get_sentinel() const;
315 
323 
327  void clear_sentinels();
328 
329  public:
335  enum class aggregate_method {
336  sum,
337  min,
338  max,
339  server_default
340  };
341 
348  std::string aggregate_method_to_string(aggregate_method method) const;
349 
350  public:
355  enum class geo_unit {
356  m_cv_mutex,
357  km,
358  ft,
359  mi
360  };
361 
368  std::string geo_unit_to_string(geo_unit unit) const;
369 
370  public:
376  enum class overflow_type {
377  wrap,
378  sat,
379  fail,
380  server_default
381  };
382 
389  std::string overflow_type_to_string(overflow_type type) const;
390 
391  public:
397  get,
398  set,
399  incrby
400  };
401 
408  std::string
410 
411  public:
420 
424  std::string type;
425 
429  int offset;
430 
434  int value;
435 
440 
449  static bitfield_operation
450  get(const std::string &type, int offset, overflow_type overflow = overflow_type::server_default);
451 
461  static bitfield_operation
462  set(const std::string &type, int offset, int value, overflow_type overflow = overflow_type::server_default);
463 
473  static bitfield_operation incrby(const std::string &type, int offset, int increment,
474  overflow_type overflow = overflow_type::server_default);
475  };
476 
477  public:
478  client &
479  append(const std::string &key, const std::string &value, const reply_callback_t &reply_callback);
480 
481  std::future<reply> append(const std::string &key, const std::string &value);
482 
483  client &auth(const std::string &password, const reply_callback_t &reply_callback);
484 
485  std::future<reply> auth(const std::string &password);
486 
487  client &bgrewriteaof(const reply_callback_t &reply_callback);
488 
489  std::future<reply> bgrewriteaof();
490 
491  client &bgsave(const reply_callback_t &reply_callback);
492 
493  std::future<reply> bgsave();
494 
495  client &bitcount(const std::string &key, const reply_callback_t &reply_callback);
496 
497  std::future<reply> bitcount(const std::string &key);
498 
499  client &bitcount(const std::string &key, int start, int end, const reply_callback_t &reply_callback);
500 
501  std::future<reply> bitcount(const std::string &key, int start, int end);
502 
503  client &bitfield(const std::string &key, const std::vector<bitfield_operation> &operations,
504  const reply_callback_t &reply_callback);
505 
506  std::future<reply> bitfield(const std::string &key, const std::vector<bitfield_operation> &operations);
507 
508  client &bitop(const std::string &operation, const std::string &destkey, const std::vector<std::string> &keys,
509  const reply_callback_t &reply_callback);
510 
511  std::future<reply>
512  bitop(const std::string &operation, const std::string &destkey, const std::vector<std::string> &keys);
513 
514  client &bitpos(const std::string &key, int bit, const reply_callback_t &reply_callback);
515 
516  std::future<reply> bitpos(const std::string &key, int bit);
517 
518  client &bitpos(const std::string &key, int bit, int start, const reply_callback_t &reply_callback);
519 
520  std::future<reply> bitpos(const std::string &key, int bit, int start);
521 
522  client &bitpos(const std::string &key, int bit, int start, int end, const reply_callback_t &reply_callback);
523 
524  std::future<reply> bitpos(const std::string &key, int bit, int start, int end);
525 
526  client &blpop(const std::vector<std::string> &keys, int timeout, const reply_callback_t &reply_callback);
527 
528  std::future<reply> blpop(const std::vector<std::string> &keys, int timeout);
529 
530  client &brpop(const std::vector<std::string> &keys, int timeout, const reply_callback_t &reply_callback);
531 
532  std::future<reply> brpop(const std::vector<std::string> &keys, int timeout);
533 
534  client &
535  brpoplpush(const std::string &src, const std::string &dst, int timeout, const reply_callback_t &reply_callback);
536 
537  std::future<reply> brpoplpush(const std::string &src, const std::string &dst, int timeout);
538 
539  template<typename T, typename... Ts>
540  client &client_kill(const std::string &host, int port, const T &arg, const Ts &... args);
541 
542  client &client_kill(const std::string &host, int port);
543 
544  template<typename... Ts>
545  client &client_kill(const char *host, int port, const Ts &... args);
546 
547  template<typename T, typename... Ts>
548  client &client_kill(const T &, const Ts &...);
549 
550  template<typename T, typename... Ts>
551  std::future<reply> client_kill_future(T, const Ts...);
552 
553  client &client_list(const reply_callback_t &reply_callback);
554 
555  std::future<reply> client_list();
556 
557  client &client_getname(const reply_callback_t &reply_callback);
558 
559  std::future<reply> client_getname();
560 
561  client &client_pause(int timeout, const reply_callback_t &reply_callback);
562 
563  std::future<reply> client_pause(int timeout);
564 
565  client &client_reply(const std::string &mode, const reply_callback_t &reply_callback);
566 
567  std::future<reply> client_reply(const std::string &mode);
568 
569  client &client_setname(const std::string &m_name, const reply_callback_t &reply_callback);
570 
571  std::future<reply> client_setname(const std::string &m_name);
572 
573  client &cluster_addslots(const std::vector<std::string> &p_slots, const reply_callback_t &reply_callback);
574 
575  std::future<reply> cluster_addslots(const std::vector<std::string> &p_slots);
576 
577  client &cluster_count_failure_reports(const std::string &node_id, const reply_callback_t &reply_callback);
578 
579  std::future<reply> cluster_count_failure_reports(const std::string &node_id);
580 
581  client &cluster_countkeysinslot(const std::string &slot, const reply_callback_t &reply_callback);
582 
583  std::future<reply> cluster_countkeysinslot(const std::string &slot);
584 
585  client &cluster_delslots(const std::vector<std::string> &p_slots, const reply_callback_t &reply_callback);
586 
587  std::future<reply> cluster_delslots(const std::vector<std::string> &p_slots);
588 
589  client &cluster_failover(const reply_callback_t &reply_callback);
590 
591  std::future<reply> cluster_failover();
592 
593  client &cluster_failover(const std::string &mode, const reply_callback_t &reply_callback);
594 
595  std::future<reply> cluster_failover(const std::string &mode);
596 
597  client &cluster_forget(const std::string &node_id, const reply_callback_t &reply_callback);
598 
599  std::future<reply> cluster_forget(const std::string &node_id);
600 
601  client &cluster_getkeysinslot(const std::string &slot, int count, const reply_callback_t &reply_callback);
602 
603  std::future<reply> cluster_getkeysinslot(const std::string &slot, int count);
604 
605  client &cluster_info(const reply_callback_t &reply_callback);
606 
607  std::future<reply> cluster_info();
608 
609  client &cluster_keyslot(const std::string &key, const reply_callback_t &reply_callback);
610 
611  std::future<reply> cluster_keyslot(const std::string &key);
612 
613  client &cluster_meet(const std::string &ip, int port, const reply_callback_t &reply_callback);
614 
615  std::future<reply> cluster_meet(const std::string &ip, int port);
616 
617  client &cluster_nodes(const reply_callback_t &reply_callback);
618 
619  std::future<reply> cluster_nodes();
620 
621  client &cluster_replicate(const std::string &node_id, const reply_callback_t &reply_callback);
622 
623  std::future<reply> cluster_replicate(const std::string &node_id);
624 
625  client &cluster_reset(const reply_callback_t &reply_callback);
626 
627  client &cluster_reset(const std::string &mode, const reply_callback_t &reply_callback);
628 
629  std::future<reply> cluster_reset(const std::string &mode = "soft");
630 
631  client &cluster_saveconfig(const reply_callback_t &reply_callback);
632 
633  std::future<reply> cluster_saveconfig();
634 
635  client &cluster_set_config_epoch(const std::string &epoch, const reply_callback_t &reply_callback);
636 
637  std::future<reply> cluster_set_config_epoch(const std::string &epoch);
638 
639  client &cluster_setslot(const std::string &slot, const std::string &mode, const reply_callback_t &reply_callback);
640 
641  std::future<reply> cluster_setslot(const std::string &slot, const std::string &mode);
642 
643  client &cluster_setslot(const std::string &slot, const std::string &mode, const std::string &node_id,
644  const reply_callback_t &reply_callback);
645 
646  std::future<reply> cluster_setslot(const std::string &slot, const std::string &mode, const std::string &node_id);
647 
648  client &cluster_slaves(const std::string &node_id, const reply_callback_t &reply_callback);
649 
650  std::future<reply> cluster_slaves(const std::string &node_id);
651 
652  client &cluster_slots(const reply_callback_t &reply_callback);
653 
654  std::future<reply> cluster_slots();
655 
656  client &command(const reply_callback_t &reply_callback);
657 
658  std::future<reply> command();
659 
660  client &command_count(const reply_callback_t &reply_callback);
661 
662  std::future<reply> command_count();
663 
664  client &command_getkeys(const reply_callback_t &reply_callback);
665 
666  std::future<reply> command_getkeys();
667 
668  client &command_info(const std::vector<std::string> &command_name, const reply_callback_t &reply_callback);
669 
670  std::future<reply> command_info(const std::vector<std::string> &command_name);
671 
672  client &config_get(const std::string &param, const reply_callback_t &reply_callback);
673 
674  std::future<reply> config_get(const std::string &param);
675 
676  client &config_rewrite(const reply_callback_t &reply_callback);
677 
678  std::future<reply> config_rewrite();
679 
680  client &config_set(const std::string &param, const std::string &val, const reply_callback_t &reply_callback);
681 
682  std::future<reply> config_set(const std::string &param, const std::string &val);
683 
684  client &config_resetstat(const reply_callback_t &reply_callback);
685 
686  std::future<reply> config_resetstat();
687 
688  client &dbsize(const reply_callback_t &reply_callback);
689 
690  std::future<reply> dbsize();
691 
692  client &debug_object(const std::string &key, const reply_callback_t &reply_callback);
693 
694  std::future<reply> debug_object(const std::string &key);
695 
696  client &debug_segfault(const reply_callback_t &reply_callback);
697 
698  std::future<reply> debug_segfault();
699 
700  client &decr(const std::string &key, const reply_callback_t &reply_callback);
701 
702  std::future<reply> decr(const std::string &key);
703 
704  client &decrby(const std::string &key, int val, const reply_callback_t &reply_callback);
705 
706  std::future<reply> decrby(const std::string &key, int val);
707 
708  client &del(const std::vector<std::string> &key, const reply_callback_t &reply_callback);
709 
710  std::future<reply> del(const std::vector<std::string> &key);
711 
712  client &discard(const reply_callback_t &reply_callback);
713 
714  std::future<reply> discard();
715 
716  client &dump(const std::string &key, const reply_callback_t &reply_callback);
717 
718  std::future<reply> dump(const std::string &key);
719 
720  client &echo(const std::string &msg, const reply_callback_t &reply_callback);
721 
722  std::future<reply> echo(const std::string &msg);
723 
724  client &eval(const std::string &script, int numkeys, const std::vector<std::string> &keys,
725  const std::vector<std::string> &args, const reply_callback_t &reply_callback);
726 
727  std::future<reply> eval(const std::string &script, int numkeys, const std::vector<std::string> &keys,
728  const std::vector<std::string> &args);
729 
730  client &evalsha(const std::string &sha1, int numkeys, const std::vector<std::string> &keys,
731  const std::vector<std::string> &args, const reply_callback_t &reply_callback);
732 
733  std::future<reply> evalsha(const std::string &sha1, int numkeys, const std::vector<std::string> &keys,
734  const std::vector<std::string> &args);
735 
736  client &exec(const reply_callback_t &reply_callback);
737 
738  std::future<reply> exec();
739 
740  client &exists(const std::vector<std::string> &keys, const reply_callback_t &reply_callback);
741 
742  std::future<reply> exists(const std::vector<std::string> &keys);
743 
744  client &expire(const std::string &key, int seconds, const reply_callback_t &reply_callback);
745 
746  std::future<reply> expire(const std::string &key, int seconds);
747 
748  client &expireat(const std::string &key, int timestamp, const reply_callback_t &reply_callback);
749 
750  std::future<reply> expireat(const std::string &key, int timestamp);
751 
752  client &flushall(const reply_callback_t &reply_callback);
753 
754  std::future<reply> flushall();
755 
756  client &flushdb(const reply_callback_t &reply_callback);
757 
758  std::future<reply> flushdb();
759 
760  client &geoadd(const std::string &key,
761  const std::vector<std::tuple<std::string, std::string, std::string>> &long_lat_memb,
762  const reply_callback_t &reply_callback);
763 
764  std::future<reply> geoadd(const std::string &key,
765  const std::vector<std::tuple<std::string, std::string, std::string>> &long_lat_memb);
766 
767  client &
768  geohash(const std::string &key, const std::vector<std::string> &members, const reply_callback_t &reply_callback);
769 
770  std::future<reply> geohash(const std::string &key, const std::vector<std::string> &members);
771 
772  client &
773  geopos(const std::string &key, const std::vector<std::string> &members, const reply_callback_t &reply_callback);
774 
775  std::future<reply> geopos(const std::string &key, const std::vector<std::string> &members);
776 
777  client &geodist(const std::string &key, const std::string &member_1, const std::string &member_2,
778  const reply_callback_t &reply_callback);
779 
780  client &
781  geodist(const std::string &key, const std::string &member_1, const std::string &member_2, const std::string &unit,
782  const reply_callback_t &reply_callback);
783 
784  std::future<reply> geodist(const std::string &key, const std::string &member_1, const std::string &member_2,
785  const std::string &unit = "m_cv_mutex");
786 
787  client &georadius(const std::string &key, double longitude, double latitude, double radius, geo_unit unit,
788  bool with_coord, bool with_dist, bool with_hash, bool asc_order,
789  const reply_callback_t &reply_callback);
790 
791  client &georadius(const std::string &key, double longitude, double latitude, double radius, geo_unit unit,
792  bool with_coord, bool with_dist, bool with_hash, bool asc_order, std::size_t count,
793  const reply_callback_t &reply_callback);
794 
795  client &georadius(const std::string &key, double longitude, double latitude, double radius, geo_unit unit,
796  bool with_coord, bool with_dist, bool with_hash, bool asc_order, const std::string &store_key,
797  const reply_callback_t &reply_callback);
798 
799  client &georadius(const std::string &key, double longitude, double latitude, double radius, geo_unit unit,
800  bool with_coord, bool with_dist, bool with_hash, bool asc_order, const std::string &store_key,
801  const std::string &storedist_key, const reply_callback_t &reply_callback);
802 
803  client &georadius(const std::string &key, double longitude, double latitude, double radius, geo_unit unit,
804  bool with_coord, bool with_dist, bool with_hash, bool asc_order, std::size_t count,
805  const std::string &store_key, const reply_callback_t &reply_callback);
806 
807  client &georadius(const std::string &key, double longitude, double latitude, double radius, geo_unit unit,
808  bool with_coord, bool with_dist, bool with_hash, bool asc_order, std::size_t count,
809  const std::string &store_key, const std::string &storedist_key,
810  const reply_callback_t &reply_callback);
811 
812  std::future<reply>
813  georadius(const std::string &key, double longitude, double latitude, double radius, geo_unit unit,
814  bool with_coord = false, bool with_dist = false, bool with_hash = false, bool asc_order = false,
815  std::size_t count = 0, const std::string &store_key = "", const std::string &storedist_key = "");
816 
817  client &georadiusbymember(const std::string &key, const std::string &member, double radius, geo_unit unit,
818  bool with_coord, bool with_dist, bool with_hash, bool asc_order,
819  const reply_callback_t &reply_callback);
820 
821  client &georadiusbymember(const std::string &key, const std::string &member, double radius, geo_unit unit,
822  bool with_coord, bool with_dist, bool with_hash, bool asc_order, std::size_t count,
823  const reply_callback_t &reply_callback);
824 
825  client &georadiusbymember(const std::string &key, const std::string &member, double radius, geo_unit unit,
826  bool with_coord, bool with_dist, bool with_hash, bool asc_order,
827  const std::string &store_key, const reply_callback_t &reply_callback);
828 
829  client &georadiusbymember(const std::string &key, const std::string &member, double radius, geo_unit unit,
830  bool with_coord, bool with_dist, bool with_hash, bool asc_order,
831  const std::string &store_key, const std::string &storedist_key,
832  const reply_callback_t &reply_callback);
833 
834  client &georadiusbymember(const std::string &key, const std::string &member, double radius, geo_unit unit,
835  bool with_coord, bool with_dist, bool with_hash, bool asc_order, std::size_t count,
836  const std::string &store_key, const reply_callback_t &reply_callback);
837 
838  client &georadiusbymember(const std::string &key, const std::string &member, double radius, geo_unit unit,
839  bool with_coord, bool with_dist, bool with_hash, bool asc_order, std::size_t count,
840  const std::string &store_key, const std::string &storedist_key,
841  const reply_callback_t &reply_callback);
842 
843  std::future<reply>
844  georadiusbymember(const std::string &key, const std::string &member, double radius, geo_unit unit,
845  bool with_coord = false, bool with_dist = false, bool with_hash = false, bool asc_order = false,
846  std::size_t count = 0, const std::string &store_key = "",
847  const std::string &storedist_key = "");
848 
849  client &get(const std::string &key, const reply_callback_t &reply_callback);
850 
851  std::future<reply> get(const std::string &key);
852 
853  client &getbit(const std::string &key, int offset, const reply_callback_t &reply_callback);
854 
855  std::future<reply> getbit(const std::string &key, int offset);
856 
857  client &getrange(const std::string &key, int start, int end, const reply_callback_t &reply_callback);
858 
859  std::future<reply> getrange(const std::string &key, int start, int end);
860 
861  client &getset(const std::string &key, const std::string &val, const reply_callback_t &reply_callback);
862 
863  std::future<reply> getset(const std::string &key, const std::string &val);
864 
865  client &
866  hdel(const std::string &key, const std::vector<std::string> &fields, const reply_callback_t &reply_callback);
867 
868  std::future<reply> hdel(const std::string &key, const std::vector<std::string> &fields);
869 
870  client &hexists(const std::string &key, const std::string &field, const reply_callback_t &reply_callback);
871 
872  std::future<reply> hexists(const std::string &key, const std::string &field);
873 
874  client &hget(const std::string &key, const std::string &field, const reply_callback_t &reply_callback);
875 
876  std::future<reply> hget(const std::string &key, const std::string &field);
877 
878  client &hgetall(const std::string &key, const reply_callback_t &reply_callback);
879 
880  std::future<reply> hgetall(const std::string &key);
881 
882  client &
883  hincrby(const std::string &key, const std::string &field, int incr, const reply_callback_t &reply_callback);
884 
885  std::future<reply> hincrby(const std::string &key, const std::string &field, int incr);
886 
887  client &hincrbyfloat(const std::string &key, const std::string &field, float incr,
888  const reply_callback_t &reply_callback);
889 
890  std::future<reply> hincrbyfloat(const std::string &key, const std::string &field, float incr);
891 
892  client &hkeys(const std::string &key, const reply_callback_t &reply_callback);
893 
894  std::future<reply> hkeys(const std::string &key);
895 
896  client &hlen(const std::string &key, const reply_callback_t &reply_callback);
897 
898  std::future<reply> hlen(const std::string &key);
899 
900  client &
901  hmget(const std::string &key, const std::vector<std::string> &fields, const reply_callback_t &reply_callback);
902 
903  std::future<reply> hmget(const std::string &key, const std::vector<std::string> &fields);
904 
905  client &hmset(const std::string &key, const std::vector<std::pair<std::string, std::string>> &field_val,
906  const reply_callback_t &reply_callback);
907 
908  std::future<reply>
909  hmset(const std::string &key, const std::vector<std::pair<std::string, std::string>> &field_val);
910 
911  client &hscan(const std::string &key, std::size_t cursor, const reply_callback_t &reply_callback);
912 
913  std::future<reply> hscan(const std::string &key, std::size_t cursor);
914 
915  client &hscan(const std::string &key, std::size_t cursor, const std::string &pattern,
916  const reply_callback_t &reply_callback);
917 
918  std::future<reply> hscan(const std::string &key, std::size_t cursor, const std::string &pattern);
919 
920  client &
921  hscan(const std::string &key, std::size_t cursor, std::size_t count, const reply_callback_t &reply_callback);
922 
923  std::future<reply> hscan(const std::string &key, std::size_t cursor, std::size_t count);
924 
925  client &hscan(const std::string &key, std::size_t cursor, const std::string &pattern, std::size_t count,
926  const reply_callback_t &reply_callback);
927 
928  std::future<reply>
929  hscan(const std::string &key, std::size_t cursor, const std::string &pattern, std::size_t count);
930 
931  client &hset(const std::string &key, const std::string &field, const std::string &value,
932  const reply_callback_t &reply_callback);
933 
934  std::future<reply> hset(const std::string &key, const std::string &field, const std::string &value);
935 
936  client &hsetnx(const std::string &key, const std::string &field, const std::string &value,
937  const reply_callback_t &reply_callback);
938 
939  std::future<reply> hsetnx(const std::string &key, const std::string &field, const std::string &value);
940 
941  client &hstrlen(const std::string &key, const std::string &field, const reply_callback_t &reply_callback);
942 
943  std::future<reply> hstrlen(const std::string &key, const std::string &field);
944 
945  client &hvals(const std::string &key, const reply_callback_t &reply_callback);
946 
947  std::future<reply> hvals(const std::string &key);
948 
949  client &incr(const std::string &key, const reply_callback_t &reply_callback);
950 
951  std::future<reply> incr(const std::string &key);
952 
953  client &incrby(const std::string &key, int incr, const reply_callback_t &reply_callback);
954 
955  std::future<reply> incrby(const std::string &key, int incr);
956 
957  client &incrbyfloat(const std::string &key, float incr, const reply_callback_t &reply_callback);
958 
959  std::future<reply> incrbyfloat(const std::string &key, float incr);
960 
961  client &info(const reply_callback_t &reply_callback);
962 
963  client &info(const std::string &section, const reply_callback_t &reply_callback);
964 
965  std::future<reply> info(const std::string &section = "default");
966 
967  client &keys(const std::string &pattern, const reply_callback_t &reply_callback);
968 
969  std::future<reply> keys(const std::string &pattern);
970 
971  client &lastsave(const reply_callback_t &reply_callback);
972 
973  std::future<reply> lastsave();
974 
975  client &lindex(const std::string &key, int index, const reply_callback_t &reply_callback);
976 
977  std::future<reply> lindex(const std::string &key, int index);
978 
979  client &linsert(const std::string &key, const std::string &before_after, const std::string &pivot,
980  const std::string &value, const reply_callback_t &reply_callback);
981 
982  std::future<reply> linsert(const std::string &key, const std::string &before_after, const std::string &pivot,
983  const std::string &value);
984 
985  client &llen(const std::string &key, const reply_callback_t &reply_callback);
986 
987  std::future<reply> llen(const std::string &key);
988 
989  client &lpop(const std::string &key, const reply_callback_t &reply_callback);
990 
991  std::future<reply> lpop(const std::string &key);
992 
993  client &
994  lpush(const std::string &key, const std::vector<std::string> &values, const reply_callback_t &reply_callback);
995 
996  std::future<reply> lpush(const std::string &key, const std::vector<std::string> &values);
997 
998  client &lpushx(const std::string &key, const std::string &value, const reply_callback_t &reply_callback);
999 
1000  std::future<reply> lpushx(const std::string &key, const std::string &value);
1001 
1002  client &lrange(const std::string &key, int start, int stop, const reply_callback_t &reply_callback);
1003 
1004  std::future<reply> lrange(const std::string &key, int start, int stop);
1005 
1006  client &lrem(const std::string &key, int count, const std::string &value, const reply_callback_t &reply_callback);
1007 
1008  std::future<reply> lrem(const std::string &key, int count, const std::string &value);
1009 
1010  client &lset(const std::string &key, int index, const std::string &value, const reply_callback_t &reply_callback);
1011 
1012  std::future<reply> lset(const std::string &key, int index, const std::string &value);
1013 
1014  client &ltrim(const std::string &key, int start, int stop, const reply_callback_t &reply_callback);
1015 
1016  std::future<reply> ltrim(const std::string &key, int start, int stop);
1017 
1018  client &mget(const std::vector<std::string> &keys, const reply_callback_t &reply_callback);
1019 
1020  std::future<reply> mget(const std::vector<std::string> &keys);
1021 
1022  client &
1023  migrate(const std::string &host, int port, const std::string &key, const std::string &dest_db, int timeout,
1024  const reply_callback_t &reply_callback);
1025 
1026  client &
1027  migrate(const std::string &host, int port, const std::string &key, const std::string &dest_db, int timeout,
1028  bool copy, bool replace, const std::vector<std::string> &keys, const reply_callback_t &reply_callback);
1029 
1030  std::future<reply>
1031  migrate(const std::string &host, int port, const std::string &key, const std::string &dest_db, int timeout,
1032  bool copy = false, bool replace = false, const std::vector<std::string> &keys = {});
1033 
1034  client &monitor(const reply_callback_t &reply_callback);
1035 
1036  std::future<reply> monitor();
1037 
1038  client &move(const std::string &key, const std::string &db, const reply_callback_t &reply_callback);
1039 
1040  std::future<reply> move(const std::string &key, const std::string &db);
1041 
1042  client &
1043  mset(const std::vector<std::pair<std::string, std::string>> &key_vals, const reply_callback_t &reply_callback);
1044 
1045  std::future<reply> mset(const std::vector<std::pair<std::string, std::string>> &key_vals);
1046 
1047  client &
1048  msetnx(const std::vector<std::pair<std::string, std::string>> &key_vals, const reply_callback_t &reply_callback);
1049 
1050  std::future<reply> msetnx(const std::vector<std::pair<std::string, std::string>> &key_vals);
1051 
1052  client &multi(const reply_callback_t &reply_callback);
1053 
1054  std::future<reply> multi();
1055 
1056  client &object(const std::string &subcommand, const std::vector<std::string> &args,
1057  const reply_callback_t &reply_callback);
1058 
1059  std::future<reply> object(const std::string &subcommand, const std::vector<std::string> &args);
1060 
1061  client &persist(const std::string &key, const reply_callback_t &reply_callback);
1062 
1063  std::future<reply> persist(const std::string &key);
1064 
1065  client &pexpire(const std::string &key, int ms, const reply_callback_t &reply_callback);
1066 
1067  std::future<reply> pexpire(const std::string &key, int ms);
1068 
1069  client &pexpireat(const std::string &key, int ms_timestamp, const reply_callback_t &reply_callback);
1070 
1071  std::future<reply> pexpireat(const std::string &key, int ms_timestamp);
1072 
1073  client &
1074  pfadd(const std::string &key, const std::vector<std::string> &elements, const reply_callback_t &reply_callback);
1075 
1076  std::future<reply> pfadd(const std::string &key, const std::vector<std::string> &elements);
1077 
1078  client &pfcount(const std::vector<std::string> &keys, const reply_callback_t &reply_callback);
1079 
1080  std::future<reply> pfcount(const std::vector<std::string> &keys);
1081 
1082  client &pfmerge(const std::string &destkey, const std::vector<std::string> &sourcekeys,
1083  const reply_callback_t &reply_callback);
1084 
1085  std::future<reply> pfmerge(const std::string &destkey, const std::vector<std::string> &sourcekeys);
1086 
1087  client &ping(const reply_callback_t &reply_callback);
1088 
1089  std::future<reply> ping();
1090 
1091  client &ping(const std::string &message, const reply_callback_t &reply_callback);
1092 
1093  std::future<reply> ping(const std::string &message);
1094 
1095  client &
1096  psetex(const std::string &key, int ms, const std::string &val, const reply_callback_t &reply_callback);
1097 
1098  std::future<reply> psetex(const std::string &key, int ms, const std::string &val);
1099 
1100  client &publish(const std::string &channel, const std::string &message, const reply_callback_t &reply_callback);
1101 
1102  std::future<reply> publish(const std::string &channel, const std::string &message);
1103 
1104  client &pubsub(const std::string &subcommand, const std::vector<std::string> &args,
1105  const reply_callback_t &reply_callback);
1106 
1107  std::future<reply> pubsub(const std::string &subcommand, const std::vector<std::string> &args);
1108 
1109  client &pttl(const std::string &key, const reply_callback_t &reply_callback);
1110 
1111  std::future<reply> pttl(const std::string &key);
1112 
1113  client &quit(const reply_callback_t &reply_callback);
1114 
1115  std::future<reply> quit();
1116 
1117  client &randomkey(const reply_callback_t &reply_callback);
1118 
1119  std::future<reply> randomkey();
1120 
1121  client &readonly(const reply_callback_t &reply_callback);
1122 
1123  std::future<reply> readonly();
1124 
1125  client &readwrite(const reply_callback_t &reply_callback);
1126 
1127  std::future<reply> readwrite();
1128 
1129  client &rename(const std::string &key, const std::string &newkey, const reply_callback_t &reply_callback);
1130 
1131  std::future<reply> rename(const std::string &key, const std::string &newkey);
1132 
1133  client &renamenx(const std::string &key, const std::string &newkey, const reply_callback_t &reply_callback);
1134 
1135  std::future<reply> renamenx(const std::string &key, const std::string &newkey);
1136 
1137  client &restore(const std::string &key, int ttl, const std::string &serialized_value,
1138  const reply_callback_t &reply_callback);
1139 
1140  std::future<reply> restore(const std::string &key, int ttl, const std::string &serialized_value);
1141 
1142  client &restore(const std::string &key, int ttl, const std::string &serialized_value, const std::string &replace,
1143  const reply_callback_t &reply_callback);
1144 
1145  std::future<reply>
1146  restore(const std::string &key, int ttl, const std::string &serialized_value, const std::string &replace);
1147 
1148  client &role(const reply_callback_t &reply_callback);
1149 
1150  std::future<reply> role();
1151 
1152  client &rpop(const std::string &key, const reply_callback_t &reply_callback);
1153 
1154  std::future<reply> rpop(const std::string &key);
1155 
1156  client &
1157  rpoplpush(const std::string &source, const std::string &destination, const reply_callback_t &reply_callback);
1158 
1159  std::future<reply> rpoplpush(const std::string &src, const std::string &dst);
1160 
1161  client &
1162  rpush(const std::string &key, const std::vector<std::string> &values, const reply_callback_t &reply_callback);
1163 
1164  std::future<reply> rpush(const std::string &key, const std::vector<std::string> &values);
1165 
1166  client &rpushx(const std::string &key, const std::string &value, const reply_callback_t &reply_callback);
1167 
1168  std::future<reply> rpushx(const std::string &key, const std::string &value);
1169 
1170  client &
1171  sadd(const std::string &key, const std::vector<std::string> &members, const reply_callback_t &reply_callback);
1172 
1173  std::future<reply> sadd(const std::string &key, const std::vector<std::string> &members);
1174 
1175  client &save(const reply_callback_t &reply_callback);
1176 
1177  std::future<reply> save();
1178 
1179  client &scan(std::size_t cursor, const reply_callback_t &reply_callback);
1180 
1181  std::future<reply> scan(std::size_t cursor);
1182 
1183  client &scan(std::size_t cursor, const std::string &pattern, const reply_callback_t &reply_callback);
1184 
1185  std::future<reply> scan(std::size_t cursor, const std::string &pattern);
1186 
1187  client &scan(std::size_t cursor, std::size_t count, const reply_callback_t &reply_callback);
1188 
1189  std::future<reply> scan(std::size_t cursor, std::size_t count);
1190 
1191  client &
1192  scan(std::size_t cursor, const std::string &pattern, std::size_t count, const reply_callback_t &reply_callback);
1193 
1194  std::future<reply> scan(std::size_t cursor, const std::string &pattern, std::size_t count);
1195 
1196  client &scard(const std::string &key, const reply_callback_t &reply_callback);
1197 
1198  std::future<reply> scard(const std::string &key);
1199 
1200  client &script_debug(const std::string &mode, const reply_callback_t &reply_callback);
1201 
1202  std::future<reply> script_debug(const std::string &mode);
1203 
1204  client &script_exists(const std::vector<std::string> &scripts, const reply_callback_t &reply_callback);
1205 
1206  std::future<reply> script_exists(const std::vector<std::string> &scripts);
1207 
1208  client &script_flush(const reply_callback_t &reply_callback);
1209 
1210  std::future<reply> script_flush();
1211 
1212  client &script_kill(const reply_callback_t &reply_callback);
1213 
1214  std::future<reply> script_kill();
1215 
1216  client &script_load(const std::string &script, const reply_callback_t &reply_callback);
1217 
1218  std::future<reply> script_load(const std::string &script);
1219 
1220  client &sdiff(const std::vector<std::string> &keys, const reply_callback_t &reply_callback);
1221 
1222  std::future<reply> sdiff(const std::vector<std::string> &keys);
1223 
1224  client &sdiffstore(const std::string &destination, const std::vector<std::string> &keys,
1225  const reply_callback_t &reply_callback);
1226 
1227  std::future<reply> sdiffstore(const std::string &dst, const std::vector<std::string> &keys);
1228 
1229  client &select(int index, const reply_callback_t &reply_callback);
1230 
1231  std::future<reply> select(int index);
1232 
1233  client &set(const std::string &key, const std::string &value, const reply_callback_t &reply_callback);
1234 
1235  std::future<reply> set(const std::string &key, const std::string &value);
1236 
1237  client &set_advanced(const std::string &key, const std::string &value, const reply_callback_t &reply_callback);
1238 
1239  client &set_advanced(const std::string &key, const std::string &value, bool ex, int ex_sec, bool px, int px_milli,
1240  bool nx, bool xx, const reply_callback_t &reply_callback);
1241 
1242  std::future<reply>
1243  set_advanced(const std::string &key, const std::string &value, bool ex = false, int ex_sec = 0, bool px = false,
1244  int px_milli = 0, bool nx = false, bool xx = false);
1245 
1246  client &
1247  setbit_(const std::string &key, int offset, const std::string &value, const reply_callback_t &reply_callback);
1248 
1249  std::future<reply> setbit_(const std::string &key, int offset, const std::string &value);
1250 
1251  client &
1252  setex(const std::string &key, int seconds, const std::string &value, const reply_callback_t &reply_callback);
1253 
1254  std::future<reply> setex(const std::string &key, int seconds, const std::string &value);
1255 
1256  client &setnx(const std::string &key, const std::string &value, const reply_callback_t &reply_callback);
1257 
1258  std::future<reply> setnx(const std::string &key, const std::string &value);
1259 
1260  client &
1261  setrange(const std::string &key, int offset, const std::string &value, const reply_callback_t &reply_callback);
1262 
1263  std::future<reply> setrange(const std::string &key, int offset, const std::string &value);
1264 
1265  client &shutdown(const reply_callback_t &reply_callback);
1266 
1267  std::future<reply> shutdown();
1268 
1269  client &shutdown(const std::string &save, const reply_callback_t &reply_callback);
1270 
1271  std::future<reply> shutdown(const std::string &save);
1272 
1273  client &sinter(const std::vector<std::string> &keys, const reply_callback_t &reply_callback);
1274 
1275  std::future<reply> sinter(const std::vector<std::string> &keys);
1276 
1277  client &sinterstore(const std::string &destination, const std::vector<std::string> &keys,
1278  const reply_callback_t &reply_callback);
1279 
1280  std::future<reply> sinterstore(const std::string &dst, const std::vector<std::string> &keys);
1281 
1282  client &sismember(const std::string &key, const std::string &member, const reply_callback_t &reply_callback);
1283 
1284  std::future<reply> sismember(const std::string &key, const std::string &member);
1285 
1286  client &slaveof(const std::string &host, int port, const reply_callback_t &reply_callback);
1287 
1288  std::future<reply> slaveof(const std::string &host, int port);
1289 
1290  client &slowlog(std::string subcommand, const reply_callback_t &reply_callback);
1291 
1292  std::future<reply> slowlog(const std::string &subcommand);
1293 
1294  client &
1295  slowlog(std::string subcommand, const std::string &argument, const reply_callback_t &reply_callback);
1296 
1297  std::future<reply> slowlog(const std::string &subcommand, const std::string &argument);
1298 
1299  client &smembers(const std::string &key, const reply_callback_t &reply_callback);
1300 
1301  std::future<reply> smembers(const std::string &key);
1302 
1303  client &smove(const std::string &source, const std::string &destination, const std::string &member,
1304  const reply_callback_t &reply_callback);
1305 
1306  std::future<reply> smove(const std::string &src, const std::string &dst, const std::string &member);
1307 
1308  client &sort(const std::string &key, const reply_callback_t &reply_callback);
1309 
1310  std::future<reply> sort(const std::string &key);
1311 
1312  client &sort(const std::string &key, const std::vector<std::string> &get_patterns, bool asc_order, bool alpha,
1313  const reply_callback_t &reply_callback);
1314 
1315  std::future<reply>
1316  sort(const std::string &key, const std::vector<std::string> &get_patterns, bool asc_order, bool alpha);
1317 
1318  client &
1319  sort(const std::string &key, std::size_t offset, std::size_t count, const std::vector<std::string> &get_patterns,
1320  bool asc_order, bool alpha, const reply_callback_t &reply_callback);
1321 
1322  std::future<reply>
1323  sort(const std::string &key, std::size_t offset, std::size_t count, const std::vector<std::string> &get_patterns,
1324  bool asc_order, bool alpha);
1325 
1326  client &sort(const std::string &key, const std::string &by_pattern, const std::vector<std::string> &get_patterns,
1327  bool asc_order, bool alpha, const reply_callback_t &reply_callback);
1328 
1329  std::future<reply>
1330  sort(const std::string &key, const std::string &by_pattern, const std::vector<std::string> &get_patterns,
1331  bool asc_order, bool alpha);
1332 
1333  client &sort(const std::string &key, const std::vector<std::string> &get_patterns, bool asc_order, bool alpha,
1334  const std::string &store_dest, const reply_callback_t &reply_callback);
1335 
1336  std::future<reply>
1337  sort(const std::string &key, const std::vector<std::string> &get_patterns, bool asc_order, bool alpha,
1338  const std::string &store_dest);
1339 
1340  client &
1341  sort(const std::string &key, std::size_t offset, std::size_t count, const std::vector<std::string> &get_patterns,
1342  bool asc_order, bool alpha, const std::string &store_dest, const reply_callback_t &reply_callback);
1343 
1344  std::future<reply>
1345  sort(const std::string &key, std::size_t offset, std::size_t count, const std::vector<std::string> &get_patterns,
1346  bool asc_order, bool alpha, const std::string &store_dest);
1347 
1348  client &sort(const std::string &key, const std::string &by_pattern, const std::vector<std::string> &get_patterns,
1349  bool asc_order, bool alpha, const std::string &store_dest, const reply_callback_t &reply_callback);
1350 
1351  std::future<reply>
1352  sort(const std::string &key, const std::string &by_pattern, const std::vector<std::string> &get_patterns,
1353  bool asc_order, bool alpha, const std::string &store_dest);
1354 
1355  client &sort(const std::string &key, const std::string &by_pattern, std::size_t offset, std::size_t count,
1356  const std::vector<std::string> &get_patterns, bool asc_order, bool alpha,
1357  const reply_callback_t &reply_callback);
1358 
1359  std::future<reply>
1360  sort(const std::string &key, const std::string &by_pattern, std::size_t offset, std::size_t count,
1361  const std::vector<std::string> &get_patterns, bool asc_order, bool alpha);
1362 
1363  client &sort(const std::string &key, const std::string &by_pattern, std::size_t offset, std::size_t count,
1364  const std::vector<std::string> &get_patterns, bool asc_order, bool alpha,
1365  const std::string &store_dest, const reply_callback_t &reply_callback);
1366 
1367  std::future<reply>
1368  sort(const std::string &key, const std::string &by_pattern, std::size_t offset, std::size_t count,
1369  const std::vector<std::string> &get_patterns, bool asc_order, bool alpha, const std::string &store_dest);
1370 
1371  client &spop(const std::string &key, const reply_callback_t &reply_callback);
1372 
1373  std::future<reply> spop(const std::string &key);
1374 
1375  client &spop(const std::string &key, int count, const reply_callback_t &reply_callback);
1376 
1377  std::future<reply> spop(const std::string &key, int count);
1378 
1379  client &srandmember(const std::string &key, const reply_callback_t &reply_callback);
1380 
1381  std::future<reply> srandmember(const std::string &key);
1382 
1383  client &srandmember(const std::string &key, int count, const reply_callback_t &reply_callback);
1384 
1385  std::future<reply> srandmember(const std::string &key, int count);
1386 
1387  client &
1388  srem(const std::string &key, const std::vector<std::string> &members, const reply_callback_t &reply_callback);
1389 
1390  std::future<reply> srem(const std::string &key, const std::vector<std::string> &members);
1391 
1392  client &sscan(const std::string &key, std::size_t cursor, const reply_callback_t &reply_callback);
1393 
1394  std::future<reply> sscan(const std::string &key, std::size_t cursor);
1395 
1396  client &sscan(const std::string &key, std::size_t cursor, const std::string &pattern,
1397  const reply_callback_t &reply_callback);
1398 
1399  std::future<reply> sscan(const std::string &key, std::size_t cursor, const std::string &pattern);
1400 
1401  client &
1402  sscan(const std::string &key, std::size_t cursor, std::size_t count, const reply_callback_t &reply_callback);
1403 
1404  std::future<reply> sscan(const std::string &key, std::size_t cursor, std::size_t count);
1405 
1406  client &sscan(const std::string &key, std::size_t cursor, const std::string &pattern, std::size_t count,
1407  const reply_callback_t &reply_callback);
1408 
1409  std::future<reply>
1410  sscan(const std::string &key, std::size_t cursor, const std::string &pattern, std::size_t count);
1411 
1412  client &strlen(const std::string &key, const reply_callback_t &reply_callback);
1413 
1414  std::future<reply> strlen(const std::string &key);
1415 
1416  client &sunion(const std::vector<std::string> &keys, const reply_callback_t &reply_callback);
1417 
1418  std::future<reply> sunion(const std::vector<std::string> &keys);
1419 
1420  client &sunionstore(const std::string &destination, const std::vector<std::string> &keys,
1421  const reply_callback_t &reply_callback);
1422 
1423  std::future<reply> sunionstore(const std::string &dst, const std::vector<std::string> &keys);
1424 
1425  client &sync(const reply_callback_t &reply_callback);
1426 
1427  std::future<reply> sync();
1428 
1429  client &time(const reply_callback_t &reply_callback);
1430 
1431  std::future<reply> time();
1432 
1433  client &ttl(const std::string &key, const reply_callback_t &reply_callback);
1434 
1435  std::future<reply> ttl(const std::string &key);
1436 
1437  client &type(const std::string &key, const reply_callback_t &reply_callback);
1438 
1439  std::future<reply> type(const std::string &key);
1440 
1441  client &unwatch(const reply_callback_t &reply_callback);
1442 
1443  std::future<reply> unwatch();
1444 
1445  client &wait(int numslaves, int timeout, const reply_callback_t &reply_callback);
1446 
1447  std::future<reply> wait(int numslaves, int timeout);
1448 
1449  client &watch(const std::vector<std::string> &keys, const reply_callback_t &reply_callback);
1450 
1451  std::future<reply> watch(const std::vector<std::string> &keys);
1452 
1453  client &xack(const std::string &key, const std::string &group, const std::vector<std::string> &id_members,
1454  const reply_callback_t &reply_callback);
1455 
1456  std::future<reply>
1457  xack(const std::string &key, const std::string &group, const std::vector<std::string> &id_members);
1458 
1459  client &
1460  xadd(const std::string &key, const std::string &id, const std::multimap<std::string, std::string> &field_members,
1461  const reply_callback_t &reply_callback);
1462 
1463  std::future<reply>
1464  xadd(const std::string &key, const std::string &id, const std::multimap<std::string, std::string> &field_members);
1465 
1466  client &xclaim(const std::string &key, const std::string &group, const std::string &consumer, int min_idle_time,
1467  const std::vector<std::string> &id_members, const reply_callback_t &reply_callback);
1468 
1469  std::future<reply>
1470  xclaim(const std::string &key, const std::string &group, const std::string &consumer, const int &min_idle_time,
1471  const std::vector<std::string> &id_members);
1472 
1473  client &
1474  xdel(const std::string &key, const std::vector<std::string> &id_members, const reply_callback_t &reply_callback);
1475 
1476  std::future<reply> xdel(const std::string &key, const std::vector<std::string> &id_members);
1477 
1478  client &
1479  xgroup_create(const std::string &key, const std::string &group_name, const reply_callback_t &reply_callback);
1480 
1481  client &
1482  xgroup_create(const std::string &key, const std::string &group_name, const std::string &id,
1483  const reply_callback_t &reply_callback);
1484 
1485  std::future<reply>
1486  xgroup_create(const std::string &key, const std::string &group_name, const std::string &id = "$");
1487 
1488  client &
1489  xgroup_set_id(const std::string &key, const std::string &group_name, const reply_callback_t &reply_callback);
1490 
1491  client &
1492  xgroup_set_id(const std::string &key, const std::string &group_name, const std::string &id,
1493  const reply_callback_t &reply_callback);
1494 
1495  std::future<reply>
1496  xgroup_set_id(const std::string &key, const std::string &group_name, const std::string &id = "$");
1497 
1498  client &
1499  xgroup_destroy(const std::string &key, const std::string &group_name, const reply_callback_t &reply_callback);
1500 
1501  std::future<reply> xgroup_destroy(const std::string &key, const std::string &group_name);
1502 
1503  client &
1504  xgroup_del_consumer(const std::string &key, const std::string &group_name, const std::string &consumer_name,
1505  const reply_callback_t &reply_callback);
1506 
1507  std::future<reply>
1508  xgroup_del_consumer(const std::string &key, const std::string &group_name, const std::string &consumer_name);
1509 
1516  client & xinfo_consumers(const std::string &key, const std::string &group_name, const reply_callback_t &reply_callback);
1517 
1524  std::future<reply> xinfo_consumers(const std::string &key, const std::string &group_name);
1525 
1532  client & xinfo_groups(const std::string &key, const reply_callback_t &reply_callback);
1533 
1539  std::future<reply> xinfo_groups(const std::string &key);
1540 
1541  client & xinfo_stream(const std::string &key, const reply_callback_t &reply_callback);
1542  std::future<reply> xinfo_stream(const std::string &key);
1543 
1553  client & xlen(const std::string &key, const reply_callback_t &reply_callback);
1559  std::future<reply> xlen(const std::string &key);
1560 
1561  client &zadd(const std::string &key, const std::vector<std::string> &options,
1562  const std::multimap<std::string, std::string> &score_members,
1563  const reply_callback_t &reply_callback);
1564 
1565  std::future<reply> zadd(const std::string &key, const std::vector<std::string> &options,
1566  const std::multimap<std::string, std::string> &score_members);
1567 
1568  client &zcard(const std::string &key, const reply_callback_t &reply_callback);
1569 
1570  std::future<reply> zcard(const std::string &key);
1571 
1572  client &zcount(const std::string &key, int min, int max, const reply_callback_t &reply_callback);
1573 
1574  std::future<reply> zcount(const std::string &key, int min, int max);
1575 
1576  client &zcount(const std::string &key, double min, double max, const reply_callback_t &reply_callback);
1577 
1578  std::future<reply> zcount(const std::string &key, double min, double max);
1579 
1580  client &zcount(const std::string &key, const std::string &min, const std::string &max,
1581  const reply_callback_t &reply_callback);
1582 
1583  std::future<reply> zcount(const std::string &key, const std::string &min, const std::string &max);
1584 
1585  client &
1586  zincrby(const std::string &key, int incr, const std::string &member, const reply_callback_t &reply_callback);
1587 
1588  std::future<reply> zincrby(const std::string &key, int incr, const std::string &member);
1589 
1590  client &
1591  zincrby(const std::string &key, double incr, const std::string &member, const reply_callback_t &reply_callback);
1592 
1593  std::future<reply> zincrby(const std::string &key, double incr, const std::string &member);
1594 
1595  client &zincrby(const std::string &key, const std::string &incr, const std::string &member,
1596  const reply_callback_t &reply_callback);
1597 
1598  std::future<reply> zincrby(const std::string &key, const std::string &incr, const std::string &member);
1599 
1600  client &zinterstore(const std::string &destination, std::size_t numkeys, const std::vector<std::string> &keys,
1601  std::vector<std::size_t> weights, aggregate_method method,
1602  const reply_callback_t &reply_callback);
1603 
1604  std::future<reply>
1605  zinterstore(const std::string &destination, std::size_t numkeys, const std::vector<std::string> &keys,
1606  std::vector<std::size_t> weights, aggregate_method method);
1607 
1608  client &zlexcount(const std::string &key, int min, int max, const reply_callback_t &reply_callback);
1609 
1610  std::future<reply> zlexcount(const std::string &key, int min, int max);
1611 
1612  client &zlexcount(const std::string &key, double min, double max, const reply_callback_t &reply_callback);
1613 
1614  std::future<reply> zlexcount(const std::string &key, double min, double max);
1615 
1616  client &zlexcount(const std::string &key, const std::string &min, const std::string &max,
1617  const reply_callback_t &reply_callback);
1618 
1619  std::future<reply> zlexcount(const std::string &key, const std::string &min, const std::string &max);
1620 
1621  client &zrange(const std::string &key, int start, int stop, const reply_callback_t &reply_callback);
1622 
1623  client &
1624  zrange(const std::string &key, int start, int stop, bool withscores, const reply_callback_t &reply_callback);
1625 
1626  std::future<reply> zrange(const std::string &key, int start, int stop, bool withscores = false);
1627 
1628  client &zrange(const std::string &key, double start, double stop, const reply_callback_t &reply_callback);
1629 
1630  client &zrange(const std::string &key, double start, double stop, bool withscores,
1631  const reply_callback_t &reply_callback);
1632 
1633  std::future<reply> zrange(const std::string &key, double start, double stop, bool withscores = false);
1634 
1635  client &zrange(const std::string &key, const std::string &start, const std::string &stop,
1636  const reply_callback_t &reply_callback);
1637 
1638  client &zrange(const std::string &key, const std::string &start, const std::string &stop, bool withscores,
1639  const reply_callback_t &reply_callback);
1640 
1641  std::future<reply>
1642  zrange(const std::string &key, const std::string &start, const std::string &stop, bool withscores = false);
1643 
1644  client &zrangebylex(const std::string &key, int min, int max, const reply_callback_t &reply_callback);
1645 
1646  client &
1647  zrangebylex(const std::string &key, int min, int max, bool withscores, const reply_callback_t &reply_callback);
1648 
1649  std::future<reply> zrangebylex(const std::string &key, int min, int max, bool withscores = false);
1650 
1651  client &zrangebylex(const std::string &key, double min, double max, const reply_callback_t &reply_callback);
1652 
1653  client &zrangebylex(const std::string &key, double min, double max, bool withscores,
1654  const reply_callback_t &reply_callback);
1655 
1656  std::future<reply> zrangebylex(const std::string &key, double min, double max, bool withscores = false);
1657 
1658  client &zrangebylex(const std::string &key, const std::string &min, const std::string &max,
1659  const reply_callback_t &reply_callback);
1660 
1661  client &zrangebylex(const std::string &key, const std::string &min, const std::string &max, bool withscores,
1662  const reply_callback_t &reply_callback);
1663 
1664  std::future<reply>
1665  zrangebylex(const std::string &key, const std::string &min, const std::string &max, bool withscores = false);
1666 
1667  client &zrangebylex(const std::string &key, int min, int max, std::size_t offset, std::size_t count,
1668  const reply_callback_t &reply_callback);
1669 
1670  client &
1671  zrangebylex(const std::string &key, int min, int max, std::size_t offset, std::size_t count, bool withscores,
1672  const reply_callback_t &reply_callback);
1673 
1674  std::future<reply> zrangebylex(const std::string &key, int min, int max, std::size_t offset, std::size_t count,
1675  bool withscores = false);
1676 
1677  client &zrangebylex(const std::string &key, double min, double max, std::size_t offset, std::size_t count,
1678  const reply_callback_t &reply_callback);
1679 
1680  client &zrangebylex(const std::string &key, double min, double max, std::size_t offset, std::size_t count,
1681  bool withscores, const reply_callback_t &reply_callback);
1682 
1683  std::future<reply>
1684  zrangebylex(const std::string &key, double min, double max, std::size_t offset, std::size_t count,
1685  bool withscores = false);
1686 
1687  client &zrangebylex(const std::string &key, const std::string &min, const std::string &max, std::size_t offset,
1688  std::size_t count, const reply_callback_t &reply_callback);
1689 
1690  client &zrangebylex(const std::string &key, const std::string &min, const std::string &max, std::size_t offset,
1691  std::size_t count, bool withscores, const reply_callback_t &reply_callback);
1692 
1693  std::future<reply>
1694  zrangebylex(const std::string &key, const std::string &min, const std::string &max, std::size_t offset,
1695  std::size_t count, bool withscores = false);
1696 
1697  client &zrangebyscore(const std::string &key, int min, int max, const reply_callback_t &reply_callback);
1698 
1699  client &
1700  zrangebyscore(const std::string &key, int min, int max, bool withscores, const reply_callback_t &reply_callback);
1701 
1702  std::future<reply> zrangebyscore(const std::string &key, int min, int max, bool withscores = false);
1703 
1704  client &zrangebyscore(const std::string &key, double min, double max, const reply_callback_t &reply_callback);
1705 
1706  client &zrangebyscore(const std::string &key, double min, double max, bool withscores,
1707  const reply_callback_t &reply_callback);
1708 
1709  std::future<reply> zrangebyscore(const std::string &key, double min, double max, bool withscores = false);
1710 
1711  client &zrangebyscore(const std::string &key, const std::string &min, const std::string &max,
1712  const reply_callback_t &reply_callback);
1713 
1714  client &zrangebyscore(const std::string &key, const std::string &min, const std::string &max, bool withscores,
1715  const reply_callback_t &reply_callback);
1716 
1717  std::future<reply>
1718  zrangebyscore(const std::string &key, const std::string &min, const std::string &max, bool withscores = false);
1719 
1720  client &zrangebyscore(const std::string &key, int min, int max, std::size_t offset, std::size_t count,
1721  const reply_callback_t &reply_callback);
1722 
1723  client &
1724  zrangebyscore(const std::string &key, int min, int max, std::size_t offset, std::size_t count, bool withscores,
1725  const reply_callback_t &reply_callback);
1726 
1727  std::future<reply> zrangebyscore(const std::string &key, int min, int max, std::size_t offset, std::size_t count,
1728  bool withscores = false);
1729 
1730  client &zrangebyscore(const std::string &key, double min, double max, std::size_t offset, std::size_t count,
1731  const reply_callback_t &reply_callback);
1732 
1733  client &zrangebyscore(const std::string &key, double min, double max, std::size_t offset, std::size_t count,
1734  bool withscores, const reply_callback_t &reply_callback);
1735 
1736  std::future<reply>
1737  zrangebyscore(const std::string &key, double min, double max, std::size_t offset, std::size_t count,
1738  bool withscores = false);
1739 
1740  client &zrangebyscore(const std::string &key, const std::string &min, const std::string &max, std::size_t offset,
1741  std::size_t count, const reply_callback_t &reply_callback);
1742 
1743  client &zrangebyscore(const std::string &key, const std::string &min, const std::string &max, std::size_t offset,
1744  std::size_t count, bool withscores, const reply_callback_t &reply_callback);
1745 
1746  std::future<reply>
1747  zrangebyscore(const std::string &key, const std::string &min, const std::string &max, std::size_t offset,
1748  std::size_t count, bool withscores = false);
1749 
1750  client &zrank(const std::string &key, const std::string &member, const reply_callback_t &reply_callback);
1751 
1752  std::future<reply> zrank(const std::string &key, const std::string &member);
1753 
1754  client &
1755  zrem(const std::string &key, const std::vector<std::string> &members, const reply_callback_t &reply_callback);
1756 
1757  std::future<reply> zrem(const std::string &key, const std::vector<std::string> &members);
1758 
1759  client &zremrangebylex(const std::string &key, int min, int max, const reply_callback_t &reply_callback);
1760 
1761  std::future<reply> zremrangebylex(const std::string &key, int min, int max);
1762 
1763  client &zremrangebylex(const std::string &key, double min, double max, const reply_callback_t &reply_callback);
1764 
1765  std::future<reply> zremrangebylex(const std::string &key, double min, double max);
1766 
1767  client &zremrangebylex(const std::string &key, const std::string &min, const std::string &max,
1768  const reply_callback_t &reply_callback);
1769 
1770  std::future<reply> zremrangebylex(const std::string &key, const std::string &min, const std::string &max);
1771 
1772  client &zremrangebyrank(const std::string &key, int start, int stop, const reply_callback_t &reply_callback);
1773 
1774  std::future<reply> zremrangebyrank(const std::string &key, int start, int stop);
1775 
1776  client &
1777  zremrangebyrank(const std::string &key, double start, double stop, const reply_callback_t &reply_callback);
1778 
1779  std::future<reply> zremrangebyrank(const std::string &key, double start, double stop);
1780 
1781  client &zremrangebyrank(const std::string &key, const std::string &start, const std::string &stop,
1782  const reply_callback_t &reply_callback);
1783 
1784  std::future<reply> zremrangebyrank(const std::string &key, const std::string &start, const std::string &stop);
1785 
1786  client &zremrangebyscore(const std::string &key, int min, int max, const reply_callback_t &reply_callback);
1787 
1788  std::future<reply> zremrangebyscore(const std::string &key, int min, int max);
1789 
1790  client &zremrangebyscore(const std::string &key, double min, double max, const reply_callback_t &reply_callback);
1791 
1792  std::future<reply> zremrangebyscore(const std::string &key, double min, double max);
1793 
1794  client &zremrangebyscore(const std::string &key, const std::string &min, const std::string &max,
1795  const reply_callback_t &reply_callback);
1796 
1797  std::future<reply> zremrangebyscore(const std::string &key, const std::string &min, const std::string &max);
1798 
1799  client &zrevrange(const std::string &key, int start, int stop, const reply_callback_t &reply_callback);
1800 
1801  client &
1802  zrevrange(const std::string &key, int start, int stop, bool withscores, const reply_callback_t &reply_callback);
1803 
1804  std::future<reply> zrevrange(const std::string &key, int start, int stop, bool withscores = false);
1805 
1806  client &zrevrange(const std::string &key, double start, double stop, const reply_callback_t &reply_callback);
1807 
1808  client &zrevrange(const std::string &key, double start, double stop, bool withscores,
1809  const reply_callback_t &reply_callback);
1810 
1811  std::future<reply> zrevrange(const std::string &key, double start, double stop, bool withscores = false);
1812 
1813  client &zrevrange(const std::string &key, const std::string &start, const std::string &stop,
1814  const reply_callback_t &reply_callback);
1815 
1816  client &zrevrange(const std::string &key, const std::string &start, const std::string &stop, bool withscores,
1817  const reply_callback_t &reply_callback);
1818 
1819  std::future<reply>
1820  zrevrange(const std::string &key, const std::string &start, const std::string &stop, bool withscores = false);
1821 
1822  client &zrevrangebylex(const std::string &key, int max, int min, const reply_callback_t &reply_callback);
1823 
1824  client &
1825  zrevrangebylex(const std::string &key, int max, int min, bool withscores, const reply_callback_t &reply_callback);
1826 
1827  std::future<reply> zrevrangebylex(const std::string &key, int max, int min, bool withscores = false);
1828 
1829  client &zrevrangebylex(const std::string &key, double max, double min, const reply_callback_t &reply_callback);
1830 
1831  client &zrevrangebylex(const std::string &key, double max, double min, bool withscores,
1832  const reply_callback_t &reply_callback);
1833 
1834  std::future<reply> zrevrangebylex(const std::string &key, double max, double min, bool withscores = false);
1835 
1836  client &zrevrangebylex(const std::string &key, const std::string &max, const std::string &min,
1837  const reply_callback_t &reply_callback);
1838 
1839  client &zrevrangebylex(const std::string &key, const std::string &max, const std::string &min, bool withscores,
1840  const reply_callback_t &reply_callback);
1841 
1842  std::future<reply>
1843  zrevrangebylex(const std::string &key, const std::string &max, const std::string &min, bool withscores = false);
1844 
1845  client &zrevrangebylex(const std::string &key, int max, int min, std::size_t offset, std::size_t count,
1846  const reply_callback_t &reply_callback);
1847 
1848  client &
1849  zrevrangebylex(const std::string &key, int max, int min, std::size_t offset, std::size_t count, bool withscores,
1850  const reply_callback_t &reply_callback);
1851 
1852  std::future<reply> zrevrangebylex(const std::string &key, int max, int min, std::size_t offset, std::size_t count,
1853  bool withscores = false);
1854 
1855  client &zrevrangebylex(const std::string &key, double max, double min, std::size_t offset, std::size_t count,
1856  const reply_callback_t &reply_callback);
1857 
1858  client &zrevrangebylex(const std::string &key, double max, double min, std::size_t offset, std::size_t count,
1859  bool withscores, const reply_callback_t &reply_callback);
1860 
1861  std::future<reply>
1862  zrevrangebylex(const std::string &key, double max, double min, std::size_t offset, std::size_t count,
1863  bool withscores = false);
1864 
1865  client &zrevrangebylex(const std::string &key, const std::string &max, const std::string &min, std::size_t offset,
1866  std::size_t count, const reply_callback_t &reply_callback);
1867 
1868  client &zrevrangebylex(const std::string &key, const std::string &max, const std::string &min, std::size_t offset,
1869  std::size_t count, bool withscores, const reply_callback_t &reply_callback);
1870 
1871  std::future<reply>
1872  zrevrangebylex(const std::string &key, const std::string &max, const std::string &min, std::size_t offset,
1873  std::size_t count, bool withscores = false);
1874 
1875  client &zrevrangebyscore(const std::string &key, int max, int min, const reply_callback_t &reply_callback);
1876 
1877  client &zrevrangebyscore(const std::string &key, int max, int min, bool withscores,
1878  const reply_callback_t &reply_callback);
1879 
1880  std::future<reply> zrevrangebyscore(const std::string &key, int max, int min, bool withscores = false);
1881 
1882  client &zrevrangebyscore(const std::string &key, double max, double min, const reply_callback_t &reply_callback);
1883 
1884  client &zrevrangebyscore(const std::string &key, double max, double min, bool withscores,
1885  const reply_callback_t &reply_callback);
1886 
1887  std::future<reply> zrevrangebyscore(const std::string &key, double max, double min, bool withscores = false);
1888 
1889  client &zrevrangebyscore(const std::string &key, const std::string &max, const std::string &min,
1890  const reply_callback_t &reply_callback);
1891 
1892  client &zrevrangebyscore(const std::string &key, const std::string &max, const std::string &min, bool withscores,
1893  const reply_callback_t &reply_callback);
1894 
1895  std::future<reply>
1896  zrevrangebyscore(const std::string &key, const std::string &max, const std::string &min, bool withscores = false);
1897 
1898  client &zrevrangebyscore(const std::string &key, int max, int min, std::size_t offset, std::size_t count,
1899  const reply_callback_t &reply_callback);
1900 
1901  client &
1902  zrevrangebyscore(const std::string &key, int max, int min, std::size_t offset, std::size_t count, bool withscores,
1903  const reply_callback_t &reply_callback);
1904 
1905  std::future<reply>
1906  zrevrangebyscore(const std::string &key, int max, int min, std::size_t offset, std::size_t count,
1907  bool withscores = false);
1908 
1909  client &zrevrangebyscore(const std::string &key, double max, double min, std::size_t offset, std::size_t count,
1910  const reply_callback_t &reply_callback);
1911 
1912  client &zrevrangebyscore(const std::string &key, double max, double min, std::size_t offset, std::size_t count,
1913  bool withscores, const reply_callback_t &reply_callback);
1914 
1915  std::future<reply>
1916  zrevrangebyscore(const std::string &key, double max, double min, std::size_t offset, std::size_t count,
1917  bool withscores = false);
1918 
1919  client &
1920  zrevrangebyscore(const std::string &key, const std::string &max, const std::string &min, std::size_t offset,
1921  std::size_t count, const reply_callback_t &reply_callback);
1922 
1923  client &
1924  zrevrangebyscore(const std::string &key, const std::string &max, const std::string &min, std::size_t offset,
1925  std::size_t count, bool withscores, const reply_callback_t &reply_callback);
1926 
1927  std::future<reply>
1928  zrevrangebyscore(const std::string &key, const std::string &max, const std::string &min, std::size_t offset,
1929  std::size_t count, bool withscores = false);
1930 
1931  client &zrevrank(const std::string &key, const std::string &member, const reply_callback_t &reply_callback);
1932 
1933  std::future<reply> zrevrank(const std::string &key, const std::string &member);
1934 
1935  client &zscan(const std::string &key, std::size_t cursor, const reply_callback_t &reply_callback);
1936 
1937  std::future<reply> zscan(const std::string &key, std::size_t cursor);
1938 
1939  client &zscan(const std::string &key, std::size_t cursor, const std::string &pattern,
1940  const reply_callback_t &reply_callback);
1941 
1942  std::future<reply> zscan(const std::string &key, std::size_t cursor, const std::string &pattern);
1943 
1944  client &
1945  zscan(const std::string &key, std::size_t cursor, std::size_t count, const reply_callback_t &reply_callback);
1946 
1947  std::future<reply> zscan(const std::string &key, std::size_t cursor, std::size_t count);
1948 
1949  client &zscan(const std::string &key, std::size_t cursor, const std::string &pattern, std::size_t count,
1950  const reply_callback_t &reply_callback);
1951 
1952  std::future<reply>
1953  zscan(const std::string &key, std::size_t cursor, const std::string &pattern, std::size_t count);
1954 
1955  client &zscore(const std::string &key, const std::string &member, const reply_callback_t &reply_callback);
1956 
1957  std::future<reply> zscore(const std::string &key, const std::string &member);
1958 
1959  client &zunionstore(const std::string &destination, std::size_t numkeys, const std::vector<std::string> &keys,
1960  std::vector<std::size_t> weights, aggregate_method method,
1961  const reply_callback_t &reply_callback);
1962 
1963  std::future<reply>
1964  zunionstore(const std::string &destination, std::size_t numkeys, const std::vector<std::string> &keys,
1965  std::vector<std::size_t> weights, aggregate_method method);
1966 
1967  private:
1969  template<typename T>
1970  typename std::enable_if<std::is_same<T, client_type>::value>::type
1971  client_kill_unpack_arg(std::vector<std::string> &redis_cmd, reply_callback_t &, client_type type);
1972 
1973  template<typename T>
1974  typename std::enable_if<std::is_same<T, bool>::value>::type
1975  client_kill_unpack_arg(std::vector<std::string> &redis_cmd, reply_callback_t &, bool skip);
1976 
1977  template<typename T>
1978  typename std::enable_if<std::is_integral<T>::value>::type
1979  client_kill_unpack_arg(std::vector<std::string> &redis_cmd, reply_callback_t &, uint64_t id);
1980 
1981  template<typename T>
1982  typename std::enable_if<std::is_class<T>::value>::type
1983  client_kill_unpack_arg(std::vector<std::string> &, reply_callback_t &reply_callback, const T &cb);
1984 
1985  template<typename T, typename... Ts>
1986  void
1987  client_kill_impl(std::vector<std::string> &redis_cmd, reply_callback_t &reply, const T &arg, const Ts &... args);
1988 
1989  template<typename T>
1990  void
1991  client_kill_impl(std::vector<std::string> &redis_cmd, reply_callback_t &reply, const T &arg);
1992 
1993  private:
1995  client &
1996  sort(const std::string &key, const std::string &by_pattern, bool limit, std::size_t offset, std::size_t count,
1997  const std::vector<std::string> &get_patterns, bool asc_order, bool alpha, const std::string &store_dest,
1998  const reply_callback_t &reply_callback);
1999 
2001  client &zrevrangebyscore(const std::string &key, const std::string &max, const std::string &min, bool limit,
2002  std::size_t offset, std::size_t count, bool withscores,
2003  const reply_callback_t &reply_callback);
2004 
2006  client &zrangebyscore(const std::string &key, const std::string &min, const std::string &max, bool limit,
2007  std::size_t offset, std::size_t count, bool withscores,
2008  const reply_callback_t &reply_callback);
2009 
2011  client &zrevrangebylex(const std::string &key, const std::string &max, const std::string &min, bool limit,
2012  std::size_t offset, std::size_t count, bool withscores,
2013  const reply_callback_t &reply_callback);
2014 
2016  client &zrangebylex(const std::string &key, const std::string &min, const std::string &max, bool limit,
2017  std::size_t offset, std::size_t count, bool withscores,
2018  const reply_callback_t &reply_callback);
2019 
2020  private:
2027  void connection_receive_handler(network::redis_connection &connection, reply &reply);
2028 
2034  void connection_disconnection_handler(network::redis_connection &connection);
2035 
2039  void clear_callbacks();
2040 
2045  void try_commit();
2046 
2048  std::future<reply> exec_cmd(const std::function<client &(const reply_callback_t &)> &f);
2049 
2050  private:
2054  struct command_request {
2055  std::vector<std::string> command;
2056  reply_callback_t callback;
2057  };
2058 
2059  private:
2063  std::string m_redis_server;
2067  std::size_t m_redis_port = 0;
2071  std::string m_master_name;
2075  std::string m_password;
2079  int m_database_index = 0;
2080 
2084  network::redis_connection m_client;
2085 
2089  cpp_redis::sentinel m_sentinel;
2090 
2094  std::uint32_t m_connect_timeout_ms = 0;
2098  std::int32_t m_max_reconnects = 0;
2102  std::int32_t m_current_reconnect_attempts = 0;
2106  std::uint32_t m_reconnect_interval_ms = 0;
2107 
2111  std::atomic_bool m_reconnecting;
2115  std::atomic_bool m_cancel;
2116 
2120  std::queue<command_request> m_commands;
2121 
2125  connect_callback_t m_connect_callback;
2126 
2130  std::mutex m_callbacks_mutex;
2131 
2135  std::condition_variable m_sync_condvar;
2136 
2140  std::atomic<unsigned int> m_callbacks_running;
2141  }; // namespace cpp_redis
2142 
2143 } // namespace cpp_redis
2144 
2145 #include <cpp_redis/impl/client.ipp>
Definition: redis_connection.hpp:45
client & commit()
Definition: client.hpp:48
client & xinfo_consumers(const std::string &key, const std::string &group_name, const reply_callback_t &reply_callback)
introspection command used in order to retrieve different information about the consumer groups ...
std::function< void(reply &)> reply_callback_t
Definition: client.hpp:172
const sentinel & get_sentinel() const
client & operator=(const client &)=delete
assignment operator
client & sync_commit()
Definition: client.hpp:415
client & xlen(const std::string &key, const reply_callback_t &reply_callback)
Returns the number of entries inside a stream. If the specified key does not exist the command return...
geo_unit
Definition: client.hpp:355
bitfield_operation_type operation_type
Definition: client.hpp:419
client & client_kill(const std::string &host, int port, const T &arg, const Ts &... args)
Definition: client.ipp:93
Definition: reply.hpp:37
bool is_connected() const
static bitfield_operation incrby(const std::string &type, int offset, int increment, overflow_type overflow=overflow_type::server_default)
bitfield_operation_type
Definition: client.hpp:396
std::string aggregate_method_to_string(aggregate_method method) const
client & sync_commit(const std::chrono::duration< Rep, Period > &timeout)
Definition: client.hpp:220
std::string geo_unit_to_string(geo_unit unit) const
connect_state
Definition: client.hpp:71
void add_sentinel(const std::string &host, std::size_t port, std::uint32_t timeout_ms=0)
std::string type
Definition: client.hpp:424
std::string overflow_type_to_string(overflow_type type) const
void disconnect(bool wait_for_removal=false)
bool is_reconnecting() const
client & send(const std::vector< std::string > &redis_cmd, const reply_callback_t &callback)
Definition: sentinel.hpp:40
std::function< void(const std::string &host, std::size_t port, connect_state status)> connect_callback_t
Definition: client.hpp:109
client & xinfo_groups(const std::string &key, const reply_callback_t &reply_callback)
std::string bitfield_operation_type_to_string(bitfield_operation_type operation) const
overflow_type overflow
Definition: client.hpp:439
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_ms=0, std::int32_t max_reconnects=0, std::uint32_t reconnect_interval_ms=0)
client_type
Definition: client.hpp:54
std::future< reply > client_kill_future(T, const Ts...)
Definition: client.ipp:122
int offset
Definition: client.hpp:429
overflow_type
Definition: client.hpp:376
int value
Definition: client.hpp:434
Definition: array_builder.hpp:29
aggregate_method
Definition: client.hpp:335