(四)Redis的其他功能——瑞士军刀
四、瑞士军刀Redis的其他功能
1.慢查询
客户端请求的一个完整生命周期

- 慢查询发生在第三阶段
- 客户端超时不一定慢查询(因为有4个阶段),但慢查询是客户端超时的一个可能原因
两个配置:
- slowlog-max-len
1. 先进先出队列- 队列固定长度:通过slowlog-max-len设置长度
- 保存在内存内
![]()
- slowlog-log-slower-than
- 慢查询阈值(单位:微秒)
- slowlog-log-slower-than=0,记录所有命令
- slowlog-log-slower-than<0,不记录任何命令
配置方法
- 默认值:
- config get slowlog-max-len = 128
- config get slowlog-log-slower-than = 10000
- 修改配置文件重启
- 不推荐
- 动态配置
- config set slowlog-max-len 1000
- config set slowlog-log-slower-than 10000
慢查询命令
- slowlog get [n]:获取慢查询队列
- slowlog len:获取慢查询队列长度
- slowlog reset:清空慢查询队列
运维经验
- slowlog-max-len:不要设置过小,默认是128,通常设置1000左右。防止历史的慢查询被丢掉,不利于分析历史问题。
- slowlog-log-slower-than:不要设置过大,默认10ms,通常设置1ms。和Redis的QPS有关,如果设置的太大,可能记录不到已经对性能产生影响的查询
- 理解命令生命周期
- 定期持久化慢查询
2.流水线
批量网络通信模型:

什么是流水线:将一批命令进行打包,传输给服务器,然后把结果打包返回给客户端。(减少网络传输的时间消耗)

对比:
| 命令 | N个命令操作 | 1次pipeling(n个命令) |
|---|---|---|
| 时间 | n次网络+n次命令 | 1次网络+n次命令 |
| 数据量 | 1条命令 | n条命令 |
注意:
- Redis的命令是微秒级别的
- pipeline每次条数要控制(太多的网络传输一样耗时)
Jedis中pipeline的实现


注意:pipeline传输到服务器后,不是原子性的,它的执行会被拆分,但是最终的结果是会打包一起返回。
使用建议
- 注意每次pipeline携带数据量
- pipeline每次只能作用在一个Redis节点上
3.发布订阅
- 角色:
- 发布者(publisher)
- 订阅者(subscriber)
- 频道(channel)
- 模型:
- API:
- publish(发布命令)publish channel message
- subscribe(订阅)subscribe [channel] #一个或多个频道
- subscribe(订阅)unsubscribe [channel] #一个或多个频道
- 其他API:
- psubscribe [pattern...] 订阅某种模式的频道
- punsubscribe [pattern...] 退订指定模式的频道
- pubsub channels #列出至少有一个订阅者的频道
- pubsub numsub [channel...] 列出给定频道的订阅者数量
- pubsub numpat 列出被订阅模式的数量(即订阅的频道里有几种模式)
4.消息队列模型

使用list来实现发布消息,使用阻塞的获取来“抢”消息。
5.位图Bitmap

API
- setbit key offset value 给位图指定索引设置值(offset从0开始)
- getbit key offset 获取位图指定索引的值
- bitcount key [start end] 获取位图指定范围(start到end,单位为字节)中位值为1的个数
- bitop op destKey key [key...] 做多个Bitmap的and、or、not、xor操作,并将结果保存到destKey中
- bitops key targetBit [start][end] 计算位图指定范围中第一个偏移量对应的值等于targetBit的位置
实战
独立用户统计:

||一天|一个月|一年|
|:---:|:----:|:----:|
|set|200M|6G|72G|
|Bitmap|12.5M|375M|4.5G|
但是:
如果只有10万个独立用户:
| 数据类型 | 每个userId使用空间 | 需用存储的用户量 | 全部内存量 |
|---|---|---|---|
| set | 32位 | 1,000,000 | 4MB |
| Bitmap | 1位 | 100,000,000 | 12.5MB |
使用经验
- type=string,最大512MB
- 注意setbit时的偏移量,可能有较大耗时
- 位图不是绝对好
6.HyperLogLog
做什么:
- 基于HyperLogLog算法:以极小的空间完成独立数量统计
- 本质还是字符串
API:
- pfadd key element [element...] 向hyperloglog添加元素
- pfcount key [key...] 计算hyperloglog的独立总数
- pfmerge destKey sourceKey [sourceKey...] 合并多个hyperloglog
使用示例:


使用经验
- 具有错误率(错误率:0.81%)
- 是否需要单条数据:没办法取出单条数据
- 可能只能用在仅统计独立用户数的场景中
7.GEO
GEO:地理信息定位,存储经纬度,计算两地距离,范围计算等。
API:
- geoadd key longitude latitude member [longitude latitude member...] 增加地理位置信息
- geopos key member [member...] 获取地理位置信息
- geodist key member1 member2 [unit] 获取两个地理位置的距离,单位有m、km、mi(英里)、ft(尺)
- georadius key longitude latitude radius m|km|ft|mi [withcoord][withdist][withhash][COUNT count][asc|desc][store key][storedist key]
- georadiusbymember key member radius m|km|ft|mi [withcoord][withdist][withhash][COUNT count][asc|desc][store key][storedist key] 获取指定位置范围内的地理位置信息集合
- withcoord:返回结果中包含经纬度
- withdist:返回结果中包含距离中心节点的距离
- withhash:返回结果中包含geohash
- COUNT count:指定返回结果的数量
- asc|desc:返回结果按照与中心节点的距离升序或者降序
- store key:将返回结果的地理位置信息保存到指定键
- storedist key:将返回结果距离中心节点的距离保存到指定键
相关说明:
- since 3.2+
- type geoKey = zset
- 没有提供删除API,使用zrem key member来删除



浙公网安备 33010602011771号