@@ -1261,17 +1261,46 @@ Status Redis::SetsRename(const Slice& key, Redis* new_inst, const Slice& newkey)
12611261 } else if (parsed_sets_meta_value.Count () == 0 ) {
12621262 return rocksdb::Status::NotFound ();
12631263 }
1264+
1265+ // query members
1266+ uint64_t version = 0 ;
1267+ std::vector<std::string> members;
1268+ version = parsed_sets_meta_value.Version ();
1269+ SetsMemberKey sets_member_key (key, version, Slice ());
1270+ Slice prefix = sets_member_key.EncodeSeekKey ();
1271+ KeyStatisticsDurationGuard guard (this , DataType::kSets , newkey.ToString ());
1272+ auto iter = db_->NewIterator (default_read_options_, handles_[kSetsDataCF ]);
1273+ for (iter->Seek (prefix); iter->Valid () && iter->key ().starts_with (prefix); iter->Next ()) {
1274+ ParsedSetsMemberKey parsed_sets_member_key (iter->key ());
1275+ members.push_back (parsed_sets_member_key.member ().ToString ());
1276+ }
1277+ delete iter;
1278+
12641279 // copy a new set with newkey
1265- statistic = parsed_sets_meta_value.Count ();
1266- s = new_inst->GetDB ()->Put (default_write_options_, handles_[kMetaCF ], base_meta_newkey.Encode (), meta_value);
1267- new_inst->UpdateSpecificKeyStatistics (DataType::kSets , newkey.ToString (), statistic);
1280+ auto batch = Batch::CreateBatch (this );
1281+ batch->Put (kMetaCF , base_meta_newkey.Encode (), meta_value);
1282+
1283+ // insert newkey datacf
1284+
1285+ for (const auto & member : members) {
1286+ SetsMemberKey new_sets_member_key (newkey, version, member);
1287+ BaseDataValue iter_value (Slice{});
1288+ batch->Put (kSetsDataCF , new_sets_member_key.Encode (), iter_value.Encode ());
1289+ }
12681290
12691291 // SetsDel key
1270- parsed_sets_meta_value.InitialMetaValue ();
1271- s = db_->Put (default_write_options_, handles_[kMetaCF ], base_meta_key.Encode (), meta_value);
1272- UpdateSpecificKeyStatistics (DataType::kSets , key.ToString (), statistic);
1292+ // parsed_sets_meta_value.InitialMetaValue();
1293+ // s = db_->Put(default_write_options_, handles_[kMetaCF], base_meta_key.Encode(), meta_value);
1294+ // UpdateSpecificKeyStatistics(DataType::kSets, key.ToString(), statistic);
1295+ batch->Delete (kMetaCF , base_meta_key.Encode ());
12731296
1274- return s;
1297+ // SetsDel data
1298+ for (const auto & member : members) {
1299+ SetsMemberKey base_sets_member_key (key, version, member);
1300+ batch->Delete (kSetsDataCF , base_sets_member_key.Encode ());
1301+ }
1302+
1303+ return batch->Commit ();
12751304}
12761305
12771306Status Redis::SetsRenamenx (const Slice& key, Redis* new_inst, const Slice& newkey) {
@@ -1307,16 +1336,45 @@ Status Redis::SetsRenamenx(const Slice& key, Redis* new_inst, const Slice& newke
13071336 }
13081337
13091338 // copy a new set with newkey
1310- statistic = parsed_sets_meta_value.Count ();
1311- s = new_inst->GetDB ()->Put (default_write_options_, handles_[kMetaCF ], base_meta_newkey.Encode (), meta_value);
1312- new_inst->UpdateSpecificKeyStatistics (DataType::kSets , newkey.ToString (), statistic);
1339+ // query members
1340+ uint64_t version = 0 ;
1341+ std::vector<std::string> members;
1342+ version = parsed_sets_meta_value.Version ();
1343+ SetsMemberKey sets_member_key (key, version, Slice ());
1344+ Slice prefix = sets_member_key.EncodeSeekKey ();
1345+ KeyStatisticsDurationGuard guard (this , DataType::kSets , newkey.ToString ());
1346+ auto iter = db_->NewIterator (default_read_options_, handles_[kSetsDataCF ]);
1347+ for (iter->Seek (prefix); iter->Valid () && iter->key ().starts_with (prefix); iter->Next ()) {
1348+ ParsedSetsMemberKey parsed_sets_member_key (iter->key ());
1349+ members.push_back (parsed_sets_member_key.member ().ToString ());
1350+ }
1351+ delete iter;
1352+
1353+ // copy a new set with newkey
1354+ auto batch = Batch::CreateBatch (this );
1355+ batch->Put (kMetaCF , base_meta_newkey.Encode (), meta_value);
1356+
1357+ // insert newkey datacf
1358+
1359+ for (const auto & member : members) {
1360+ SetsMemberKey new_sets_member_key (newkey, version, member);
1361+ BaseDataValue iter_value (Slice{});
1362+ batch->Put (kSetsDataCF , new_sets_member_key.Encode (), iter_value.Encode ());
1363+ }
13131364
13141365 // SetsDel key
1315- parsed_sets_meta_value.InitialMetaValue ();
1316- s = db_->Put (default_write_options_, handles_[kMetaCF ], base_meta_key.Encode (), meta_value);
1317- UpdateSpecificKeyStatistics (DataType::kSets , key.ToString (), statistic);
1366+ // parsed_sets_meta_value.InitialMetaValue();
1367+ // s = db_->Put(default_write_options_, handles_[kMetaCF], base_meta_key.Encode(), meta_value);
1368+ // UpdateSpecificKeyStatistics(DataType::kSets, key.ToString(), statistic);
1369+ batch->Delete (kMetaCF , base_meta_key.Encode ());
13181370
1319- return s;
1371+ // SetsDel data
1372+ for (const auto & member : members) {
1373+ SetsMemberKey base_sets_member_key (key, version, member);
1374+ batch->Delete (kSetsDataCF , base_sets_member_key.Encode ());
1375+ }
1376+
1377+ return batch->Commit ();
13201378}
13211379
13221380void Redis::ScanSets () {
0 commit comments