9#include <unordered_map>
10#include <unordered_set>
13#include <userver/engine/impl/context_accessor.hpp>
14#include <userver/storages/redis/exception.hpp>
15#include <userver/storages/redis/fwd.hpp>
16#include <userver/storages/redis/reply_types.hpp>
17#include <userver/storages/redis/request_data_base.hpp>
18#include <userver/storages/redis/scan_tag.hpp>
20USERVER_NAMESPACE_BEGIN
22namespace storages::
redis {
31template <
typename ResultType,
typename ReplyType>
32class [[nodiscard]] Request final {
34 using Result = ResultType;
35 using Reply = ReplyType;
38 : impl_(std::move(impl))
45 void Wait() { impl_->Wait(); }
52 ReplyType
Get(
const std::string& request_description = {}) {
return impl_->Get(request_description); }
56 engine::
impl::ContextAccessor* TryGetContextAccessor()
noexcept {
return impl_->TryGetContextAccessor(); }
59 template <
typename T1,
typename T2>
60 friend class RequestEval;
62 template <
typename T1,
typename T2>
63 friend class RequestEvalSha;
66 friend class RequestScanData;
68 template <
typename T1>
69 friend class RequestGeneric;
72 ReplyPtr GetRaw() {
return impl_->GetRaw(); }
82class ScanRequest final {
84 using ReplyElem =
typename ScanReplyElem<TScanTag>::type;
87 : impl_(std::move(impl))
90 template <
typename T = std::vector<ReplyElem>>
91 T GetAll(std::string request_description) {
92 SetRequestDescription(std::move(request_description));
96 template <
typename T = std::vector<ReplyElem>>
98 return T{begin(), end()};
101 void SetRequestDescription(std::string request_description) {
102 impl_->SetRequestDescription(std::move(request_description));
107 using iterator_category = std::input_iterator_tag;
108 using difference_type = ptrdiff_t;
109 using value_type = ReplyElem;
110 using reference = value_type&;
111 using pointer = value_type*;
113 explicit Iterator(ScanRequest* stream)
116 if (stream_ && !stream_->HasMore()) {
123 ReplyElemHolder(value_type reply_elem)
124 : reply_elem_(std::move(reply_elem))
127 value_type& operator*() {
return reply_elem_; }
130 value_type reply_elem_;
141 if (!stream_->HasMore()) {
147 reference operator*() {
return stream_->Current(); }
149 pointer operator->() {
return &**
this; }
151 bool operator==(
const Iterator& rhs)
const {
return stream_ == rhs.stream_; }
154 ScanRequest* stream_;
166 ReplyElem& Current() {
return impl_->Current(); }
168 ReplyElem Get() {
return impl_->Get(); }
170 bool HasMore() {
return !impl_->Eof(); }
179using RequestAppend = Request<size_t>;
180using RequestBitop = Request<size_t>;
181using RequestDbsize = Request<size_t>;
182using RequestDecr = Request<int64_t>;
183using RequestDel = Request<size_t>;
184using RequestUnlink = Request<size_t>;
185using RequestGenericCommon = Request<ReplyData>;
186using RequestEvalCommon = Request<ReplyData>;
187using RequestEvalShaCommon = Request<ReplyData>;
188using RequestScriptLoad = Request<std::string>;
189using RequestExec = Request<ReplyData,
void>;
190using RequestExists = Request<size_t>;
191using RequestExpire = Request<ExpireReply>;
192using RequestGeoadd = Request<size_t>;
193using RequestGeopos = Request<std::vector<std::optional<
Point>>>;
194using RequestGeoradius = Request<std::vector<GeoPoint>>;
195using RequestGeosearch = Request<std::vector<GeoPoint>>;
196using RequestGet = Request<std::optional<std::string>>;
197using RequestGetset = Request<std::optional<std::string>>;
198using RequestHdel = Request<size_t>;
199using RequestHexists = Request<size_t>;
200using RequestHget = Request<std::optional<std::string>>;
201using RequestHgetall = Request<std::unordered_map<std::string, std::string>>;
202using RequestHincrby = Request<int64_t>;
203using RequestHincrbyfloat = Request<
double>;
204using RequestHkeys = Request<std::vector<std::string>>;
205using RequestHlen = Request<size_t>;
206using RequestHmget = Request<std::vector<std::optional<std::string>>>;
207using RequestHmset = Request<StatusOk,
void>;
209using RequestHset = Request<HsetReply>;
210using RequestHsetnx = Request<size_t,
bool>;
211using RequestHvals = Request<std::vector<std::string>>;
212using RequestIncr = Request<int64_t>;
213using RequestKeys = Request<std::vector<std::string>>;
214using RequestLindex = Request<std::optional<std::string>>;
215using RequestLlen = Request<size_t>;
216using RequestLpop = Request<std::optional<std::string>>;
217using RequestLpush = Request<size_t>;
218using RequestLpushx = Request<size_t>;
219using RequestLrange = Request<std::vector<std::string>>;
220using RequestLrem = Request<size_t>;
221using RequestLtrim = Request<StatusOk,
void>;
222using RequestMget = Request<std::vector<std::optional<std::string>>>;
223using RequestMset = Request<StatusOk,
void>;
224using RequestPersist = Request<PersistReply>;
225using RequestPexpire = Request<ExpireReply>;
226using RequestPing = Request<StatusPong,
void>;
227using RequestPingMessage = Request<std::string>;
228using RequestPublish = Request<size_t>;
229using RequestRename = Request<StatusOk,
void>;
230using RequestRpop = Request<std::optional<std::string>>;
231using RequestRpush = Request<size_t>;
232using RequestRpushx = Request<size_t>;
233using RequestSadd = Request<size_t>;
235using RequestScard = Request<size_t>;
236using RequestSet = Request<StatusOk,
void>;
237using RequestSetIfExist = Request<std::optional<StatusOk>,
bool>;
238using RequestSetIfNotExist = Request<std::optional<StatusOk>,
bool>;
239using RequestSetIfNotExistOrGet = Request<std::optional<std::string>>;
240using RequestSetOptions = Request<SetReply>;
241using RequestSetex = Request<StatusOk,
void>;
242using RequestSismember = Request<size_t>;
243using RequestSmembers = Request<std::unordered_set<std::string>>;
244using RequestSrandmember = Request<std::optional<std::string>>;
245using RequestSrandmembers = Request<std::vector<std::string>>;
246using RequestSrem = Request<size_t>;
248using RequestStrlen = Request<size_t>;
249using RequestTime = Request<std::chrono::system_clock::time_point>;
250using RequestTtl = Request<TtlReply>;
251using RequestType = Request<
KeyType>;
252using RequestZadd = Request<size_t>;
253using RequestZaddIncr = Request<
double>;
254using RequestZaddIncrExisting = Request<std::optional<
double>>;
255using RequestZcard = Request<size_t>;
256using RequestZcount = Request<size_t>;
257using RequestZrange = Request<std::vector<std::string>>;
258using RequestZrangeWithScores = Request<std::vector<MemberScore>>;
259using RequestZrangebyscore = Request<std::vector<std::string>>;
260using RequestZrangebyscoreWithScores = Request<std::vector<MemberScore>>;
261using RequestZrem = Request<size_t>;
262using RequestZremrangebyrank = Request<size_t>;
263using RequestZremrangebyscore = Request<size_t>;
265using RequestZscore = Request<std::optional<
double>>;