This is an automated email from the ASF dual-hosted git repository.
hulk pushed a commit to branch unstable
in repository https://gitbox.apache.org/repos/asf/kvrocks.git
The following commit(s) were added to refs/heads/unstable by this push:
new 27f2eb1f6 feat(conn): optimize RESP reply functions (#2847)
27f2eb1f6 is described below
commit 27f2eb1f6dd6d18ef2d682bcbfbb9abcca99bf75
Author: Twice <[email protected]>
AuthorDate: Sat Mar 22 19:39:26 2025 +0800
feat(conn): optimize RESP reply functions (#2847)
---
src/server/redis_reply.cc | 24 ++++++------------------
src/server/redis_reply.h | 35 ++++++++++++++++++++++++++++++++---
2 files changed, 38 insertions(+), 21 deletions(-)
diff --git a/src/server/redis_reply.cc b/src/server/redis_reply.cc
index 11a7eb12b..761217efd 100644
--- a/src/server/redis_reply.cc
+++ b/src/server/redis_reply.cc
@@ -60,15 +60,12 @@ std::string StatusToRedisErrorMsg(const Status &s) {
return prefix + " " + s.Msg();
}
-std::string BulkString(const std::string &data) { return "$" +
std::to_string(data.length()) + CRLF + data + CRLF; }
-
-std::string Array(const std::vector<std::string> &list) {
- size_t n = std::accumulate(list.begin(), list.end(), 0, [](size_t n, const
std::string &s) { return n + s.size(); });
- std::string result = MultiLen(list.size());
- std::string::size_type final_size = result.size() + n;
- result.reserve(final_size);
- for (const auto &i : list) result += i;
- return result;
+std::string BulkString(std::string_view data) {
+ std::string res = "$" + std::to_string(data.length()) + CRLF;
+ res.reserve(res.size() + data.size() + 2);
+ res += data;
+ res += CRLF;
+ return res;
}
std::string ArrayOfBulkStrings(const std::vector<std::string> &elems) {
@@ -131,13 +128,4 @@ std::string MapOfBulkStrings(RESP ver, const
std::vector<std::string> &elems) {
return result;
}
-std::string Map(RESP ver, const std::map<std::string, std::string> &map) {
- std::string result = HeaderOfMap(ver, map.size());
- for (const auto &pair : map) {
- result += pair.first;
- result += pair.second;
- }
- return result;
-}
-
} // namespace redis
diff --git a/src/server/redis_reply.h b/src/server/redis_reply.h
index 4a80124b2..1ee060bea 100644
--- a/src/server/redis_reply.h
+++ b/src/server/redis_reply.h
@@ -22,7 +22,9 @@
#include <event2/buffer.h>
+#include <initializer_list>
#include <map>
+#include <numeric>
#include <string>
#include <string_view>
#include <vector>
@@ -59,23 +61,38 @@ inline std::string NilString(RESP ver) {
return "$-1" CRLF;
}
-std::string BulkString(const std::string &data);
+std::string BulkString(std::string_view data);
template <typename T, std::enable_if_t<std::is_integral_v<T>, int> = 0>
std::string MultiLen(T len) {
return "*" + std::to_string(len) + CRLF;
}
-std::string Array(const std::vector<std::string> &list);
+template <typename Con>
+std::string Array(const Con &list) {
+ size_t total_size =
+ std::accumulate(list.begin(), list.end(), 0, [](size_t n, const auto &s)
{ return n + s.size(); });
+ std::string result = MultiLen(list.size());
+ result.reserve(result.size() + total_size);
+ for (const auto &i : list) result += i;
+ return result;
+}
+template <typename T>
+std::string Array(std::initializer_list<T> list) {
+ return Array<std::initializer_list<T>>(list);
+}
std::string ArrayOfBulkStrings(const std::vector<std::string> &elements);
std::string Bool(RESP ver, bool b);
+
inline std::string BigNumber(RESP ver, const std::string &n) {
return ver == RESP::v3 ? "(" + n + CRLF : BulkString(n);
}
+
inline std::string Double(RESP ver, double d) {
return ver == RESP::v3 ? "," + util::Float2String(d) + CRLF :
BulkString(util::Float2String(d));
}
+
// ext is the extension of file to send, 'txt' for text file, 'md ' for
markdown file
// at most 3 chars, padded with space
// if RESP is V2, treat verbatim string as blob string
@@ -89,6 +106,7 @@ inline std::string VerbatimString(RESP ver, std::string ext,
const std::string &
}
inline std::string NilArray(RESP ver) { return ver == RESP::v3 ? "_" CRLF :
"*-1" CRLF; }
+
std::string MultiBulkString(RESP ver, const std::vector<std::string> &values);
std::string MultiBulkString(RESP ver, const std::vector<std::string> &values,
const std::vector<rocksdb::Status> &statuses);
@@ -98,16 +116,27 @@ std::string HeaderOfSet(RESP ver, T len) {
return ver == RESP::v3 ? "~" + std::to_string(len) + CRLF : MultiLen(len);
}
std::string SetOfBulkStrings(RESP ver, const std::vector<std::string> &elems);
+
template <typename T, std::enable_if_t<std::is_integral_v<T>, int> = 0>
std::string HeaderOfMap(RESP ver, T len) {
return ver == RESP::v3 ? "%" + std::to_string(len) + CRLF : MultiLen(len *
2);
}
-std::string Map(RESP ver, const std::map<std::string, std::string> &map);
+template <typename Con>
+std::string Map(RESP ver, const Con &map) {
+ std::string result = HeaderOfMap(ver, map.size());
+ for (const auto &pair : map) {
+ result += pair.first;
+ result += pair.second;
+ }
+ return result;
+}
std::string MapOfBulkStrings(RESP ver, const std::vector<std::string> &elems);
+
template <typename T, std::enable_if_t<std::is_integral_v<T>, int> = 0>
std::string HeaderOfAttribute(T len) {
return "|" + std::to_string(len) + CRLF;
}
+
template <typename T, std::enable_if_t<std::is_integral_v<T>, int> = 0>
std::string HeaderOfPush(RESP ver, T len) {
return ver == RESP::v3 ? ">" + std::to_string(len) + CRLF : MultiLen(len);