userver: userver/storages/redis/impl/base.hpp Source File
⚠️ This is the documentation for an old userver version. Click here to switch to the latest version.
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages Concepts
base.hpp
1#pragma once
2
3#include <atomic>
4#include <chrono>
5#include <optional>
6#include <string>
7#include <vector>
8
9#include <userver/logging/fwd.hpp>
10#include <userver/utils/strong_typedef.hpp>
11
12#include <userver/storages/redis/command_control.hpp>
13#include <userver/storages/redis/impl/types.hpp>
14
15USERVER_NAMESPACE_BEGIN
16
17namespace storages::redis {
18class Client;
19} // namespace storages::redis
20
21namespace redis {
22
23using Password = utils::NonLoggable<class PasswordTag, std::string>;
24
25enum class ConnectionSecurity { kNone, kTLS };
26
27struct ConnectionInfo {
28 std::string host = "localhost";
29 int port = 26379;
30 Password password;
31 bool read_only = false;
32 ConnectionSecurity connection_security = ConnectionSecurity::kNone;
33 using HostVector = std::vector<std::string>;
34 HostVector resolved_host{};
35
36 ConnectionInfo() = default;
37 ConnectionInfo(std::string host, int port, Password password,
38 bool read_only = false,
39 ConnectionSecurity security = ConnectionSecurity::kNone,
40 HostVector resolved_host = {})
41 : host{std::move(host)},
42 port{port},
43 password{std::move(password)},
44 read_only{read_only},
45 connection_security(security),
46 resolved_host(std::move(resolved_host)) {}
47};
48
49struct Stat {
50 double tps = 0.0;
51 double queue = 0.0;
52 double inprogress = 0.0;
53 double timeouts = 0.0;
54};
55
56class CmdArgs {
57 public:
58 using CmdArgsArray = std::vector<std::string>;
60
61 CmdArgs() = default;
62
63 template <typename... Args>
64 CmdArgs(Args&&... _args) {
65 Then(std::forward<Args>(_args)...);
66 }
67
68 CmdArgs(const CmdArgs& o) = delete;
69 CmdArgs(CmdArgs&& o) = default;
70
71 CmdArgs& operator=(const CmdArgs& o) = delete;
72 CmdArgs& operator=(CmdArgs&& o) = default;
73
74 template <typename... Args>
75 CmdArgs& Then(Args&&... _args);
76
77 CmdArgs Clone() const {
78 CmdArgs r;
79 r.args = args;
80 return r;
81 }
82
83 CmdArgsChain args;
84};
85
86logging::LogHelper& operator<<(logging::LogHelper& os, const CmdArgs& v);
87
88using ScanCursor = int64_t;
89
90template <typename Arg>
91typename std::enable_if<std::is_arithmetic<Arg>::value, void>::type PutArg(
92 CmdArgs::CmdArgsArray& args_, const Arg& arg) {
93 args_.emplace_back(std::to_string(arg));
94}
95
96void PutArg(CmdArgs::CmdArgsArray& args_, const char* arg);
97
98void PutArg(CmdArgs::CmdArgsArray& args_, const std::string& arg);
99
100void PutArg(CmdArgs::CmdArgsArray& args_, std::string&& arg);
101
102void PutArg(CmdArgs::CmdArgsArray& args_, const std::vector<std::string>& arg);
103
104void PutArg(CmdArgs::CmdArgsArray& args_,
105 const std::vector<std::pair<std::string, std::string>>& arg);
106
107void PutArg(CmdArgs::CmdArgsArray& args_,
108 const std::vector<std::pair<double, std::string>>& arg);
109
110template <typename... Args>
111CmdArgs& CmdArgs::Then(Args&&... _args) {
112 args.emplace_back();
113 auto& new_args = args.back();
114 new_args.reserve(sizeof...(Args));
115 (PutArg(new_args, std::forward<Args>(_args)), ...);
116 return *this;
117}
118
120 bool buffering_enabled{false};
121 size_t commands_buffering_threshold{0};
122 std::chrono::microseconds watch_command_timer_interval{0};
123
124 constexpr bool operator==(const CommandsBufferingSettings& o) const {
125 return buffering_enabled == o.buffering_enabled &&
126 commands_buffering_threshold == o.commands_buffering_threshold &&
127 watch_command_timer_interval == o.watch_command_timer_interval;
128 }
129};
130
131enum class ConnectionMode {
132 kCommands,
133 kSubscriber,
134};
135
136struct MetricsSettings {
137 bool timings_enabled{true};
138 bool command_timings_enabled{false};
139 bool request_sizes_enabled{false};
140 bool reply_sizes_enabled{false};
141
142 constexpr bool operator==(const MetricsSettings& rhs) const {
143 return timings_enabled == rhs.timings_enabled &&
144 command_timings_enabled == rhs.command_timings_enabled &&
145 request_sizes_enabled == rhs.request_sizes_enabled &&
146 reply_sizes_enabled == rhs.reply_sizes_enabled;
147 }
148
149 constexpr bool operator!=(const MetricsSettings& rhs) const {
150 return !(*this == rhs);
151 }
152};
153
155 bool per_shard_stats_enabled{true};
156
157 constexpr bool operator==(const PubsubMetricsSettings& rhs) const {
158 return per_shard_stats_enabled == rhs.per_shard_stats_enabled;
159 }
160
161 constexpr bool operator!=(const PubsubMetricsSettings& rhs) const {
162 return !(*this == rhs);
163 }
164};
165
167 bool enable_monitoring{false};
168 bool restrict_requests{false};
169};
170
171} // namespace redis
172
173USERVER_NAMESPACE_END