Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ruanhaishen
redis
Commits
dda0f37f
Commit
dda0f37f
authored
Apr 15, 2016
by
antirez
Browse files
ZREM refactored into proper API.
parent
6f926c3e
Changes
2
Hide whitespace changes
Inline
Side-by-side
src/server.h
View file @
dda0f37f
...
@@ -1332,6 +1332,7 @@ int zsetScore(robj *zobj, sds member, double *score);
...
@@ -1332,6 +1332,7 @@ int zsetScore(robj *zobj, sds member, double *score);
unsigned
long
zslGetRank
(
zskiplist
*
zsl
,
double
score
,
sds
o
);
unsigned
long
zslGetRank
(
zskiplist
*
zsl
,
double
score
,
sds
o
);
int
zsetAdd
(
robj
*
zobj
,
double
score
,
sds
ele
,
int
*
flags
,
double
*
newscore
);
int
zsetAdd
(
robj
*
zobj
,
double
score
,
sds
ele
,
int
*
flags
,
double
*
newscore
);
long
zsetRank
(
robj
*
zobj
,
sds
ele
,
int
reverse
);
long
zsetRank
(
robj
*
zobj
,
sds
ele
,
int
reverse
);
int
zsetDel
(
robj
*
zobj
,
sds
ele
);
/* Core functions */
/* Core functions */
int
freeMemoryIfNeeded
(
void
);
int
freeMemoryIfNeeded
(
void
);
...
...
src/t_zset.c
View file @
dda0f37f
...
@@ -1370,6 +1370,47 @@ int zsetAdd(robj *zobj, double score, sds ele, int *flags, double *newscore) {
...
@@ -1370,6 +1370,47 @@ int zsetAdd(robj *zobj, double score, sds ele, int *flags, double *newscore) {
return
0
;
/* Never reached. */
return
0
;
/* Never reached. */
}
}
/* Delete the element 'ele' from the sorted set, returning 1 if the element
* existed and was deleted, 0 otherwise (the element was not there). */
int
zsetDel
(
robj
*
zobj
,
sds
ele
)
{
if
(
zobj
->
encoding
==
OBJ_ENCODING_ZIPLIST
)
{
unsigned
char
*
eptr
;
if
((
eptr
=
zzlFind
(
zobj
->
ptr
,
ele
,
NULL
))
!=
NULL
)
{
zobj
->
ptr
=
zzlDelete
(
zobj
->
ptr
,
eptr
);
return
1
;
}
}
else
if
(
zobj
->
encoding
==
OBJ_ENCODING_SKIPLIST
)
{
zset
*
zs
=
zobj
->
ptr
;
dictEntry
*
de
;
double
score
;
de
=
dictFind
(
zs
->
dict
,
ele
);
if
(
de
!=
NULL
)
{
/* Get the score in order to delete from the skiplist later. */
score
=
*
(
double
*
)
dictGetVal
(
de
);
/* Delete from the hash table and later from the skiplist.
* Note that the order is important: deleting from the skiplist
* 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
);
/* Delete from skiplist. */
int
retval2
=
zslDelete
(
zs
->
zsl
,
score
,
ele
,
NULL
);
serverAssert
(
retval1
==
DICT_OK
&&
retval2
);
if
(
htNeedsResize
(
zs
->
dict
))
dictResize
(
zs
->
dict
);
return
1
;
}
}
else
{
serverPanic
(
"Unknown sorted set encoding"
);
}
return
0
;
/* No such element found. */
}
/* Given a sorted set object returns the 0-based rank of the object or
/* Given a sorted set object returns the 0-based rank of the object or
* -1 if the object does not exist.
* -1 if the object does not exist.
*
*
...
@@ -1579,56 +1620,13 @@ void zremCommand(client *c) {
...
@@ -1579,56 +1620,13 @@ void zremCommand(client *c) {
if
((
zobj
=
lookupKeyWriteOrReply
(
c
,
key
,
shared
.
czero
))
==
NULL
||
if
((
zobj
=
lookupKeyWriteOrReply
(
c
,
key
,
shared
.
czero
))
==
NULL
||
checkType
(
c
,
zobj
,
OBJ_ZSET
))
return
;
checkType
(
c
,
zobj
,
OBJ_ZSET
))
return
;
if
(
zobj
->
encoding
==
OBJ_ENCODING_ZIPLIST
)
{
for
(
j
=
2
;
j
<
c
->
argc
;
j
++
)
{
unsigned
char
*
eptr
;
if
(
zsetDel
(
zobj
,
c
->
argv
[
j
]
->
ptr
))
deleted
++
;
if
(
zsetLength
(
zobj
)
==
0
)
{
for
(
j
=
2
;
j
<
c
->
argc
;
j
++
)
{
dbDelete
(
c
->
db
,
key
);
if
((
eptr
=
zzlFind
(
zobj
->
ptr
,
c
->
argv
[
j
]
->
ptr
,
NULL
))
!=
NULL
)
{
keyremoved
=
1
;
deleted
++
;
break
;
zobj
->
ptr
=
zzlDelete
(
zobj
->
ptr
,
eptr
);
if
(
zzlLength
(
zobj
->
ptr
)
==
0
)
{
dbDelete
(
c
->
db
,
key
);
keyremoved
=
1
;
break
;
}
}
}
}
else
if
(
zobj
->
encoding
==
OBJ_ENCODING_SKIPLIST
)
{
zset
*
zs
=
zobj
->
ptr
;
dictEntry
*
de
;
double
score
;
for
(
j
=
2
;
j
<
c
->
argc
;
j
++
)
{
de
=
dictFind
(
zs
->
dict
,
c
->
argv
[
j
]
->
ptr
);
if
(
de
!=
NULL
)
{
deleted
++
;
/* Get the score in order to delete from the skiplist later. */
score
=
*
(
double
*
)
dictGetVal
(
de
);
/* Delete from the hash table and later from the skiplist.
* Note that the order is important: deleting from the skiplist
* 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
,
c
->
argv
[
j
]
->
ptr
);
/* Delete from skiplist. */
int
retval2
=
zslDelete
(
zs
->
zsl
,
score
,
c
->
argv
[
j
]
->
ptr
,
NULL
);
serverAssertWithInfo
(
c
,
c
->
argv
[
j
],
retval1
==
DICT_OK
&&
retval2
);
if
(
htNeedsResize
(
zs
->
dict
))
dictResize
(
zs
->
dict
);
if
(
dictSize
(
zs
->
dict
)
==
0
)
{
dbDelete
(
c
->
db
,
key
);
keyremoved
=
1
;
break
;
}
}
}
}
}
else
{
serverPanic
(
"Unknown sorted set encoding"
);
}
}
if
(
deleted
)
{
if
(
deleted
)
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment