提交 a636aeac 编写于 作者: A antirez

Apply the new dictUnlink() where possible.

Optimizations suggested and originally implemented by @oranagra.
Re-applied by @antirez using the modified API.
上级 afcbcc0e
......@@ -478,8 +478,9 @@ dictEntry *dictUnlink(dict *ht, const void *key) {
}
/* You need to call this function to really free the entry after a call
* to dictUnlink(). */
* to dictUnlink(). It's safe to call this function with 'he' = NULL. */
void dictFreeUnlinkedEntry(dict *d, dictEntry *he) {
if (he == NULL) return;
dictFreeKey(d, he);
dictFreeVal(d, he);
zfree(he);
......
......@@ -57,7 +57,7 @@ int dbAsyncDelete(redisDb *db, robj *key) {
/* If the value is composed of a few allocations, to free in a lazy way
* is actually just slower... So under a certain limit we just free
* the object synchronously. */
dictEntry *de = dictFind(db->dict,key->ptr);
dictEntry *de = dictUnlink(db->dict,key->ptr);
if (de) {
robj *val = dictGetVal(de);
size_t free_effort = lazyfreeGetFreeEffort(val);
......@@ -73,7 +73,8 @@ int dbAsyncDelete(redisDb *db, robj *key) {
/* Release the key-val pair, or just the key if we set the val
* field to NULL in order to lazy free it later. */
if (dictDelete(db->dict,key->ptr) == DICT_OK) {
if (de) {
dictFreeUnlinkedEntry(db->dict,de);
if (server.cluster_enabled) slotToKeyDel(key);
return 1;
} else {
......
......@@ -1387,7 +1387,7 @@ int zsetDel(robj *zobj, sds ele) {
dictEntry *de;
double score;
de = dictFind(zs->dict,ele);
de = dictUnlink(zs->dict,ele);
if (de != NULL) {
/* Get the score in order to delete from the skiplist later. */
score = *(double*)dictGetVal(de);
......@@ -1397,12 +1397,11 @@ int zsetDel(robj *zobj, sds ele) {
* actually releases the SDS string representing the element,
* which is shared between the skiplist and the hash table, so
* we need to delete from the skiplist as the final step. */
int retval1 = dictDelete(zs->dict,ele);
dictFreeUnlinkedEntry(zs->dict,de);
/* Delete from skiplist. */
int retval2 = zslDelete(zs->zsl,score,ele,NULL);
serverAssert(retval1 == DICT_OK && retval2);
int retval = zslDelete(zs->zsl,score,ele,NULL);
serverAssert(retval);
if (htNeedsResize(zs->dict)) dictResize(zs->dict);
return 1;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册