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
212edbc4
Commit
212edbc4
authored
Jan 23, 2013
by
antirez
Browse files
Keyspace events notification API.
parent
153766e1
Changes
7
Hide whitespace changes
Inline
Side-by-side
redis.conf
View file @
212edbc4
...
...
@@ -445,6 +445,23 @@ slowlog-log-slower-than 10000
# You can reclaim memory used by the slow log with SLOWLOG RESET.
slowlog
-
max
-
len
128
############################# Event notification ##############################
# Redis can notify Pub/Sub clients about events happening in the key space.
# This feature is documented at http://redis.io/topics/keyspace-events
#
# For instance if keyspace events notification is enabled, and a client
# performs a DEL operation on key "foo" stored in the Database 0, two
# messages will be published via Pub/Sub:
#
# PUBLISH __keyspace@0__:foo del
# PUBLISH __keyevent@0__:del foo
#
# While the overhead of this feature is relatively small most users don't
# need it so it is disabled by default. You can enable it setting the
# following configuration option to yes.
notify
-
keyspace
-
events
no
############################### ADVANCED CONFIG ###############################
# Hashes are encoded using a memory efficient data structure when they have a
...
...
src/Makefile
View file @
212edbc4
...
...
@@ -99,7 +99,7 @@ endif
REDIS_SERVER_NAME
=
redis-server
REDIS_SENTINEL_NAME
=
redis-sentinel
REDIS_SERVER_OBJ
=
adlist.o ae.o anet.o dict.o redis.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 migrate.o endianconv.o slowlog.o scripting.o bio.o rio.o rand.o memtest.o crc64.o bitops.o sentinel.o
REDIS_SERVER_OBJ
=
adlist.o ae.o anet.o dict.o redis.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 migrate.o endianconv.o slowlog.o scripting.o bio.o rio.o rand.o memtest.o crc64.o bitops.o sentinel.o
notify.o
REDIS_CLI_NAME
=
redis-cli
REDIS_CLI_OBJ
=
anet.o sds.o adlist.o redis-cli.o zmalloc.o release.o anet.o ae.o crc64.o
REDIS_BENCHMARK_NAME
=
redis-benchmark
...
...
src/Makefile.dep
View file @
212edbc4
...
...
@@ -40,6 +40,9 @@ networking.o: networking.c redis.h fmacros.h config.h \
../deps/lua/src/lua.h ../deps/lua/src/luaconf.h ae.h sds.h dict.h
\
adlist.h zmalloc.h anet.h ziplist.h intset.h version.h util.h rdb.h
\
rio.h
notify.o
:
notify.c redis.h fmacros.h config.h ../deps/lua/src/lua.h
\
../deps/lua/src/luaconf.h ae.h sds.h dict.h adlist.h zmalloc.h anet.h
\
ziplist.h intset.h version.h util.h rdb.h rio.h
object.o
:
object.c redis.h fmacros.h config.h ../deps/lua/src/lua.h
\
../deps/lua/src/luaconf.h ae.h sds.h dict.h adlist.h zmalloc.h anet.h
\
ziplist.h intset.h version.h util.h rdb.h rio.h
...
...
src/config.c
View file @
212edbc4
...
...
@@ -384,6 +384,10 @@ void loadServerConfigFromString(char *config) {
}
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"slave-priority"
)
&&
argc
==
2
)
{
server
.
slave_priority
=
atoi
(
argv
[
1
]);
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"notify-keyspace-events"
)
&&
argc
==
2
)
{
if
((
server
.
notify_keyspace_events
=
yesnotoi
(
argv
[
1
]))
==
-
1
)
{
err
=
"argument must be 'yes' or 'no'"
;
goto
loaderr
;
}
}
else
if
(
!
strcasecmp
(
argv
[
0
],
"sentinel"
))
{
/* argc == 1 is handled by main() as we need to enter the sentinel
* mode ASAP. */
...
...
@@ -702,11 +706,11 @@ void configSetCommand(redisClient *c) {
if
(
yn
==
-
1
)
goto
badfmt
;
server
.
rdb_compression
=
yn
;
}
else
if
(
!
strcasecmp
(
c
->
argv
[
2
]
->
ptr
,
"
rdbchecksum
"
))
{
}
else
if
(
!
strcasecmp
(
c
->
argv
[
2
]
->
ptr
,
"
notify-keyspace-events
"
))
{
int
yn
=
yesnotoi
(
o
->
ptr
);
if
(
yn
==
-
1
)
goto
badfmt
;
server
.
rdb_checksum
=
yn
;
server
.
notify_keyspace_events
=
yn
;
}
else
if
(
!
strcasecmp
(
c
->
argv
[
2
]
->
ptr
,
"slave-priority"
))
{
if
(
getLongLongFromObject
(
o
,
&
ll
)
==
REDIS_ERR
||
ll
<=
0
)
goto
badfmt
;
...
...
@@ -816,6 +820,7 @@ void configGetCommand(redisClient *c) {
config_get_bool_field
(
"rdbcompression"
,
server
.
rdb_compression
);
config_get_bool_field
(
"rdbchecksum"
,
server
.
rdb_checksum
);
config_get_bool_field
(
"activerehashing"
,
server
.
activerehashing
);
config_get_bool_field
(
"notify-keyspace-events"
,
server
.
notify_keyspace_events
);
/* Everything we can't handle with macros follows. */
...
...
src/notify.c
0 → 100644
View file @
212edbc4
/*
* Copyright (c) 2013, Salvatore Sanfilippo <antirez at gmail dot com>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of Redis nor the names of its contributors may be used
* to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#include "redis.h"
/* This file implements keyspace events notification via Pub/Sub ad
* described at http://redis.io/topics/keyspace-events.
*
* The API provided to the rest of the Redis core is a simple function:
*
* notifyKeyspaceEvent(char *event, robj *key, int dbid);
*
* 'event' is a C string representing the event name.
* 'key' is a Redis object representing the key name.
* 'dbid' is the database ID where the key lives.
*/
void
notifyKeyspaceEvent
(
char
*
event
,
robj
*
key
,
int
dbid
)
{
sds
keyspace_chan
,
keyevent_chan
;
int
len
;
char
buf
[
24
];
robj
*
chan1
,
*
chan2
,
*
eventobj
;
/* The prefix of the two channels is identical if not for
* 'keyspace' that is 'keyevent' in the event channel name, so
* we build a single prefix and overwrite 'event' with 'space'. */
keyspace_chan
=
sdsnewlen
(
"__keyspace@"
,
11
);
len
=
ll2string
(
buf
,
sizeof
(
buf
),
dbid
);
keyspace_chan
=
sdscatlen
(
keyspace_chan
,
buf
,
len
);
keyspace_chan
=
sdscatlen
(
keyspace_chan
,
"__:"
,
3
);
keyevent_chan
=
sdsdup
(
keyspace_chan
);
/* Dup the prefix. */
memcpy
(
keyevent_chan
+
5
,
"event"
,
5
);
/* Fix it. */
eventobj
=
createStringObject
(
event
,
strlen
(
event
));
/* The keyspace channel name has a trailing key name, while
* the keyevent channel name has a trailing event name. */
keyspace_chan
=
sdscatsds
(
keyspace_chan
,
key
->
ptr
);
keyevent_chan
=
sdscatsds
(
keyspace_chan
,
eventobj
->
ptr
);
chan1
=
createObject
(
REDIS_STRING
,
keyspace_chan
);
chan2
=
createObject
(
REDIS_STRING
,
keyevent_chan
);
/* Finally publish the two notifications. */
pubsubPublishMessage
(
chan1
,
eventobj
);
pubsubPublishMessage
(
chan2
,
key
);
/* Release objects. */
decrRefCount
(
eventobj
);
decrRefCount
(
keyspace_chan
);
decrRefCount
(
keyevent_chan
);
}
src/redis.c
View file @
212edbc4
...
...
@@ -1125,6 +1125,7 @@ void initServerConfig() {
server
.
rdb_compression
=
1
;
server
.
rdb_checksum
=
1
;
server
.
activerehashing
=
1
;
server
.
notify_keyspace_events
=
0
;
server
.
maxclients
=
REDIS_MAX_CLIENTS
;
server
.
bpop_blocked_clients
=
0
;
server
.
maxmemory
=
0
;
...
...
src/redis.h
View file @
212edbc4
...
...
@@ -646,6 +646,7 @@ struct redisServer {
/* Pubsub */
dict
*
pubsub_channels
;
/* Map channels to list of subscribed clients */
list
*
pubsub_patterns
;
/* A list of pubsub_patterns */
int
notify_keyspace_events
;
/* Propagate keyspace events via Pub/Sub. */
/* Scripting */
lua_State
*
lua
;
/* The Lua interpreter. We use just one for all clients */
redisClient
*
lua_client
;
/* The "fake client" to query Redis from Lua */
...
...
@@ -999,6 +1000,7 @@ int pubsubUnsubscribeAllPatterns(redisClient *c, int notify);
void
freePubsubPattern
(
void
*
p
);
int
listMatchPubsubPattern
(
void
*
a
,
void
*
b
);
int
pubsubPublishMessage
(
robj
*
channel
,
robj
*
message
);
void
notifyKeyspaceEvent
(
char
*
event
,
robj
*
key
,
int
dbid
);
/* Configuration */
void
loadServerConfig
(
char
*
filename
,
char
*
options
);
...
...
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