diff --git a/include/pika_cache.h b/include/pika_cache.h index a6960cef02..11d5754a65 100644 --- a/include/pika_cache.h +++ b/include/pika_cache.h @@ -133,7 +133,7 @@ class PikaCache : public pstd::noncopyable, public std::enable_shared_from_this< rocksdb::Status RPushnx(std::string& key, std::vector &values, int64_t ttl); rocksdb::Status RPushnxWithoutTTL(std::string& key, std::vector &values); rocksdb::Status LPushIfKeyExist(std::string& key, std::vector &values); - + // Set Commands rocksdb::Status SAdd(std::string& key, std::vector& members); rocksdb::Status SAddIfKeyExist(std::string& key, std::vector& members); diff --git a/src/pika_cache.cc b/src/pika_cache.cc index 7bb9e89916..76edf80155 100644 --- a/src/pika_cache.cc +++ b/src/pika_cache.cc @@ -141,54 +141,69 @@ std::map PikaCache::TTL(std::string &key, std::map ret; int64_t timestamp = 0; - std::string CacheKeyPrefixK = PCacheKeyPrefixK + key; - int cache_indexk = CacheIndex(CacheKeyPrefixK); - s = caches_[cache_indexk]->TTL(CacheKeyPrefixK, ×tamp); - if (s.ok() || s.IsNotFound()) { - ret[storage::DataType::kStrings] = timestamp; - } else if (!s.IsNotFound()) { - ret[storage::DataType::kStrings] = -3; - (*type_status)[storage::DataType::kStrings] = s; - } - - std::string CacheKeyPrefixH = PCacheKeyPrefixH + key; - int cache_indexh = CacheIndex(CacheKeyPrefixH); - s = caches_[cache_indexh]->TTL(CacheKeyPrefixH, ×tamp); - if (s.ok() || s.IsNotFound()) { - ret[storage::DataType::kHashes] = timestamp; - } else if (!s.IsNotFound()) { - ret[storage::DataType::kHashes] = -3; - (*type_status)[storage::DataType::kHashes] = s; - } - - std::string CacheKeyPrefixL = PCacheKeyPrefixL + key; - int cache_indexl = CacheIndex(CacheKeyPrefixL); - s = caches_[cache_indexl]->TTL(CacheKeyPrefixL, ×tamp); - if (s.ok() || s.IsNotFound()) { - ret[storage::DataType::kLists] = timestamp; - } else if (!s.IsNotFound()) { - ret[storage::DataType::kLists] = -3; - (*type_status)[storage::DataType::kLists] = s; - } - - std::string CacheKeyPrefixS = PCacheKeyPrefixS + key; - int cache_indexs = CacheIndex(CacheKeyPrefixS); - s = caches_[cache_indexs]->TTL(CacheKeyPrefixS, ×tamp); - if (s.ok() || s.IsNotFound()) { - ret[storage::DataType::kSets] = timestamp; - } else if (!s.IsNotFound()) { - ret[storage::DataType::kSets] = -3; - (*type_status)[storage::DataType::kSets] = s; - } - - std::string CacheKeyPrefixZ = PCacheKeyPrefixZ + key; - int cache_indexz = CacheIndex(CacheKeyPrefixZ); - s = caches_[cache_indexz]->TTL(CacheKeyPrefixZ, ×tamp); - if (s.ok() || s.IsNotFound()) { - ret[storage::DataType::kZSets] = timestamp; - } else if (!s.IsNotFound()) { - ret[storage::DataType::kZSets] = -3; - (*type_status)[storage::DataType::kZSets] = s; + { + std::string CacheKeyPrefixK = PCacheKeyPrefixK + key; + int cache_indexk = CacheIndex(CacheKeyPrefixK); + std::lock_guard lm(*cache_mutexs_[cache_indexk]); + s = caches_[cache_indexk]->TTL(CacheKeyPrefixK, ×tamp); + if (s.ok() || s.IsNotFound()) { + ret[storage::DataType::kStrings] = timestamp; + } else if (!s.IsNotFound()) { + ret[storage::DataType::kStrings] = -3; + (*type_status)[storage::DataType::kStrings] = s; + } + } + + { + std::string CacheKeyPrefixH = PCacheKeyPrefixH + key; + int cache_indexh = CacheIndex(CacheKeyPrefixH); + std::lock_guard lm(*cache_mutexs_[cache_indexh]); + s = caches_[cache_indexh]->TTL(CacheKeyPrefixH, ×tamp); + if (s.ok() || s.IsNotFound()) { + ret[storage::DataType::kHashes] = timestamp; + } else if (!s.IsNotFound()) { + ret[storage::DataType::kHashes] = -3; + (*type_status)[storage::DataType::kHashes] = s; + } + } + + { + std::string CacheKeyPrefixL = PCacheKeyPrefixL + key; + int cache_indexl = CacheIndex(CacheKeyPrefixL); + std::lock_guard lm(*cache_mutexs_[cache_indexl]); + s = caches_[cache_indexl]->TTL(CacheKeyPrefixL, ×tamp); + if (s.ok() || s.IsNotFound()) { + ret[storage::DataType::kLists] = timestamp; + } else if (!s.IsNotFound()) { + ret[storage::DataType::kLists] = -3; + (*type_status)[storage::DataType::kLists] = s; + } + } + + { + std::string CacheKeyPrefixS = PCacheKeyPrefixS + key; + int cache_indexs = CacheIndex(CacheKeyPrefixS); + std::lock_guard lm(*cache_mutexs_[cache_indexs]); + s = caches_[cache_indexs]->TTL(CacheKeyPrefixS, ×tamp); + if (s.ok() || s.IsNotFound()) { + ret[storage::DataType::kSets] = timestamp; + } else if (!s.IsNotFound()) { + ret[storage::DataType::kSets] = -3; + (*type_status)[storage::DataType::kSets] = s; + } + } + + { + std::string CacheKeyPrefixZ = PCacheKeyPrefixZ + key; + int cache_indexz = CacheIndex(CacheKeyPrefixZ); + std::lock_guard lm(*cache_mutexs_[cache_indexz]); + s = caches_[cache_indexz]->TTL(CacheKeyPrefixZ, ×tamp); + if (s.ok() || s.IsNotFound()) { + ret[storage::DataType::kZSets] = timestamp; + } else if (!s.IsNotFound()) { + ret[storage::DataType::kZSets] = -3; + (*type_status)[storage::DataType::kZSets] = s; + } } return ret; } @@ -226,68 +241,83 @@ Status PikaCache::GetType(const std::string& key, bool single, std::vectorGet(CacheKeyPrefixK, &value); - if (s.ok()) { - types.emplace_back("string"); - } else if (!s.IsNotFound()) { - return s; - } - if (single && !types.empty()) { - return s; + { + std::string CacheKeyPrefixK = PCacheKeyPrefixK + key; + int cache_indexk = CacheIndex(CacheKeyPrefixK); + std::lock_guard lm(*cache_mutexs_[cache_indexk]); + s = caches_[cache_indexk]->Get(CacheKeyPrefixK, &value); + if (s.ok()) { + types.emplace_back("string"); + } else if (!s.IsNotFound()) { + return s; + } + if (single && !types.empty()) { + return s; + } } - uint64_t hashes_len = 0; - std::string CacheKeyPrefixH = PCacheKeyPrefixH + key; - int cache_indexh = CacheIndex(CacheKeyPrefixH); - s = caches_[cache_indexh]->HLen(CacheKeyPrefixH, &hashes_len); - if (s.ok() && hashes_len != 0) { - types.emplace_back("hash"); - } else if (!s.IsNotFound()) { - return s; - } - if (single && !types.empty()) { - return s; + { + uint64_t hashes_len = 0; + std::string CacheKeyPrefixH = PCacheKeyPrefixH + key; + int cache_indexh = CacheIndex(CacheKeyPrefixH); + std::lock_guard lm(*cache_mutexs_[cache_indexh]); + s = caches_[cache_indexh]->HLen(CacheKeyPrefixH, &hashes_len); + if (s.ok() && hashes_len != 0) { + types.emplace_back("hash"); + } else if (!s.IsNotFound()) { + return s; + } + if (single && !types.empty()) { + return s; + } } - uint64_t lists_len = 0; - std::string CacheKeyPrefixL = PCacheKeyPrefixL + key; - int cache_indexl = CacheIndex(CacheKeyPrefixL); - s = caches_[cache_indexl]->LLen(CacheKeyPrefixL, &lists_len); - if (s.ok() && lists_len != 0) { - types.emplace_back("list"); - } else if (!s.IsNotFound()) { - return s; - } - if (single && !types.empty()) { - return s; + { + uint64_t lists_len = 0; + std::string CacheKeyPrefixL = PCacheKeyPrefixL + key; + int cache_indexl = CacheIndex(CacheKeyPrefixL); + std::lock_guard lm(*cache_mutexs_[cache_indexl]); + s = caches_[cache_indexl]->LLen(CacheKeyPrefixL, &lists_len); + if (s.ok() && lists_len != 0) { + types.emplace_back("list"); + } else if (!s.IsNotFound()) { + return s; + } + if (single && !types.empty()) { + return s; + } } - uint64_t zsets_size = 0; - std::string CacheKeyPrefixZ = PCacheKeyPrefixZ + key; - int cache_indexz = CacheIndex(CacheKeyPrefixZ); - s = caches_[cache_indexz]->ZCard(CacheKeyPrefixZ, &zsets_size); - if (s.ok() && zsets_size != 0) { - types.emplace_back("zset"); - } else if (!s.IsNotFound()) { - return s; - } - if (single && !types.empty()) { - return s; + { + uint64_t zsets_size = 0; + std::string CacheKeyPrefixZ = PCacheKeyPrefixZ + key; + int cache_indexz = CacheIndex(CacheKeyPrefixZ); + std::lock_guard lm(*cache_mutexs_[cache_indexz]); + s = caches_[cache_indexz]->ZCard(CacheKeyPrefixZ, &zsets_size); + if (s.ok() && zsets_size != 0) { + types.emplace_back("zset"); + } else if (!s.IsNotFound()) { + return s; + } + if (single && !types.empty()) { + return s; + } } - uint64_t sets_size = 0; - std::string CacheKeyPrefixS = PCacheKeyPrefixS + key; - int cache_indexs = CacheIndex(CacheKeyPrefixS); - s = caches_[cache_indexs]->SCard(CacheKeyPrefixS, &sets_size); - if (s.ok() && sets_size != 0) { - types.emplace_back("set"); - } else if (!s.IsNotFound()) { - return s; - } - if (single && types.empty()) { - types.emplace_back("none"); + { + uint64_t sets_size = 0; + std::string CacheKeyPrefixS = PCacheKeyPrefixS + key; + int cache_indexs = CacheIndex(CacheKeyPrefixS); + std::lock_guard lm(*cache_mutexs_[cache_indexs]); + s = caches_[cache_indexs]->SCard(CacheKeyPrefixS, &sets_size); + if (s.ok() && sets_size != 0) { + types.emplace_back("set"); + } else if (!s.IsNotFound()) { + return s; + } + if (single && types.empty()) { + types.emplace_back("none"); + } } return Status::OK(); }