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