Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
ruanhaishen
redis
Commits
da04e6ed
Commit
da04e6ed
authored
Jan 24, 2013
by
antirez
Browse files
Keyspace events added for more commands.
parent
8766e810
Changes
8
Hide whitespace changes
Inline
Side-by-side
src/bitops.c
View file @
da04e6ed
...
...
@@ -153,6 +153,7 @@ void setbitCommand(redisClient *c) {
byteval
|=
((
on
&
0x1
)
<<
bit
);
((
uint8_t
*
)
o
->
ptr
)[
byte
]
=
byteval
;
signalModifiedKey
(
c
->
db
,
c
->
argv
[
1
]);
notifyKeyspaceEvent
(
"setbit"
,
c
->
argv
[
1
],
c
->
db
->
id
);
server
.
dirty
++
;
addReply
(
c
,
bitval
?
shared
.
cone
:
shared
.
czero
);
}
...
...
@@ -346,9 +347,11 @@ void bitopCommand(redisClient *c) {
if
(
maxlen
)
{
o
=
createObject
(
REDIS_STRING
,
res
);
setKey
(
c
->
db
,
targetkey
,
o
);
notifyKeyspaceEvent
(
"set"
,
targetkey
,
c
->
db
->
id
);
decrRefCount
(
o
);
}
else
if
(
dbDelete
(
c
->
db
,
targetkey
))
{
signalModifiedKey
(
c
->
db
,
targetkey
);
notifyKeyspaceEvent
(
"del"
,
targetkey
,
c
->
db
->
id
);
}
server
.
dirty
++
;
addReplyLongLong
(
c
,
maxlen
);
/* Return the output string length in bytes. */
...
...
src/db.c
View file @
da04e6ed
...
...
@@ -587,12 +587,14 @@ void expireGenericCommand(redisClient *c, long long basetime, int unit) {
rewriteClientCommandVector
(
c
,
2
,
aux
,
key
);
decrRefCount
(
aux
);
signalModifiedKey
(
c
->
db
,
key
);
notifyKeyspaceEvent
(
"del"
,
key
,
c
->
db
->
id
);
addReply
(
c
,
shared
.
cone
);
return
;
}
else
{
setExpire
(
c
->
db
,
key
,
when
);
addReply
(
c
,
shared
.
cone
);
signalModifiedKey
(
c
->
db
,
key
);
notifyKeyspaceEvent
(
"expire"
,
key
,
c
->
db
->
id
);
server
.
dirty
++
;
return
;
}
...
...
src/sort.c
View file @
da04e6ed
...
...
@@ -504,9 +504,11 @@ void sortCommand(redisClient *c) {
}
if
(
outputlen
)
{
setKey
(
c
->
db
,
storekey
,
sobj
);
notifyKeyspaceEvent
(
"sortstore"
,
storekey
,
c
->
db
->
id
);
server
.
dirty
+=
outputlen
;
}
else
if
(
dbDelete
(
c
->
db
,
storekey
))
{
signalModifiedKey
(
c
->
db
,
storekey
);
notifyKeyspaceEvent
(
"del"
,
storekey
,
c
->
db
->
id
);
server
.
dirty
++
;
}
decrRefCount
(
sobj
);
...
...
@@ -525,5 +527,3 @@ void sortCommand(redisClient *c) {
}
zfree
(
vector
);
}
src/t_hash.c
View file @
da04e6ed
...
...
@@ -474,6 +474,7 @@ void hsetCommand(redisClient *c) {
update
=
hashTypeSet
(
o
,
c
->
argv
[
2
],
c
->
argv
[
3
]);
addReply
(
c
,
update
?
shared
.
czero
:
shared
.
cone
);
signalModifiedKey
(
c
->
db
,
c
->
argv
[
1
]);
notifyKeyspaceEvent
(
"hset"
,
c
->
argv
[
1
],
c
->
db
->
id
);
server
.
dirty
++
;
}
...
...
@@ -489,6 +490,7 @@ void hsetnxCommand(redisClient *c) {
hashTypeSet
(
o
,
c
->
argv
[
2
],
c
->
argv
[
3
]);
addReply
(
c
,
shared
.
cone
);
signalModifiedKey
(
c
->
db
,
c
->
argv
[
1
]);
notifyKeyspaceEvent
(
"hset"
,
c
->
argv
[
1
],
c
->
db
->
id
);
server
.
dirty
++
;
}
}
...
...
@@ -510,6 +512,7 @@ void hmsetCommand(redisClient *c) {
}
addReply
(
c
,
shared
.
ok
);
signalModifiedKey
(
c
->
db
,
c
->
argv
[
1
]);
notifyKeyspaceEvent
(
"hset"
,
c
->
argv
[
1
],
c
->
db
->
id
);
server
.
dirty
++
;
}
...
...
@@ -543,6 +546,7 @@ void hincrbyCommand(redisClient *c) {
decrRefCount
(
new
);
addReplyLongLong
(
c
,
value
);
signalModifiedKey
(
c
->
db
,
c
->
argv
[
1
]);
notifyKeyspaceEvent
(
"hincrby"
,
c
->
argv
[
1
],
c
->
db
->
id
);
server
.
dirty
++
;
}
...
...
@@ -569,6 +573,7 @@ void hincrbyfloatCommand(redisClient *c) {
hashTypeSet
(
o
,
c
->
argv
[
2
],
new
);
addReplyBulk
(
c
,
new
);
signalModifiedKey
(
c
->
db
,
c
->
argv
[
1
]);
notifyKeyspaceEvent
(
"hincrbyfloat"
,
c
->
argv
[
1
],
c
->
db
->
id
);
server
.
dirty
++
;
/* Always replicate HINCRBYFLOAT as an HSET command with the final value
...
...
@@ -649,7 +654,7 @@ void hmgetCommand(redisClient *c) {
void
hdelCommand
(
redisClient
*
c
)
{
robj
*
o
;
int
j
,
deleted
=
0
;
int
j
,
deleted
=
0
,
keyremoved
=
0
;
if
((
o
=
lookupKeyWriteOrReply
(
c
,
c
->
argv
[
1
],
shared
.
czero
))
==
NULL
||
checkType
(
c
,
o
,
REDIS_HASH
))
return
;
...
...
@@ -659,12 +664,15 @@ void hdelCommand(redisClient *c) {
deleted
++
;
if
(
hashTypeLength
(
o
)
==
0
)
{
dbDelete
(
c
->
db
,
c
->
argv
[
1
]);
keyremoved
=
1
;
break
;
}
}
}
if
(
deleted
)
{
signalModifiedKey
(
c
->
db
,
c
->
argv
[
1
]);
notifyKeyspaceEvent
(
"hdel"
,
c
->
argv
[
1
],
c
->
db
->
id
);
if
(
keyremoved
)
notifyKeyspaceEvent
(
"del"
,
c
->
argv
[
1
],
c
->
db
->
id
);
server
.
dirty
+=
deleted
;
}
addReplyLongLong
(
c
,
deleted
);
...
...
src/t_list.c
View file @
da04e6ed
...
...
@@ -316,7 +316,12 @@ void pushGenericCommand(redisClient *c, int where) {
pushed
++
;
}
addReplyLongLong
(
c
,
waiting
+
(
lobj
?
listTypeLength
(
lobj
)
:
0
));
if
(
pushed
)
signalModifiedKey
(
c
->
db
,
c
->
argv
[
1
]);
if
(
pushed
)
{
char
*
event
=
(
where
==
REDIS_HEAD
)
?
"lpush"
:
"rpush"
;
signalModifiedKey
(
c
->
db
,
c
->
argv
[
1
]);
notifyKeyspaceEvent
(
event
,
c
->
argv
[
1
],
c
->
db
->
id
);
}
server
.
dirty
+=
pushed
;
}
...
...
@@ -338,10 +343,6 @@ void pushxGenericCommand(redisClient *c, robj *refval, robj *val, int where) {
checkType
(
c
,
subject
,
REDIS_LIST
))
return
;
if
(
refval
!=
NULL
)
{
/* Note: we expect refval to be string-encoded because it is *not* the
* last argument of the multi-bulk LINSERT. */
redisAssertWithInfo
(
c
,
refval
,
refval
->
encoding
==
REDIS_ENCODING_RAW
);
/* We're not sure if this value can be inserted yet, but we cannot
* convert the list inside the iterator. We don't want to loop over
* the list twice (once to see if the value can be inserted and once
...
...
@@ -366,6 +367,7 @@ void pushxGenericCommand(redisClient *c, robj *refval, robj *val, int where) {
ziplistLen
(
subject
->
ptr
)
>
server
.
list_max_ziplist_entries
)
listTypeConvert
(
subject
,
REDIS_ENCODING_LINKEDLIST
);
signalModifiedKey
(
c
->
db
,
c
->
argv
[
1
]);
notifyKeyspaceEvent
(
"linsert"
,
c
->
argv
[
1
],
c
->
db
->
id
);
server
.
dirty
++
;
}
else
{
/* Notify client of a failed insert */
...
...
@@ -373,8 +375,11 @@ void pushxGenericCommand(redisClient *c, robj *refval, robj *val, int where) {
return
;
}
}
else
{
char
*
event
=
(
where
==
REDIS_HEAD
)
?
"lpush"
:
"rpush"
;
listTypePush
(
subject
,
val
,
where
);
signalModifiedKey
(
c
->
db
,
c
->
argv
[
1
]);
notifyKeyspaceEvent
(
event
,
c
->
argv
[
1
],
c
->
db
->
id
);
server
.
dirty
++
;
}
...
...
@@ -469,6 +474,7 @@ void lsetCommand(redisClient *c) {
decrRefCount
(
value
);
addReply
(
c
,
shared
.
ok
);
signalModifiedKey
(
c
->
db
,
c
->
argv
[
1
]);
notifyKeyspaceEvent
(
"lset"
,
c
->
argv
[
1
],
c
->
db
->
id
);
server
.
dirty
++
;
}
}
else
if
(
o
->
encoding
==
REDIS_ENCODING_LINKEDLIST
)
{
...
...
@@ -481,6 +487,7 @@ void lsetCommand(redisClient *c) {
incrRefCount
(
value
);
addReply
(
c
,
shared
.
ok
);
signalModifiedKey
(
c
->
db
,
c
->
argv
[
1
]);
notifyKeyspaceEvent
(
"lset"
,
c
->
argv
[
1
],
c
->
db
->
id
);
server
.
dirty
++
;
}
}
else
{
...
...
@@ -496,9 +503,15 @@ void popGenericCommand(redisClient *c, int where) {
if
(
value
==
NULL
)
{
addReply
(
c
,
shared
.
nullbulk
);
}
else
{
char
*
event
=
(
where
==
REDIS_HEAD
)
?
"lpop"
:
"rpop"
;
addReplyBulk
(
c
,
value
);
decrRefCount
(
value
);
if
(
listTypeLength
(
o
)
==
0
)
dbDelete
(
c
->
db
,
c
->
argv
[
1
]);
notifyKeyspaceEvent
(
event
,
c
->
argv
[
1
],
c
->
db
->
id
);
if
(
listTypeLength
(
o
)
==
0
)
{
notifyKeyspaceEvent
(
"del"
,
c
->
argv
[
1
],
c
->
db
->
id
);
dbDelete
(
c
->
db
,
c
->
argv
[
1
]);
}
signalModifiedKey
(
c
->
db
,
c
->
argv
[
1
]);
server
.
dirty
++
;
}
...
...
@@ -618,7 +631,12 @@ void ltrimCommand(redisClient *c) {
}
else
{
redisPanic
(
"Unknown list encoding"
);
}
if
(
listTypeLength
(
o
)
==
0
)
dbDelete
(
c
->
db
,
c
->
argv
[
1
]);
notifyKeyspaceEvent
(
"ltrim"
,
c
->
argv
[
1
],
c
->
db
->
id
);
if
(
listTypeLength
(
o
)
==
0
)
{
dbDelete
(
c
->
db
,
c
->
argv
[
1
]);
notifyKeyspaceEvent
(
"del"
,
c
->
argv
[
1
],
c
->
db
->
id
);
}
signalModifiedKey
(
c
->
db
,
c
->
argv
[
1
]);
server
.
dirty
++
;
addReply
(
c
,
shared
.
ok
);
...
...
@@ -693,6 +711,7 @@ void rpoplpushHandlePush(redisClient *c, robj *dstkey, robj *dstobj, robj *value
}
signalModifiedKey
(
c
->
db
,
dstkey
);
listTypePush
(
dstobj
,
value
,
REDIS_HEAD
);
notifyKeyspaceEvent
(
"lpush"
,
dstkey
,
c
->
db
->
id
);
/* Always send the pushed value to the client. */
addReplyBulk
(
c
,
value
);
}
...
...
@@ -722,7 +741,11 @@ void rpoplpushCommand(redisClient *c) {
decrRefCount
(
value
);
/* Delete the source list when it is empty */
if
(
listTypeLength
(
sobj
)
==
0
)
dbDelete
(
c
->
db
,
touchedkey
);
notifyKeyspaceEvent
(
"rpop"
,
touchedkey
,
c
->
db
->
id
);
if
(
listTypeLength
(
sobj
)
==
0
)
{
dbDelete
(
c
->
db
,
touchedkey
);
notifyKeyspaceEvent
(
"del"
,
touchedkey
,
c
->
db
->
id
);
}
signalModifiedKey
(
c
->
db
,
touchedkey
);
decrRefCount
(
touchedkey
);
server
.
dirty
++
;
...
...
@@ -1046,6 +1069,7 @@ void blockingPopGenericCommand(redisClient *c, int where) {
}
else
{
if
(
listTypeLength
(
o
)
!=
0
)
{
/* Non empty list, this is like a non normal [LR]POP. */
char
*
event
=
(
where
==
REDIS_HEAD
)
?
"lpop"
:
"rpop"
;
robj
*
value
=
listTypePop
(
o
,
where
);
redisAssert
(
value
!=
NULL
);
...
...
@@ -1053,7 +1077,11 @@ void blockingPopGenericCommand(redisClient *c, int where) {
addReplyBulk
(
c
,
c
->
argv
[
j
]);
addReplyBulk
(
c
,
value
);
decrRefCount
(
value
);
if
(
listTypeLength
(
o
)
==
0
)
dbDelete
(
c
->
db
,
c
->
argv
[
j
]);
notifyKeyspaceEvent
(
event
,
c
->
argv
[
j
],
c
->
db
->
id
);
if
(
listTypeLength
(
o
)
==
0
)
{
dbDelete
(
c
->
db
,
c
->
argv
[
j
]);
notifyKeyspaceEvent
(
"del"
,
c
->
argv
[
j
],
c
->
db
->
id
);
}
signalModifiedKey
(
c
->
db
,
c
->
argv
[
j
]);
server
.
dirty
++
;
...
...
src/t_set.c
View file @
da04e6ed
...
...
@@ -266,14 +266,17 @@ void saddCommand(redisClient *c) {
c
->
argv
[
j
]
=
tryObjectEncoding
(
c
->
argv
[
j
]);
if
(
setTypeAdd
(
set
,
c
->
argv
[
j
]))
added
++
;
}
if
(
added
)
signalModifiedKey
(
c
->
db
,
c
->
argv
[
1
]);
if
(
added
)
{
signalModifiedKey
(
c
->
db
,
c
->
argv
[
1
]);
notifyKeyspaceEvent
(
"sadd"
,
c
->
argv
[
1
],
c
->
db
->
id
);
}
server
.
dirty
+=
added
;
addReplyLongLong
(
c
,
added
);
}
void
sremCommand
(
redisClient
*
c
)
{
robj
*
set
;
int
j
,
deleted
=
0
;
int
j
,
deleted
=
0
,
keyremoved
=
0
;
if
((
set
=
lookupKeyWriteOrReply
(
c
,
c
->
argv
[
1
],
shared
.
czero
))
==
NULL
||
checkType
(
c
,
set
,
REDIS_SET
))
return
;
...
...
@@ -283,12 +286,15 @@ void sremCommand(redisClient *c) {
deleted
++
;
if
(
setTypeSize
(
set
)
==
0
)
{
dbDelete
(
c
->
db
,
c
->
argv
[
1
]);
keyremoved
=
1
;
break
;
}
}
}
if
(
deleted
)
{
signalModifiedKey
(
c
->
db
,
c
->
argv
[
1
]);
notifyKeyspaceEvent
(
"srem"
,
c
->
argv
[
1
],
c
->
db
->
id
);
if
(
keyremoved
)
notifyKeyspaceEvent
(
"del"
,
c
->
argv
[
1
],
c
->
db
->
id
);
server
.
dirty
+=
deleted
;
}
addReplyLongLong
(
c
,
deleted
);
...
...
@@ -322,9 +328,13 @@ void smoveCommand(redisClient *c) {
addReply
(
c
,
shared
.
czero
);
return
;
}
notifyKeyspaceEvent
(
"srem"
,
c
->
argv
[
1
],
c
->
db
->
id
);
/* Remove the src set from the database when empty */
if
(
setTypeSize
(
srcset
)
==
0
)
dbDelete
(
c
->
db
,
c
->
argv
[
1
]);
if
(
setTypeSize
(
srcset
)
==
0
)
{
dbDelete
(
c
->
db
,
c
->
argv
[
1
]);
notifyKeyspaceEvent
(
"del"
,
c
->
argv
[
1
],
c
->
db
->
id
);
}
signalModifiedKey
(
c
->
db
,
c
->
argv
[
1
]);
signalModifiedKey
(
c
->
db
,
c
->
argv
[
2
]);
server
.
dirty
++
;
...
...
@@ -336,7 +346,10 @@ void smoveCommand(redisClient *c) {
}
/* An extra key has changed when ele was successfully added to dstset */
if
(
setTypeAdd
(
dstset
,
ele
))
server
.
dirty
++
;
if
(
setTypeAdd
(
dstset
,
ele
))
{
server
.
dirty
++
;
notifyKeyspaceEvent
(
"sadd"
,
c
->
argv
[
2
],
c
->
db
->
id
);
}
addReply
(
c
,
shared
.
cone
);
}
...
...
@@ -378,6 +391,7 @@ void spopCommand(redisClient *c) {
incrRefCount
(
ele
);
setTypeRemove
(
set
,
ele
);
}
notifyKeyspaceEvent
(
"spop"
,
c
->
argv
[
1
],
c
->
db
->
id
);
/* Replicate/AOF this command as an SREM operation */
aux
=
createStringObject
(
"SREM"
,
4
);
...
...
@@ -386,7 +400,10 @@ void spopCommand(redisClient *c) {
decrRefCount
(
aux
);
addReplyBulk
(
c
,
ele
);
if
(
setTypeSize
(
set
)
==
0
)
dbDelete
(
c
->
db
,
c
->
argv
[
1
]);
if
(
setTypeSize
(
set
)
==
0
)
{
dbDelete
(
c
->
db
,
c
->
argv
[
1
]);
notifyKeyspaceEvent
(
"del"
,
c
->
argv
[
1
],
c
->
db
->
id
);
}
signalModifiedKey
(
c
->
db
,
c
->
argv
[
1
]);
server
.
dirty
++
;
}
...
...
@@ -691,6 +708,7 @@ void sinterGenericCommand(redisClient *c, robj **setkeys, unsigned long setnum,
if
(
setTypeSize
(
dstset
)
>
0
)
{
dbAdd
(
c
->
db
,
dstkey
,
dstset
);
addReplyLongLong
(
c
,
setTypeSize
(
dstset
));
notifyKeyspaceEvent
(
"sinterstore"
,
dstkey
,
c
->
db
->
id
);
}
else
{
decrRefCount
(
dstset
);
addReply
(
c
,
shared
.
czero
);
...
...
@@ -856,6 +874,9 @@ void sunionDiffGenericCommand(redisClient *c, robj **setkeys, int setnum, robj *
if
(
setTypeSize
(
dstset
)
>
0
)
{
dbAdd
(
c
->
db
,
dstkey
,
dstset
);
addReplyLongLong
(
c
,
setTypeSize
(
dstset
));
notifyKeyspaceEvent
(
op
==
REDIS_OP_UNION
?
"sunionstore"
:
"sdiffstore"
,
dstkey
,
c
->
db
->
id
);
}
else
{
decrRefCount
(
dstset
);
addReply
(
c
,
shared
.
czero
);
...
...
src/t_string.c
View file @
da04e6ed
...
...
@@ -110,6 +110,7 @@ void getsetCommand(redisClient *c) {
if
(
getGenericCommand
(
c
)
==
REDIS_ERR
)
return
;
c
->
argv
[
2
]
=
tryObjectEncoding
(
c
->
argv
[
2
]);
setKey
(
c
->
db
,
c
->
argv
[
1
],
c
->
argv
[
2
]);
notifyKeyspaceEvent
(
"set"
,
c
->
argv
[
1
],
c
->
db
->
id
);
server
.
dirty
++
;
}
...
...
@@ -171,6 +172,7 @@ void setrangeCommand(redisClient *c) {
o
->
ptr
=
sdsgrowzero
(
o
->
ptr
,
offset
+
sdslen
(
value
));
memcpy
((
char
*
)
o
->
ptr
+
offset
,
value
,
sdslen
(
value
));
signalModifiedKey
(
c
->
db
,
c
->
argv
[
1
]);
notifyKeyspaceEvent
(
"setrange"
,
c
->
argv
[
1
],
c
->
db
->
id
);
server
.
dirty
++
;
}
addReplyLongLong
(
c
,
sdslen
(
o
->
ptr
));
...
...
@@ -255,7 +257,7 @@ void msetGenericCommand(redisClient *c, int nx) {
for
(
j
=
1
;
j
<
c
->
argc
;
j
+=
2
)
{
c
->
argv
[
j
+
1
]
=
tryObjectEncoding
(
c
->
argv
[
j
+
1
]);
setKey
(
c
->
db
,
c
->
argv
[
j
],
c
->
argv
[
j
+
1
]);
notifyKeyspaceEvent
(
"set"
,
c
->
argv
[
j
+
1
],
c
->
db
->
id
);
notifyKeyspaceEvent
(
"set"
,
c
->
argv
[
j
],
c
->
db
->
id
);
}
server
.
dirty
+=
(
c
->
argc
-
1
)
/
2
;
addReply
(
c
,
nx
?
shared
.
cone
:
shared
.
ok
);
...
...
src/t_zset.c
View file @
da04e6ed
...
...
@@ -844,9 +844,9 @@ void zaddGenericCommand(redisClient *c, int incr) {
robj
*
ele
;
robj
*
zobj
;
robj
*
curobj
;
double
score
=
0
,
*
scores
,
curscore
=
0
.
0
;
double
score
=
0
,
*
scores
=
NULL
,
curscore
=
0
.
0
;
int
j
,
elements
=
(
c
->
argc
-
2
)
/
2
;
int
added
=
0
;
int
added
=
0
,
updated
=
0
;
if
(
c
->
argc
%
2
)
{
addReply
(
c
,
shared
.
syntaxerr
);
...
...
@@ -859,11 +859,7 @@ void zaddGenericCommand(redisClient *c, int incr) {
scores
=
zmalloc
(
sizeof
(
double
)
*
elements
);
for
(
j
=
0
;
j
<
elements
;
j
++
)
{
if
(
getDoubleFromObjectOrReply
(
c
,
c
->
argv
[
2
+
j
*
2
],
&
scores
[
j
],
NULL
)
!=
REDIS_OK
)
{
zfree
(
scores
);
return
;
}
!=
REDIS_OK
)
goto
cleanup
;
}
/* Lookup the key and create the sorted set if does not exist. */
...
...
@@ -880,8 +876,7 @@ void zaddGenericCommand(redisClient *c, int incr) {
}
else
{
if
(
zobj
->
type
!=
REDIS_ZSET
)
{
addReply
(
c
,
shared
.
wrongtypeerr
);
zfree
(
scores
);
return
;
goto
cleanup
;
}
}
...
...
@@ -898,10 +893,7 @@ void zaddGenericCommand(redisClient *c, int incr) {
score
+=
curscore
;
if
(
isnan
(
score
))
{
addReplyError
(
c
,
nanerr
);
/* Don't need to check if the sorted set is empty
* because we know it has at least one element. */
zfree
(
scores
);
return
;
goto
cleanup
;
}
}
...
...
@@ -909,9 +901,8 @@ void zaddGenericCommand(redisClient *c, int incr) {
if
(
score
!=
curscore
)
{
zobj
->
ptr
=
zzlDelete
(
zobj
->
ptr
,
eptr
);
zobj
->
ptr
=
zzlInsert
(
zobj
->
ptr
,
ele
,
score
);
signalModifiedKey
(
c
->
db
,
key
);
server
.
dirty
++
;
updated
++
;
}
}
else
{
/* Optimize: check if the element is too large or the list
...
...
@@ -921,10 +912,8 @@ void zaddGenericCommand(redisClient *c, int incr) {
zsetConvert
(
zobj
,
REDIS_ENCODING_SKIPLIST
);
if
(
sdslen
(
ele
->
ptr
)
>
server
.
zset_max_ziplist_value
)
zsetConvert
(
zobj
,
REDIS_ENCODING_SKIPLIST
);
signalModifiedKey
(
c
->
db
,
key
);
server
.
dirty
++
;
if
(
!
incr
)
added
++
;
added
++
;
}
}
else
if
(
zobj
->
encoding
==
REDIS_ENCODING_SKIPLIST
)
{
zset
*
zs
=
zobj
->
ptr
;
...
...
@@ -943,8 +932,7 @@ void zaddGenericCommand(redisClient *c, int incr) {
addReplyError
(
c
,
nanerr
);
/* Don't need to check if the sorted set is empty
* because we know it has at least one element. */
zfree
(
scores
);
return
;
goto
cleanup
;
}
}
...
...
@@ -956,29 +944,32 @@ void zaddGenericCommand(redisClient *c, int incr) {
znode
=
zslInsert
(
zs
->
zsl
,
score
,
curobj
);
incrRefCount
(
curobj
);
/* Re-inserted in skiplist. */
dictGetVal
(
de
)
=
&
znode
->
score
;
/* Update score ptr. */
signalModifiedKey
(
c
->
db
,
key
);
server
.
dirty
++
;
updated
++
;
}
}
else
{
znode
=
zslInsert
(
zs
->
zsl
,
score
,
ele
);
incrRefCount
(
ele
);
/* Inserted in skiplist. */
redisAssertWithInfo
(
c
,
NULL
,
dictAdd
(
zs
->
dict
,
ele
,
&
znode
->
score
)
==
DICT_OK
);
incrRefCount
(
ele
);
/* Added to dictionary. */
signalModifiedKey
(
c
->
db
,
key
);
server
.
dirty
++
;
if
(
!
incr
)
added
++
;
added
++
;
}
}
else
{
redisPanic
(
"Unknown sorted set encoding"
);
}
}
zfree
(
scores
);
if
(
incr
)
/* ZINCRBY */
addReplyDouble
(
c
,
score
);
else
/* ZADD */
addReplyLongLong
(
c
,
added
);
cleanup:
zfree
(
scores
);
if
(
added
||
updated
)
{
signalModifiedKey
(
c
->
db
,
key
);
notifyKeyspaceEvent
(
incr
?
"zincr"
:
"zadd"
,
key
,
c
->
db
->
id
);
}
}
void
zaddCommand
(
redisClient
*
c
)
{
...
...
@@ -992,7 +983,7 @@ void zincrbyCommand(redisClient *c) {
void
zremCommand
(
redisClient
*
c
)
{
robj
*
key
=
c
->
argv
[
1
];
robj
*
zobj
;
int
deleted
=
0
,
j
;
int
deleted
=
0
,
keyremoved
=
0
,
j
;
if
((
zobj
=
lookupKeyWriteOrReply
(
c
,
key
,
shared
.
czero
))
==
NULL
||
checkType
(
c
,
zobj
,
REDIS_ZSET
))
return
;
...
...
@@ -1038,6 +1029,8 @@ void zremCommand(redisClient *c) {
}
if
(
deleted
)
{
notifyKeyspaceEvent
(
"zrem"
,
key
,
c
->
db
->
id
);
if
(
keyremoved
)
notifyKeyspaceEvent
(
"del"
,
key
,
c
->
db
->
id
);
signalModifiedKey
(
c
->
db
,
key
);
server
.
dirty
+=
deleted
;
}
...
...
@@ -1048,6 +1041,7 @@ void zremrangebyscoreCommand(redisClient *c) {
robj
*
key
=
c
->
argv
[
1
];
robj
*
zobj
;
zrangespec
range
;
int
keyremoved
=
0
;
unsigned
long
deleted
;
/* Parse the range arguments. */
...
...
@@ -1061,17 +1055,27 @@ void zremrangebyscoreCommand(redisClient *c) {
if
(
zobj
->
encoding
==
REDIS_ENCODING_ZIPLIST
)
{
zobj
->
ptr
=
zzlDeleteRangeByScore
(
zobj
->
ptr
,
range
,
&
deleted
);
if
(
zzlLength
(
zobj
->
ptr
)
==
0
)
dbDelete
(
c
->
db
,
key
);
if
(
zzlLength
(
zobj
->
ptr
)
==
0
)
{
dbDelete
(
c
->
db
,
key
);
keyremoved
=
1
;
}
}
else
if
(
zobj
->
encoding
==
REDIS_ENCODING_SKIPLIST
)
{
zset
*
zs
=
zobj
->
ptr
;
deleted
=
zslDeleteRangeByScore
(
zs
->
zsl
,
range
,
zs
->
dict
);
if
(
htNeedsResize
(
zs
->
dict
))
dictResize
(
zs
->
dict
);
if
(
dictSize
(
zs
->
dict
)
==
0
)
dbDelete
(
c
->
db
,
key
);
if
(
dictSize
(
zs
->
dict
)
==
0
)
{
dbDelete
(
c
->
db
,
key
);
keyremoved
=
1
;
}
}
else
{
redisPanic
(
"Unknown sorted set encoding"
);
}
if
(
deleted
)
signalModifiedKey
(
c
->
db
,
key
);
if
(
deleted
)
{
signalModifiedKey
(
c
->
db
,
key
);
notifyKeyspaceEvent
(
"zrembyscore"
,
key
,
c
->
db
->
id
);
if
(
keyremoved
)
notifyKeyspaceEvent
(
"del"
,
key
,
c
->
db
->
id
);
}
server
.
dirty
+=
deleted
;
addReplyLongLong
(
c
,
deleted
);
}
...
...
@@ -1083,6 +1087,7 @@ void zremrangebyrankCommand(redisClient *c) {
long
end
;
int
llen
;
unsigned
long
deleted
;
int
keyremoved
=
0
;
if
((
getLongFromObjectOrReply
(
c
,
c
->
argv
[
2
],
&
start
,
NULL
)
!=
REDIS_OK
)
||
(
getLongFromObjectOrReply
(
c
,
c
->
argv
[
3
],
&
end
,
NULL
)
!=
REDIS_OK
))
return
;
...
...
@@ -1107,19 +1112,29 @@ void zremrangebyrankCommand(redisClient *c) {
if
(
zobj
->
encoding
==
REDIS_ENCODING_ZIPLIST
)
{
/* Correct for 1-based rank. */
zobj
->
ptr
=
zzlDeleteRangeByRank
(
zobj
->
ptr
,
start
+
1
,
end
+
1
,
&
deleted
);
if
(
zzlLength
(
zobj
->
ptr
)
==
0
)
dbDelete
(
c
->
db
,
key
);
if
(
zzlLength
(
zobj
->
ptr
)
==
0
)
{
dbDelete
(
c
->
db
,
key
);
keyremoved
=
1
;
}
}
else
if
(
zobj
->
encoding
==
REDIS_ENCODING_SKIPLIST
)
{
zset
*
zs
=
zobj
->
ptr
;
/* Correct for 1-based rank. */
deleted
=
zslDeleteRangeByRank
(
zs
->
zsl
,
start
+
1
,
end
+
1
,
zs
->
dict
);
if
(
htNeedsResize
(
zs
->
dict
))
dictResize
(
zs
->
dict
);
if
(
dictSize
(
zs
->
dict
)
==
0
)
dbDelete
(
c
->
db
,
key
);
if
(
dictSize
(
zs
->
dict
)
==
0
)
{
dbDelete
(
c
->
db
,
key
);
keyremoved
=
1
;
}
}
else
{
redisPanic
(
"Unknown sorted set encoding"
);
}
if
(
deleted
)
signalModifiedKey
(
c
->
db
,
key
);
if
(
deleted
)
{
signalModifiedKey
(
c
->
db
,
key
);
notifyKeyspaceEvent
(
"zrembyrank"
,
key
,
c
->
db
->
id
);
if
(
keyremoved
)
notifyKeyspaceEvent
(
"del"
,
key
,
c
->
db
->
id
);
}
server
.
dirty
+=
deleted
;
addReplyLongLong
(
c
,
deleted
);
}
...
...
@@ -1661,6 +1676,7 @@ void zunionInterGenericCommand(redisClient *c, robj *dstkey, int op) {
if
(
dbDelete
(
c
->
db
,
dstkey
))
{
signalModifiedKey
(
c
->
db
,
dstkey
);
notifyKeyspaceEvent
(
"del"
,
dstkey
,
c
->
db
->
id
);
touched
=
1
;
server
.
dirty
++
;
}
...
...
@@ -1673,6 +1689,9 @@ void zunionInterGenericCommand(redisClient *c, robj *dstkey, int op) {
dbAdd
(
c
->
db
,
dstkey
,
dstobj
);
addReplyLongLong
(
c
,
zsetLength
(
dstobj
));
if
(
!
touched
)
signalModifiedKey
(
c
->
db
,
dstkey
);
notifyKeyspaceEvent
(
(
op
==
REDIS_OP_UNION
)
?
"zunionstore"
:
"zinterstore"
,
dstkey
,
c
->
db
->
id
);
server
.
dirty
++
;
}
else
{
decrRefCount
(
dstobj
);
...
...
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