9#include <unordered_map>
10#include <unordered_set>
13#include <userver/compiler/impl/lifetime.hpp>
14#include <userver/engine/awaitable.hpp>
15#include <userver/formats/json/value.hpp>
16#include <userver/storages/redis/exception.hpp>
17#include <userver/storages/redis/fwd.hpp>
18#include <userver/storages/redis/hexpiretime_reply.hpp>
19#include <userver/storages/redis/hpexpiretime_reply.hpp>
20#include <userver/storages/redis/pttl_reply.hpp>
21#include <userver/storages/redis/reply_types.hpp>
22#include <userver/storages/redis/request_data_base.hpp>
23#include <userver/storages/redis/scan_tag.hpp>
25USERVER_NAMESPACE_BEGIN
27namespace storages::
redis {
36template <
typename ResultType,
typename ReplyType>
39 using Result = ResultType;
40 using Reply = ReplyType;
43 : impl_(std::move(impl))
50 void Wait() { impl_->Wait(); }
57 ReplyType
Get(
const std::string& request_description = {}) {
return impl_->Get(request_description); }
61 return impl_->GetAwaitableToken();
64 template <
typename T1,
typename T2>
65 friend class RequestEval;
67 template <
typename T1,
typename T2>
68 friend class RequestEvalSha;
73 template <
typename T1>
74 friend class RequestGeneric;
77 ReplyPtr GetRaw() {
return impl_->GetRaw(); }
87class ScanRequest final {
92 : impl_(std::move(impl))
95 template <
typename T = std::vector<ReplyElem>>
96 T GetAll(std::string request_description) {
97 SetRequestDescription(std::move(request_description));
101 template <
typename T = std::vector<ReplyElem>>
103 return T{begin(), end()};
106 void SetRequestDescription(std::string request_description) {
107 impl_->SetRequestDescription(std::move(request_description));
112 using iterator_category = std::input_iterator_tag;
113 using difference_type = ptrdiff_t;
114 using value_type = ReplyElem;
115 using reference = value_type&;
116 using pointer = value_type*;
118 explicit Iterator(ScanRequest* stream)
121 if (stream_ && !stream_->HasMore()) {
128 ReplyElemHolder(value_type reply_elem)
129 : reply_elem_(std::move(reply_elem))
132 value_type& operator*() {
return reply_elem_; }
135 value_type reply_elem_;
146 if (!stream_->HasMore()) {
152 reference operator*() {
return stream_->Current(); }
154 pointer operator->() {
return &**
this; }
156 bool operator==(
const Iterator& rhs)
const {
return stream_ == rhs.stream_; }
159 ScanRequest* stream_;
171 ReplyElem& Current() {
return impl_->Current(); }
173 ReplyElem Get() {
return impl_->Get(); }
175 bool HasMore() {
return !impl_->Eof(); }
184using RequestAppend =
Request<size_t>;
185using RequestBitop =
Request<size_t>;
186using RequestDbsize =
Request<size_t>;
187using RequestDecr =
Request<int64_t>;
188using RequestDel =
Request<size_t>;
189using RequestUnlink =
Request<size_t>;
190using RequestGenericCommon =
Request<ReplyData>;
191using RequestEvalCommon =
Request<ReplyData>;
192using RequestEvalShaCommon =
Request<ReplyData>;
193using RequestScriptLoad =
Request<std::string>;
194using RequestExec =
Request<ReplyData,
void>;
195using RequestExists =
Request<size_t>;
196using RequestExpire =
Request<ExpireReply>;
197using RequestGeoadd =
Request<size_t>;
198using RequestGeopos =
Request<std::vector<std::optional<
Point>>>;
199using RequestGeoradius =
Request<std::vector<GeoPoint>>;
200using RequestGeosearch =
Request<std::vector<GeoPoint>>;
201using RequestGet =
Request<std::optional<std::string>>;
202using RequestGetset =
Request<std::optional<std::string>>;
203using RequestHdel =
Request<size_t>;
204using RequestHexists =
Request<size_t>;
205using RequestHget =
Request<std::optional<std::string>>;
206using RequestHgetall =
Request<std::unordered_map<std::string, std::string>>;
207using RequestHincrby =
Request<int64_t>;
208using RequestHincrbyfloat =
Request<
double>;
209using RequestHkeys =
Request<std::vector<std::string>>;
210using RequestHlen =
Request<size_t>;
211using RequestHmget =
Request<std::vector<std::optional<std::string>>>;
212using RequestHmset =
Request<StatusOk,
void>;
214using RequestHset =
Request<HsetReply>;
215using RequestHsetnx =
Request<size_t,
bool>;
216using RequestHvals =
Request<std::vector<std::string>>;
217using RequestIncr =
Request<int64_t>;
218using RequestKeys =
Request<std::vector<std::string>>;
219using RequestLindex =
Request<std::optional<std::string>>;
220using RequestLlen =
Request<size_t>;
221using RequestLpop =
Request<std::optional<std::string>>;
222using RequestLpush =
Request<size_t>;
223using RequestLpushx =
Request<size_t>;
224using RequestLrange =
Request<std::vector<std::string>>;
225using RequestLrem =
Request<size_t>;
226using RequestLtrim =
Request<StatusOk,
void>;
227using RequestMget =
Request<std::vector<std::optional<std::string>>>;
228using RequestMset =
Request<StatusOk,
void>;
229using RequestPersist =
Request<PersistReply>;
230using RequestPexpire =
Request<ExpireReply>;
231using RequestPing =
Request<StatusPong,
void>;
232using RequestPingMessage =
Request<std::string>;
233using RequestPublish =
Request<size_t>;
234using RequestRename =
Request<StatusOk,
void>;
235using RequestRpop =
Request<std::optional<std::string>>;
236using RequestRpush =
Request<size_t>;
237using RequestRpushx =
Request<size_t>;
238using RequestSadd =
Request<size_t>;
240using RequestScard =
Request<size_t>;
241using RequestSet =
Request<StatusOk,
void>;
242using RequestSetIfExist =
Request<std::optional<StatusOk>,
bool>;
243using RequestSetIfNotExist =
Request<std::optional<StatusOk>,
bool>;
244using RequestSetIfNotExistOrGet =
Request<std::optional<std::string>>;
245using RequestSetOptions =
Request<SetReply>;
246using RequestSetex =
Request<StatusOk,
void>;
247using RequestSetAndGetPrevious =
Request<std::optional<std::string>>;
248using RequestSismember =
Request<size_t>;
249using RequestSmembers =
Request<std::unordered_set<std::string>>;
250using RequestSrandmember =
Request<std::optional<std::string>>;
251using RequestSrandmembers =
Request<std::vector<std::string>>;
252using RequestSrem =
Request<size_t>;
254using RequestStrlen =
Request<size_t>;
255using RequestTime =
Request<std::chrono::system_clock::time_point>;
256using RequestTtl =
Request<TtlReply>;
258using RequestZadd =
Request<size_t>;
259using RequestZaddIncr =
Request<
double>;
260using RequestZaddIncrExisting =
Request<std::optional<
double>>;
261using RequestZcard =
Request<size_t>;
262using RequestZcount =
Request<size_t>;
263using RequestZrange =
Request<std::vector<std::string>>;
264using RequestZrangeWithScores =
Request<std::vector<MemberScore>>;
265using RequestZrangebyscore =
Request<std::vector<std::string>>;
266using RequestZrangebyscoreWithScores =
Request<std::vector<MemberScore>>;
267using RequestZrem =
Request<size_t>;
268using RequestZremrangebyrank =
Request<size_t>;
269using RequestZremrangebyscore =
Request<size_t>;
271using RequestZscore =
Request<std::optional<
double>>;
275using RequestHexpiretime =
Request<std::vector<HexpiretimeReply>>;
276using RequestHpexpiretime =
Request<std::vector<HpexpiretimeReply>>;
277using RequestHttl =
Request<std::vector<TtlReply>>;
278using RequestHpttl =
Request<std::vector<PttlReply>>;
280using RequestHgetex =
Request<std::vector<std::optional<std::string>>>;
284using RequestJsonSet =
Request<StatusOk,
void>;
285using RequestJsonSetIfExist =
Request<std::optional<StatusOk>,
bool>;
286using RequestJsonSetIfNotExist =
Request<std::optional<StatusOk>,
bool>;
288using RequestJsonMget =
Request<std::vector<std::optional<formats::
json::
Value>>>;
289using RequestJsonMset =
Request<StatusOk,
void>;