文章目录
- 开篇
- 慢查询日志
- 慢查询日志服务端配置
- 动态配置
- 慢查询日志结构草图:
- 慢查询使用分析:
- 发布-订阅功能实现
- 工作原理:
- 发布订阅使用
- pipeline的使用
- 使用原理
- 位图(Bitmaps)
- 实现
- 使用
- Hyperloglog
- Geo使用
- Geo原理
开篇
慢查询日志
redis的慢查询日志功能用于记录执行时间超过指定时长的命令。
下图描述了一次命令的生命周期,而慢查询工作在第三阶段
慢查询日志服务端配置
slowlog-log-slower-than | (单位是微秒,指定超过执行时间的命令会被记录到慢查询日志上) |
slowlog-max-len | 指定服务器最多保存多少慢查询日志(因为慢查询日志保存的队列是有界的) |
动态配置
config set slowlog-log-slower-than 0
// =0 则代表我们想要统计所有命令的执行时间,因为客户端没有给出命令
//>0 则会记录指定时间的命令
//<0 则不记录任何命令
config set slowlog-max-len 5
//指定慢查询日志记录队列为5,慢查询日志记录队列用先进先出链表实现,若达到队列上限,则最先进入队列的日志将会被删除
慢查询日志结构草图:
慢查询日志节点:
慢查询使用分析:
获取慢查询日志
slowlog get n
慢查询日志重置:
slowlog reset
慢查询日志长度:
slowlog len
慢查询记录的只是命令的执行时间,并不包括命令排队与网络传输时间,因此客户端执行命令时间会远大于实际执行命令时间,如果客户端存在等待超时的话,根据命令执行排队的原理,那么可以检查慢查询日志是否存在慢查询导致客户端命令执行阻塞,而引起慢查询导致的命令级联阻塞。
发布-订阅功能实现
工作原理:
客户端可以订阅一个或多个频道,每当有客户端向被订阅频道发送消息时,频道的所有订阅者都会收到这条消息。
发布订阅使用
// 在频道上发布消息
publish channel message
// 订阅1或多个频道
subscribe channel channel1
//取消订阅
unsubscribe channel channel1
//模式订阅
psubscribe [pattern] eg:psubscribe music.*
//取消模式订阅
punsubscribe [pattern]
// 列出至少有1个订阅者的频道
pubsub channels
// 列出给定频道订阅者的数量
pubsub numsub channel
// 列出被订阅模式的数量
pubsub numpat
pipeline的使用
使用原理
pipeline将一组redis命令进行组装,通过一次网络传输,传输给redis,在将这组redis命令的执行结果按顺序返回给客户端。
使用方式:在高级语言客户端中使用pipeline。redis-cli --pipe
pipeline与原生批量命令的对比:
1:原生批量命令是原子的,而pipeline是非原子的
2:原生批量命令是一个命令对应多个key,pipeline可以支持传输多个命令
3:原生批量命令是redis服务端支持实现的,而pipeline需要服务端和客户端的共同实现。
位图(Bitmaps)
实现
Bitmaps本质上是字符串,可以用bitmaps对字符串的位进行操作。
Bitmaps是一个以位为单位的数组,数组的每个单元只能存储0和1,数组的下标在bitmaps中叫做偏移量。
使用
//设置键的第offset位的value
setbit key offset value
//获取offset的value
getbit key offset
//获取Bitmaps指定范围值为1的个数
bitcount key [start end] start与end为字节
//bitmaps集合间的运算
bitop op destkey key1 key2
eg:与运算:bitop and dkey key1 key2
或运算: bitop or dkey key1 key2
非:not 异或:xor
//计算bitmaps中第一个值为targetBit的偏移量
eg:计算第一个值为1的偏移量
bitpos key 1
深入学习bitmaps可以研究不同命令的实现算法,这些在以后可以深入讨论。
Hyperloglog
Hyperloglog基于Hyperloglog算法,利用极小空间数完成独立数量统计
本质上还是字符串
//向hyperloglog添加元素
pfadd key element [elemrnt2]
// 计算hyperloglog的独立总数
pfcount key [key1]
// 合并多个hyperloglog
pfmerge destkey sourcekey [sourcekey]
Hyperloglog缺点:
hyperloglog并不是很精确,在测试情况下,插入100万条数据,根据所得可以发现错误率为0.81%,并且每次pfcount得到数据还不一样。
第二点就是我们没办法得到hyperloglog里面的单条数据。
Geo使用
Geo原理
Geo地理信息定位,存储经纬度,计算两地距离,范围计算。
使用范例:
城市 | 经度 | 纬度 | 简称 |
北京 | 116.28 | 39.55 | beijing |
天津 | 117.12 | 39.08 | tianjing |
唐山 | 118.01 | 39.38 | tangshan |
// 添加地理信息
geoadd key 经度 纬度 成员名称
//获取成员地理为孩子信息
geopos key member
// 获取两个地理位置的距离
geodist key member1 member2 unit(m,km,mi(英里),ft(尺))