Expireset should do a deep hash
Former-commit-id: cdcdf57dd1419ec09eab6579caf5e5ff9a5a242c
This commit is contained in:
parent
9c5400a223
commit
c4b9d485a1
@ -208,7 +208,7 @@ endif
|
|||||||
|
|
||||||
REDIS_SERVER_NAME=keydb-server
|
REDIS_SERVER_NAME=keydb-server
|
||||||
REDIS_SENTINEL_NAME=keydb-sentinel
|
REDIS_SENTINEL_NAME=keydb-sentinel
|
||||||
REDIS_SERVER_OBJ=adlist.o quicklist.o ae.o anet.o dict.o server.o sds.o zmalloc.o lzf_c.o lzf_d.o pqsort.o zipmap.o sha1.o ziplist.o release.o networking.o util.o object.o db.o replication.o rdb.o t_string.o t_list.o t_set.o t_zset.o t_hash.o config.o aof.o pubsub.o multi.o debug.o sort.o intset.o syncio.o cluster.o crc16.o endianconv.o slowlog.o scripting.o bio.o rio.o rand.o memtest.o crc64.o bitops.o sentinel.o notify.o setproctitle.o blocked.o hyperloglog.o latency.o sparkline.o redis-check-rdb.o redis-check-aof.o geo.o lazyfree.o module.o evict.o expire.o geohash.o geohash_helper.o childinfo.o defrag.o siphash.o rax.o t_stream.o listpack.o localtime.o acl.o storage.o rdb-s3.o fastlock.o new.o tracking.o AsyncWorkQueue.o snapshot.o storage/rocksdb.o storage/rocksdbfactory.o $(ASM_OBJ)
|
REDIS_SERVER_OBJ=adlist.o quicklist.o ae.o anet.o dict.o server.o sds.o zmalloc.o lzf_c.o lzf_d.o pqsort.o zipmap.o sha1.o ziplist.o release.o networking.o util.o object.o db.o replication.o rdb.o t_string.o t_list.o t_set.o t_zset.o t_hash.o config.o aof.o pubsub.o multi.o debug.o sort.o intset.o syncio.o cluster.o crc16.o endianconv.o slowlog.o scripting.o bio.o rio.o rand.o memtest.o crc64.o bitops.o sentinel.o notify.o setproctitle.o blocked.o hyperloglog.o latency.o sparkline.o redis-check-rdb.o redis-check-aof.o geo.o lazyfree.o module.o evict.o expire.o geohash.o geohash_helper.o childinfo.o defrag.o siphash.o rax.o t_stream.o listpack.o localtime.o acl.o storage.o rdb-s3.o fastlock.o new.o tracking.o AsyncWorkQueue.o snapshot.o storage/rocksdb.o storage/rocksdbfactory.o keydbutils.o $(ASM_OBJ)
|
||||||
REDIS_CLI_NAME=keydb-cli
|
REDIS_CLI_NAME=keydb-cli
|
||||||
REDIS_CLI_OBJ=anet.o adlist.o dict.o redis-cli.o redis-cli-cpphelper.o zmalloc.o release.o anet.o ae.o crc64.o siphash.o crc16.o storage-lite.o fastlock.o new.o $(ASM_OBJ)
|
REDIS_CLI_OBJ=anet.o adlist.o dict.o redis-cli.o redis-cli-cpphelper.o zmalloc.o release.o anet.o ae.o crc64.o siphash.o crc16.o storage-lite.o fastlock.o new.o $(ASM_OBJ)
|
||||||
REDIS_BENCHMARK_NAME=keydb-benchmark
|
REDIS_BENCHMARK_NAME=keydb-benchmark
|
||||||
|
@ -1319,7 +1319,6 @@ int redisDbPersistentData::removeExpire(robj *key, dict_iter itr) {
|
|||||||
trackkey(key);
|
trackkey(key);
|
||||||
auto itrExpire = m_setexpire->find(itr.key());
|
auto itrExpire = m_setexpire->find(itr.key());
|
||||||
serverAssert(itrExpire != m_setexpire->end());
|
serverAssert(itrExpire != m_setexpire->end());
|
||||||
serverAssert(itrExpire->key() == itr.key());
|
|
||||||
m_setexpire->erase(itrExpire);
|
m_setexpire->erase(itrExpire);
|
||||||
val->SetFExpires(false);
|
val->SetFExpires(false);
|
||||||
return 1;
|
return 1;
|
||||||
@ -1415,12 +1414,12 @@ void setExpire(client *c, redisDb *db, robj *key, expireEntry &&e)
|
|||||||
|
|
||||||
/* Return the expire time of the specified key, or null if no expire
|
/* Return the expire time of the specified key, or null if no expire
|
||||||
* is associated with this key (i.e. the key is non volatile) */
|
* is associated with this key (i.e. the key is non volatile) */
|
||||||
expireEntry *redisDbPersistentData::getExpire(robj_roptr key) {
|
expireEntry *redisDbPersistentDataSnapshot::getExpire(robj_roptr key) {
|
||||||
/* No expire? return ASAP */
|
/* No expire? return ASAP */
|
||||||
if (expireSize() == 0)
|
if (expireSize() == 0)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
auto itr = find(szFromObj(key));
|
auto itr = find_threadsafe(szFromObj(key));
|
||||||
if (itr == nullptr)
|
if (itr == nullptr)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
if (!itr.val()->FExpires())
|
if (!itr.val()->FExpires())
|
||||||
@ -1430,9 +1429,9 @@ expireEntry *redisDbPersistentData::getExpire(robj_roptr key) {
|
|||||||
return itrExpire.operator->();
|
return itrExpire.operator->();
|
||||||
}
|
}
|
||||||
|
|
||||||
const expireEntry *redisDbPersistentData::getExpire(robj_roptr key) const
|
const expireEntry *redisDbPersistentDataSnapshot::getExpire(robj_roptr key) const
|
||||||
{
|
{
|
||||||
return const_cast<redisDbPersistentData*>(this)->getExpire(key);
|
return const_cast<redisDbPersistentDataSnapshot*>(this)->getExpire(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Propagate expires into slaves and the AOF file.
|
/* Propagate expires into slaves and the AOF file.
|
||||||
|
@ -787,7 +787,7 @@ void sdstoupper(sds s) {
|
|||||||
* If two strings share exactly the same prefix, but one of the two has
|
* If two strings share exactly the same prefix, but one of the two has
|
||||||
* additional characters, the longer string is considered to be greater than
|
* additional characters, the longer string is considered to be greater than
|
||||||
* the smaller one. */
|
* the smaller one. */
|
||||||
int sdscmp(const sds s1, const sds s2) {
|
int sdscmp(const char *s1, const char *s2) {
|
||||||
size_t l1, l2, minlen;
|
size_t l1, l2, minlen;
|
||||||
int cmp;
|
int cmp;
|
||||||
|
|
||||||
|
44
src/sds.h
44
src/sds.h
@ -265,7 +265,7 @@ sds sdstrim(sds s, const char *cset);
|
|||||||
void sdsrange(sds s, ssize_t start, ssize_t end);
|
void sdsrange(sds s, ssize_t start, ssize_t end);
|
||||||
void sdsupdatelen(sds s);
|
void sdsupdatelen(sds s);
|
||||||
void sdsclear(sds s);
|
void sdsclear(sds s);
|
||||||
int sdscmp(const sds s1, const sds s2);
|
int sdscmp(const char *s1, const char *s2);
|
||||||
sds *sdssplitlen(const char *s, ssize_t len, const char *sep, int seplen, int *count);
|
sds *sdssplitlen(const char *s, ssize_t len, const char *sep, int seplen, int *count);
|
||||||
void sdsfreesplitres(sds *tokens, int count);
|
void sdsfreesplitres(sds *tokens, int count);
|
||||||
void sdstolower(sds s);
|
void sdstolower(sds s);
|
||||||
@ -298,6 +298,48 @@ int sdsTest(int argc, char *argv[]);
|
|||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class sdsview
|
||||||
|
{
|
||||||
|
const char *m_str;
|
||||||
|
|
||||||
|
public:
|
||||||
|
sdsview(sds str)
|
||||||
|
: m_str((const char*) str)
|
||||||
|
{}
|
||||||
|
|
||||||
|
sdsview(const char *str)
|
||||||
|
: m_str(str)
|
||||||
|
{}
|
||||||
|
|
||||||
|
bool operator<(const sdsview &other) const
|
||||||
|
{
|
||||||
|
return sdscmp(m_str, other.m_str) < 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator==(const sdsview &other) const
|
||||||
|
{
|
||||||
|
return sdscmp(m_str, other.m_str) == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator==(const char *other) const
|
||||||
|
{
|
||||||
|
return sdscmp(m_str, other) == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
char operator[](size_t idx) const
|
||||||
|
{
|
||||||
|
return m_str[idx];
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t size() const
|
||||||
|
{
|
||||||
|
return sdslen(m_str);
|
||||||
|
}
|
||||||
|
|
||||||
|
explicit operator const char*() const { return m_str; }
|
||||||
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -15,6 +15,18 @@
|
|||||||
|
|
||||||
extern uint64_t dictGenHashFunction(const void *key, int len);
|
extern uint64_t dictGenHashFunction(const void *key, int len);
|
||||||
|
|
||||||
|
namespace keydbutils
|
||||||
|
{
|
||||||
|
template<typename T>
|
||||||
|
size_t hash(const T& key)
|
||||||
|
{
|
||||||
|
return (size_t)dictGenHashFunction(&key, sizeof(key));
|
||||||
|
}
|
||||||
|
|
||||||
|
template<>
|
||||||
|
size_t hash(const sdsview &);
|
||||||
|
}
|
||||||
|
|
||||||
template<typename T, typename T_KEY = T, bool MEMMOVE_SAFE = false>
|
template<typename T, typename T_KEY = T, bool MEMMOVE_SAFE = false>
|
||||||
class semiorderedset
|
class semiorderedset
|
||||||
{
|
{
|
||||||
@ -281,7 +293,7 @@ private:
|
|||||||
|
|
||||||
size_t idxFromObj(const T_KEY &key)
|
size_t idxFromObj(const T_KEY &key)
|
||||||
{
|
{
|
||||||
size_t v = (size_t)dictGenHashFunction(&key, sizeof(key));
|
size_t v = keydbutils::hash(key);
|
||||||
return v & hashmask();
|
return v & hashmask();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
15
src/server.h
15
src/server.h
@ -1088,9 +1088,9 @@ public:
|
|||||||
const expireEntryFat *pfatentry() const { assert(FFat()); return u.m_pfatentry; }
|
const expireEntryFat *pfatentry() const { assert(FFat()); return u.m_pfatentry; }
|
||||||
|
|
||||||
|
|
||||||
bool operator==(const char *key) const noexcept
|
bool operator==(const sdsview &key) const noexcept
|
||||||
{
|
{
|
||||||
return this->key() == key;
|
return key == this->key();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool operator<(const expireEntry &e) const noexcept
|
bool operator<(const expireEntry &e) const noexcept
|
||||||
@ -1168,10 +1168,10 @@ public:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
explicit operator const char*() const noexcept { return key(); }
|
explicit operator sdsview() const noexcept { return key(); }
|
||||||
explicit operator long long() const noexcept { return when(); }
|
explicit operator long long() const noexcept { return when(); }
|
||||||
};
|
};
|
||||||
typedef semiorderedset<expireEntry, const char *, true /*expireEntry can be memmoved*/> expireset;
|
typedef semiorderedset<expireEntry, sdsview, true /*expireEntry can be memmoved*/> expireset;
|
||||||
|
|
||||||
/* The a string name for an object's type as listed above
|
/* The a string name for an object's type as listed above
|
||||||
* Native types are checked against the OBJ_STRING, OBJ_LIST, OBJ_* defines,
|
* Native types are checked against the OBJ_STRING, OBJ_LIST, OBJ_* defines,
|
||||||
@ -1310,8 +1310,6 @@ public:
|
|||||||
bool iterate(std::function<bool(const char*, robj*)> fn);
|
bool iterate(std::function<bool(const char*, robj*)> fn);
|
||||||
void setExpire(robj *key, robj *subkey, long long when);
|
void setExpire(robj *key, robj *subkey, long long when);
|
||||||
void setExpire(expireEntry &&e);
|
void setExpire(expireEntry &&e);
|
||||||
expireEntry *getExpire(robj_roptr key);
|
|
||||||
const expireEntry *getExpire(robj_roptr key) const;
|
|
||||||
void initialize();
|
void initialize();
|
||||||
|
|
||||||
void setStorageProvider(IStorage *pstorage);
|
void setStorageProvider(IStorage *pstorage);
|
||||||
@ -1389,10 +1387,12 @@ public:
|
|||||||
dict_iter random_threadsafe() const;
|
dict_iter random_threadsafe() const;
|
||||||
dict_iter find_threadsafe(const char *key) const;
|
dict_iter find_threadsafe(const char *key) const;
|
||||||
|
|
||||||
|
expireEntry *getExpire(robj_roptr key);
|
||||||
|
const expireEntry *getExpire(robj_roptr key) const;
|
||||||
|
|
||||||
// These need to be fixed
|
// These need to be fixed
|
||||||
using redisDbPersistentData::size;
|
using redisDbPersistentData::size;
|
||||||
using redisDbPersistentData::expireSize;
|
using redisDbPersistentData::expireSize;
|
||||||
using redisDbPersistentData::getExpire;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Redis database representation. There are multiple databases identified
|
/* Redis database representation. There are multiple databases identified
|
||||||
@ -1455,7 +1455,6 @@ typedef struct redisDb : public redisDbPersistentDataSnapshot
|
|||||||
using redisDbPersistentData::emptyDbAsync;
|
using redisDbPersistentData::emptyDbAsync;
|
||||||
using redisDbPersistentData::iterate;
|
using redisDbPersistentData::iterate;
|
||||||
using redisDbPersistentData::setExpire;
|
using redisDbPersistentData::setExpire;
|
||||||
using redisDbPersistentData::getExpire;
|
|
||||||
using redisDbPersistentData::trackChanges;
|
using redisDbPersistentData::trackChanges;
|
||||||
using redisDbPersistentData::processChanges;
|
using redisDbPersistentData::processChanges;
|
||||||
using redisDbPersistentData::commitChanges;
|
using redisDbPersistentData::commitChanges;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user