Redis 慢查询
# Redis 慢查询
同MySQL一样,Redis也有慢查询日志的功能。
# 慢查询配置
在redis.conf
中可以配置和慢查询日志相关的选项:
#执行时间超过多少 微秒 的命令请求会被记录到日志上 0 :全记录 <0 不记录
slowlog-log-slower-than 10000
#slowlog-max-len 存储慢查询日志条数
slowlog-max-len 128
此外,也可以通过config set
进行临时设置:
config set slowlog-log-slower-than 微秒
config set slowlog-max-len 条数
# 查询慢日志
通过指令slowlog get [n]
查看:
127.0.0.1:6379> config set slowlog-log-slower-than 1 # 查看一条
OK
127.0.0.1:6379> set k2 testSlow
OK
127.0.0.1:6379> slowlog get 1
1) 1) (integer) 3 # 日志的唯一标识符(uid)
2) (integer) 1648643481 # 命令执行时间戳
3) (integer) 3 # 命令执行的时长(微秒)
4) 1) "set" # 命令详情
2) "k2"
3) "testSlow"
5) "127.0.0.1:52470"
6) ""
# 慢查询定位&处理
使用slowlog get
可以获得执行较慢的redis命令,针对该命令查询出来的结果进行优化,优化建议:
- 尽量使用短的key,对于value有些也可精简,能使用int就int。
- 避免使用keys *、hgetall等全量操作。
- 减少大key的存取,打散为小key
- 有可能是RDB在持久化过程导致Redis性能下降,这个时候考虑关闭持久化或者使用AOF持久化。
- 想要一次添加多条数据的时候可以使用管道
- 尽可能地使用哈希存储
- 尽量限制Redis使用的内存大小,这样可以避免redis使用swap分区或者出现OOM错误内存与硬盘的swap
# 慢查询记录的保存
Redis使用列表存储慢查询日志,采用队列方式(FIFO)。
在redisServer
中保存和慢查询日志相关的信息:
struct redisServer {
// ...
// 下一条慢查询日志的 ID
long long slowlog_entry_id;
// 保存了所有慢查询日志的链表
FIFO list *slowlog;
// 服务器配置 slowlog-log-slower-than 选项的值
long long slowlog_log_slower_than;
// 服务器配置 slowlog-max-len 选项的值
unsigned long slowlog_max_len;
// ...
};
slowlog 链表保存了服务器中的所有慢查询日志, 链表中的每个节点都保存了一个 slowlogEntry 结构, 每个 slowlogEntry 结构代表一条慢查询日志:
typedef struct slowlogEntry {
// 唯一标识符
long long id; // 命令执行时的时间,格式为 UNIX 时间戳
time_t time; // 执行命令消耗的时间,以微秒为单位
long long duration; // 命令与命令参数
robj **argv; // 命令与命令参数的数量
int argc;
} slowlogEntry;
上次更新: 5/30/2023, 11:42:20 PM