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);

Reply via email to