目录前言1. 二进制位数组1.1 位数组的表示1.2 GETBIT 命令的实现1.3 SETBIT 命令的实现1.4 BITECOUNT 命令的实现1.5 BITOP 命令的实现2. 慢查询日志2.1 慢查询记录的保存2.2 慢查询日志的
参考资料:《Redis设计与实现 第二版》;
第三部分为独立功能的实现,主要由以下模块组成:发布订阅、事务、Lua 脚本、排序、二进制位数组、慢查询日志、监视器;
本篇将介绍 Redis 的二进制位数组、慢查询日志和监视器。Redis 提供了一些命令操作二进制位数组;通过 SLOWLOG 相关命令可以对慢查询日志进行操作;通过 MONITOR 命令可以进入监视器模式;
与本章相关的 Redis 命令总结在下篇文章,欢迎点击收藏,本篇将不再重复:
《Redis常用命令及示例总结(API)》:https://blog.csdn.net/dlhjw1412/article/details/119713214
GETBIT key offset
命令;byte
值表示位数组的哪个字节;bit
值表示在 byte
下标字节的第几个二进制位;offfset
偏移量指定的二进制位;SETBIT key offset value
命令;
1)计算 len=offset/8+1;len
值表示 offset
指定的二进制位至少需要多少字节;
2)根据 len 值进行扩展新空间,如果原位数组长度够则不扩展;
3)计算 byte=offset/8;byte
值表示位数组的哪个字节;
4)计算 bit=(offset mod 8)+1;bit
值表示在 byte
下标字节的第几个二进制位;
5)根据 byte 和 bit 的值定位 offfset 偏移量指定的二进制位 oldvalue
,并修改;
6)向客户端返回二进制位 oldvalue
的值;
无扩展操作的 SETBIT 命令示例如下:
带扩展操作的 SETBIT 命令示例如下:
遍历算法:
查表法:
variable-precision SWAR 算法:
又称:计算汉明重量法;
一个处理 32 位长度位数的算法示例:
uint32_t swar(unit32_t i){
//步骤1:按每2个二进制位为一组分组,各组的十进制为汉明重量
i = (i & 0x55555555) + ((i >> 1) & 0x55555555);
//步骤2:按每4个二进制位为一组分组,各组的十进制为汉明重量
i = (i & 0x33333333) + ((i >> 2) & 0x33333333);
//步骤3:按每8个二进制位为一组分组,各组的十进制为汉明重量
i = (i & 0x0F0F0F0F) + ((i >> 4) & 0x0F0F0F0F);
//步骤4
i = (i*(0x01010101) >> 24);
return i;
}
一个示例如下:
BITOP 命令的所有操作都是使用 C 语言内置的位操作来实现的;
BITOP 命令 | C语言操作 | 说明 |
---|---|---|
BITOP AND | & | 逻辑与 |
BITOP OR | | | 逻辑或 |
BITOP XOR | ^ | 逻辑异或 |
BITOP NOT | ~ | 逻辑非 |
Redis 的慢查询日志功能用于记录执行时间超过给定时长的命令请求,用户可以通过这个功能产生的例子来监视和优化查询速度;
服务器配置有两个和慢查询日志相关的选项:
slowlog-log-slower-than
选项:指定执行时间超过多少毫秒的命令请求会被记录到日志上;slowlog-max-len
选项:指定服务器最多保存多少条慢查询日志。采用先进先出的方式;使用 SLOWLOG 相关命令可以操作慢查询日志;
服务器状态中包含与慢查询日志功能相关的属性:
struct redisServer{
//...
// 下一条慢查询日志的 ID
long long slowlog_entry_id;
// 保存了所有慢查询日志的链表
list *slowlog;
// 服务器配置 slow_log_slower_than 选项的值
long long slow_log_slower_than;
// 服务器配置 slowlog_max_len 选项的值
unsigned long slowlog_max_len;
};
slowlog
链表结构如下:
typedef struct slowlogEntry{
// 唯一标识符
long long id;
// 命令执行时的时间,格式为 UNIX 时间戳
time_t time;
// 执行命令消耗的时间,以微秒为单位
long long duration;
// 命令与命令参数
robj **argv;
// 命令与命令参数的数量
int arGC;
} slowlogEntry;
SLOWLOG GET [number]
;打印所有 slow log ,最大长度取决于 slowlog-max-len 选项的值;SLOWLOG LEN
;查看当前日志的数量。其值为 slowlog 链表的长度;SLOWLOG RESET
;清除所有慢查询日志;slowlog-max-len
选项的值,那么多出来的日志会被删除;REDIS_MONITOR
标识会被打开,该客户端会被添加到 monitors
链表的表尾;monitors
链表里;monitors
链表,将相关信息发送给监视器;--结束END--
本文标题: Redis | 第10章 二进制数组、慢查询日志和监视器《Redis设计与实现》
本文链接: https://lsjlt.com/news/8981.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-10-23
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0