Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xindoo
redis
提交
256ddbf6
R
redis
项目概览
xindoo
/
redis
通知
2
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
redis
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
256ddbf6
编写于
2月 15, 2018
作者:
A
antirez
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Remove non semantical spaces from module.c.
上级
280c3e39
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
36 addition
and
41 deletion
+36
-41
src/module.c
src/module.c
+36
-41
未找到文件。
src/module.c
浏览文件 @
256ddbf6
...
...
@@ -220,22 +220,25 @@ static pthread_mutex_t moduleGIL = PTHREAD_MUTEX_INITIALIZER;
/* Function pointer type for keyspace event notification subscriptions from modules. */
typedef
int
(
*
RedisModuleNotificationFunc
)
(
RedisModuleCtx
*
ctx
,
int
type
,
const
char
*
event
,
RedisModuleString
*
key
);
/* Keyspace notification subscriber information. See RM_SubscribeToKeyspaceEvents */
/* Keyspace notification subscriber information.
* See RM_SubscribeToKeyspaceEvents() for more information. */
typedef
struct
RedisModuleKeyspaceSubscriber
{
/* The module subscribed to the event */
RedisModule
*
module
;
RedisModule
*
module
;
/* Notification callback in the module*/
RedisModuleNotificationFunc
notify_callback
;
RedisModuleNotificationFunc
notify_callback
;
/* A bit mask of the events the module is interested in */
int
event_mask
;
/* Active flag set on entry, to avoid reentrant subscribers calling themselves */
int
active
;
int
event_mask
;
/* Active flag set on entry, to avoid reentrant subscribers
* calling themselves */
int
active
;
}
RedisModuleKeyspaceSubscriber
;
/* The module keyspace notification subscribers list */
static
list
*
moduleKeyspaceSubscribers
;
/* Static client recycled for all notification clients, to avoid allocating per round. */
/* Static client recycled for all notification clients, to avoid allocating
* per round. */
static
client
*
moduleKeyspaceSubscribersClient
;
/* --------------------------------------------------------------------------
...
...
@@ -3696,18 +3699,18 @@ void moduleReleaseGIL(void) {
* Module Keyspace Notifications API
* -------------------------------------------------------------------------- */
/* Subscribe to keyspace notifications. This is a low-level version of the
/* Subscribe to keyspace notifications. This is a low-level version of the
* keyspace-notifications API. A module cand register callbacks to be notified
* when keyspce events occur.
*
* when keyspce events occur.
*
* Notification events are filtered by their type (string events, set events,
* etc), and the subsriber callback receives only events that match a specific
* mask of event types.
*
* mask of event types.
*
* When subscribing to notifications with RedisModule_SubscribeToKeyspaceEvents
* the module must provide an event type-mask, denoting the events the subscriber
* is interested in. This can be an ORed mask of any of the following flags:
*
*
* - REDISMODULE_NOTIFY_GENERIC: Generic commands like DEL, EXPIRE, RENAME
* - REDISMODULE_NOTIFY_STRING: String events
* - REDISMODULE_NOTIFY_LIST: List events
...
...
@@ -3718,32 +3721,32 @@ void moduleReleaseGIL(void) {
* - REDISMODULE_NOTIFY_EVICTED: Eviction events
* - REDISMODULE_NOTIFY_STREAM: Stream events
* - REDISMODULE_NOTIFY_ALL: All events
*
*
* We do not distinguish between key events and keyspace events, and it is up
* to the module to filter the actions taken based on the key.
*
* to the module to filter the actions taken based on the key.
*
* The subscriber signature is:
*
* int (*RedisModuleNotificationFunc) (RedisModuleCtx *ctx, int type,
* const char *event,
*
* int (*RedisModuleNotificationFunc) (RedisModuleCtx *ctx, int type,
* const char *event,
* RedisModuleString *key);
*
*
* `type` is the event type bit, that must match the mask given at registration
* time. The event string is the actual command being executed, and key is the
* relevant Redis key.
*
* relevant Redis key.
*
* Notification callback gets executed with a redis context that can not be
* used to send anything to the client, and has the db number where the event
* occured as its selected db number.
*
* Notice that it is not necessary to enable norifications in redis.conf for
* module notifications to work.
*
*
* Notice that it is not necessary to enable norifications in redis.conf for
* module notifications to work.
*
* Warning: the notification callbacks are performed in a synchronous manner,
* so notification callbacks must to be fast, or they would slow Redis down.
* so notification callbacks must to be fast, or they would slow Redis down.
* If you need to take long actions, use threads to offload them.
*
* See https://redis.io/topics/notifications for more information.
*
* See https://redis.io/topics/notifications for more information.
*/
int
RM_SubscribeToKeyspaceEvents
(
RedisModuleCtx
*
ctx
,
int
types
,
RedisModuleNotificationFunc
callback
)
{
RedisModuleKeyspaceSubscriber
*
sub
=
zmalloc
(
sizeof
(
*
sub
));
...
...
@@ -3754,26 +3757,22 @@ int RM_SubscribeToKeyspaceEvents(RedisModuleCtx *ctx, int types, RedisModuleNoti
listAddNodeTail
(
moduleKeyspaceSubscribers
,
sub
);
return
REDISMODULE_OK
;
}
/* Dispatcher for keyspace notifications to module subscriber functions.
/* Dispatcher for keyspace notifications to module subscriber functions.
* This gets called only if at least one module requested to be notified on
* keyspace notifications */
void
moduleNotifyKeyspaceEvent
(
int
type
,
const
char
*
event
,
robj
*
key
,
int
dbid
)
{
/* Don't do anything if there aren't any subscribers */
if
(
listLength
(
moduleKeyspaceSubscribers
)
==
0
)
return
;
listIter
li
;
listNode
*
ln
;
listRewind
(
moduleKeyspaceSubscribers
,
&
li
);
/* Remove irrelevant flags from the type mask */
type
&=
~
(
NOTIFY_KEYEVENT
|
NOTIFY_KEYSPACE
);
while
((
ln
=
listNext
(
&
li
)))
{
RedisModuleKeyspaceSubscriber
*
sub
=
ln
->
value
;
/* Only notify subscribers on events matching they registration,
...
...
@@ -3784,7 +3783,7 @@ void moduleNotifyKeyspaceEvent(int type, const char *event, robj *key, int dbid)
ctx
.
client
=
moduleKeyspaceSubscribersClient
;
selectDb
(
ctx
.
client
,
dbid
);
/* mark the handler as activer to avoid reentrant loops.
/* mark the handler as activer to avoid reentrant loops.
* If the subscriber performs an action triggering itself,
* it will not be notified about it. */
sub
->
active
=
1
;
...
...
@@ -3793,7 +3792,6 @@ void moduleNotifyKeyspaceEvent(int type, const char *event, robj *key, int dbid)
moduleFreeContext
(
&
ctx
);
}
}
}
/* Unsubscribe any notification subscirbers this module has upon unloading */
...
...
@@ -3810,7 +3808,6 @@ void moduleUnsubscribeNotifications(RedisModule *module) {
}
}
/* --------------------------------------------------------------------------
* Modules API internals
* -------------------------------------------------------------------------- */
...
...
@@ -3848,10 +3845,9 @@ void moduleRegisterCoreAPI(void);
void
moduleInitModulesSystem
(
void
)
{
moduleUnblockedClients
=
listCreate
();
server
.
loadmodule_queue
=
listCreate
();
modules
=
dictCreate
(
&
modulesDictType
,
NULL
);
/* Set up the keyspace notification susbscriber list and static client */
moduleKeyspaceSubscribers
=
listCreate
();
moduleKeyspaceSubscribersClient
=
createClient
(
-
1
);
...
...
@@ -3907,7 +3903,6 @@ void moduleFreeModuleStructure(struct RedisModule *module) {
zfree
(
module
);
}
void
moduleUnregisterCommands
(
struct
RedisModule
*
module
)
{
/* Unregister all the commands registered by this module. */
dictIterator
*
di
=
dictGetSafeIterator
(
server
.
commands
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录