userver: userver/storages/redis/impl/base.hpp Source File
Loading...
Searching...
No Matches
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