This is an automated email from the ASF dual-hosted git repository.

maplefu pushed a commit to branch try-to-use-mget-in-inserting
in repository https://gitbox.apache.org/repos/asf/kvrocks.git

commit 067950e7424f4dcdb59e312b3a1a418b56dd800f
Author: mwish <[email protected]>
AuthorDate: Sun Mar 10 01:17:22 2024 +0800

    trying to use mget in SADD
---
 src/types/redis_set.cc | 18 +++++++++++++++---
 1 file changed, 15 insertions(+), 3 deletions(-)

diff --git a/src/types/redis_set.cc b/src/types/redis_set.cc
index 35403b88..4b127f28 100644
--- a/src/types/redis_set.cc
+++ b/src/types/redis_set.cc
@@ -68,14 +68,26 @@ rocksdb::Status Set::Add(const Slice &user_key, const 
std::vector<Slice> &member
   WriteBatchLogData log_data(kRedisSet);
   batch->PutLogData(log_data.Encode());
   std::unordered_set<std::string_view> mset;
+  std::vector<std::string> set_subkeys;
+  std::vector<Slice> set_subkeys_slice;
   for (const auto &member : members) {
     if (!mset.insert(member.ToStringView()).second) {
       continue;
     }
     std::string sub_key = InternalKey(ns_key, member, metadata.version, 
storage_->IsSlotIdEncoded()).Encode();
-    s = storage_->Get(rocksdb::ReadOptions(), sub_key, &value);
-    if (s.ok()) continue;
-    batch->Put(sub_key, Slice());
+    set_subkeys.push_back(std::move(sub_key));
+    set_subkeys_slice.emplace_back(set_subkeys.back());
+  }
+  std::vector<rocksdb::PinnableSlice> dummy_values(set_subkeys_slice.size());
+  std::vector<rocksdb::Status> mget_status(set_subkeys_slice.size());
+  storage_->MultiGet(storage_->DefaultMultiGetOptions(), metadata_cf_handle_, 
set_subkeys.size(),
+                     set_subkeys_slice.data(), dummy_values.data(), 
mget_status.data());
+  dummy_values.clear();
+  set_subkeys_slice.clear();
+  set_subkeys.clear();
+  for (const auto &status : mget_status) {
+    if (!status.ok() && !s.IsNotFound()) return status;
+    if (status.IsNotFound()) continue;
     *added_cnt += 1;
   }
   if (*added_cnt > 0) {

Reply via email to