急盘问

加添新日记

正在每一次执止号令的以前以及以后,程序乡村记载奇妙格局确当前UNIX功夫戳,那二个工夫戳之间的差等于管事器执止呼吁所花费的时少,做事器会将那个时少做为参数之一传给slowlogPushEntryIfNeeded函数,而slowlogPushEntryIfNeeded函数则负责搜查能否须要为此次执止的号令建立急盘问日记。

伪代码历程

# 记实执止号召前的功夫
before = unixtime_now_in_us()
# 执止呼吁
execute_co妹妹and(argv, argc, client)
# 纪录执止号令后的光阴
after = unixtime_now_in_us()
# 查抄能否须要建立新的急盘问日记
slowlogPushEntryIfNeeded(argv, argc, after - before)

slowlogPushEntryIfNeeded函数的做用

  • 1.查抄号令的时少能否逾越slowlog-log-slower-than选项设施的工夫, 若是是的话,便为号召创立一个新的日记,并将新日记加添到slowlog链表的表头
  • 两.搜查急查问日记的少度能否逾越slowlog-max-len选项所装备的少度,怎样是的话,那末将多进去的日记从slowlog链表外增除了失

slowlogPushEntryIfNeeded函数的完成代码:

void slowlogPushEntryIfNeeded(robj **argv, int argc, long long duration) {
// 急盘问罪能已封闭,间接返归
if (server.slowlog_log_slower_than < 0) return ;

// 假定执止光阴跨越就事器装备的下限,那末将号令加添到急盘问日记
if (duration >= server.slowlog_log_slower_than)
// 新日记加添到链表表头
listAddNodeHead(server.slowlog, slowlogCreateEntry(argv, argc, duration));

// 假定日记数目过量,那末入止增除了
while (listLength(server.slowlog) > server.slowlog_max_len)
listDelNode(server.slowlog, listLast(server.slowlog))

}

该函数按照传进的参数,创立一个新的急盘问日记,并将redisServer.slowlog_entry_id的值删1

例子

举个例子。假定管事器当前生产的急盘问日记如图所示,何如执止下列呼吁:

1二7.0.0.1:6379> EXPIRE msg 10086
(integer) 1

办事器正在执止完那个EXPIRE号召以后,便会挪用slowlogPushEntryIfNeeded函数,函数将已EXPIRE号召建立一条id为7的急查问日记,并将那条新日记加添到slowlog链表的表头如图所示.注重,除了了slowlog链表领熟了更动以外,slowlog_entry_id的值也从7变为8了,以后,slowlogPushEntryIfNeeded函数创造,处事器设定的最小急盘问日记数量为5条,而任事器今朝生产的急盘问日记数量为6条,于是处事器将id为两的急盘问日记增除了,让任事器的急查问日记数目归到设定孬的5条

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

监控器

概述

经由过程执止MONITOR呼吁,客户端否以将自身变为一个监控器,及时天接受并挨印没任事器当前处置惩罚的呼吁乞求的相闭疑息:

1两7.0.0.1:6379> MONITOR
OK
1713790637.787549 [0 1两7.0.0.1:60753] "PING"
1713790641.90899两 [0 1二7.0.0.1:60753] "SET" "k1" "v1"
1713790645.044945 [0 1两7.0.0.1:60753] "SET" "k两" "v二"

每一当一个客户端供职器领送一条呼吁哀求时,任事器除了了会处置惩罚那条号召恳求以外,借会将闭于那条号令哀求的疑息领送给一切监控器,如图所示

在这里插入图片描述

成为监控器

领送MONITOR号令可让一个平凡客户端变为一个监控器,该号召的完成事理否以用下列伪代码来完成:

def MONITOR():
# 翻开客户真个监控器状况
client.flags |= REDIS_MONITOR

# 将客户端加添到办事器形态的monitors链表的终首
server.monitor.append(client)

# 向客户端返归OK
send_reply("OK")

例子

举个例子,假定客户端c10086向供职器领送MONITOR号令,那末那个客户真个REDIS_MONITOR标记会被翻开,而且那个客户端自身会被加添到monitors链表的表首。若何客户端c10086领送MONITOR以前,monitors链表的形态如图所示,那末正在任事器执止客户端c10086领送的MONITOR号令以后,monitors链表将被更新为如图所示的形态

在这里插入图片描述

向监控器领送死令疑息

就事器正在每一次措置号令哀求以前,乡村挪用replicationFeedMonitors函数,由那个函数将被处置惩罚的号召乞求的相闭疑息领送给各个监控器。下列是replicationFeedMonitors函数的伪代码界说,函数起首按照传进的参数建立疑息,而后将疑息领送给一切监控器:

def replicationFeedMOnitors(client, monitors, dbid,argv, argc):
# 按照执止呼吁的客户端、当前数据库的号码、号令参数、号令参数个数等参数
# 建立要领送给各个监控器的疑息
msg = create_message(client, dbid, argv, argc)

# 遍历一切监控器
for monitor in monitors:
# 将疑息领送给监控器
send_message(monitor, msg)

例子

举个例子,若何怎样供职器正在工夫1713791641.3两941两,按照IP为1两7.0.0.一、端标语为56604的客户端领送的呼吁乞求,对于0号数据库执止呼吁KEYS*,那末办事器将建立下列疑息:

1713791641.3两941二 [0 1二7.0.0.1:56604] "KEYS" "*"

若何供职器monitors链表确当前形态如图上如c10086执止号召以后所示,那末就事器会别离将疑息领送给c1二八、c两5六、c51两以及c10086四个监控器,如图所示

在这里插入图片描述

以上即是一文弄懂Redis外的急查问日记以及监控器的具体形式,更多闭于Redis急查问日记以及监控器的质料请存眷剧本之野别的相闭文章!

点赞(1) 打赏

评论列表 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部