加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

一文带你了解 Redis 的慢日志相关底层原理

发布时间:2019-12-21 04:52:47 所属栏目:编程 来源:站长网
导读:副标题#e# 相信很多小伙伴在使用 Redis 的时候都知道 Redis 有相关慢日志的查询功能,并且多多少少都看过。那 Redis 底层到底是如果创建慢日志以及慢日志的结构是什么样子的呢?这篇文章就带大家认识一下。我们先看一张慢日志的截图 使用slowlog get 2命令查

一文带你了解 Redis 的慢日志相关底层原理

image-20191211220858341

slowlogEntry 实体的相关字段含义如下:

id: 标识慢日志的唯一 ID

time: 命令执行的时间戳

duration: 命令执行是耗时,单位为微妙

agrv: 命令和参数数组

argc: 命令和参数的个数

如上图就表示了在执行命令set number 520 发生了慢日志,命令执行耗时 10 微秒。

04、操作慢日志

知道了慢日志的存储结构,我们就需要考虑在执行命令的时候,如何根据条件去创建慢日志。

首先我们需要在命令的执行前后记录时间戳,然后相减计算出命令的执行耗时,然后根据 Redis 服务器配置slowlog-log-slower-than 进行对比,决定是否记录慢日志,另外在记录慢日志的时候需要根据slowlog_max_len 值判断是否要删除最久的日志信息。伪代码如下:

//1. 记录命令执行前的时间戳 

long before = now(); 

//2. 执行命令 

execute(argv, argc); 

//3. 记录命令执行后的时间戳 

long after = now(); 

//4. 调用创建慢日志函数 

slowlogPushEntryIfNeed(argv, argc, after - before); 

slowlogPushEntryIfNeed 函数主要用来判断是否插入数据,以及是否删除旧数据。

void slowlogPushEntryIfNeed(robj **argv, int argc, long long duration) { 

//1. 判断是否开启慢日志 

if (server.slowlog_log_slower_than < 0) return; 

//2. 如果超时,则插入慢日志 

  if (duraton > server.slowlog_log_slower_than){ 

    //插入 

  } 

  while (listLength(server.slowlog) > server.slowlog_max_len) { 

    //删除 

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读