3《Redis DevOps》三:小功能大用处-常用工具
## 概述
1. 慢查询分析,找到有问题的命令进行优化
2. Redis Shell
3. Pipeline,提高客户端性能
4. 事务与Lua脚本,自定义原子命令
5. Bitmaps,字符串的位操作,节省内存
6. HyperLogLog,基于概率的新算法,极其节省内存空间
7. 发布订阅
8. GEO,3.2版本之后,基于地理位置的信息
## 慢查询分析
> 系统在命令执行前后计算命令的执行时间,当超过阈值时记录该命令执行的发生时间、耗时等详细信息
Redis客户端执行命令有4个步骤:
1. 发送命令
2. 命令排队
3. 命令执行
4. 返回结果
慢查询仅统计步骤3的时间。
每个慢查询日志有4个属性:
1. 标识id
2. 命令耗时
3. 执行命令
4. 参数
### 配置参数
- slowlog-log-slower-than 预设阈值,单位为微秒(1s=1000ms=1 000 000us)
- showlog-max-len 最多存储多少条;使用有序队列列表来实现,先进先出
### 常用命令
- 获取慢查询日志 slowlog get [n]
- 慢查询列表当前长度 slowlog len
- 慢查询日志重置 slowlog reset
## Redis Shell
### redis-cli
命令行
### redis-server
启动或关闭功能,此外,--test-memory检测当前系统能否稳定分配指定容量的内存给Redis
### redis-benchmark
做基准性能测试
## Pipeline
### 基本功能
将一组Redis命令进行组装,通过一次网络传输,即一次RTT(往返时间,Round Trip Time,发送命令+返回结果的时间和)传输到Redis,再将执行结果按照顺序返回给客户端。
### 性能测试结论
- Pipeline 执行速度一般比逐条执行快
- 客户端与网络延时较大时,效果最为明显
### 原生批量命令与Pipeline的区别
1. 原生批量是原子的,Pipeline非原子
2. 原生批量是处理一个命令对应多个key,Pipeline支持多个命令
3. 原生批量是服务器端支持实现的,Pipeline需要服务器端与客户端共同实现
## 事务与Lua
> 目的:支持多条命令的原子性
### 事务
> 一组动作,要么全执行,要么全部不执行
Redis实现的事简单的事务,不支持事务的回滚特性,同时无法实现命令之间的逻辑关系计算。
### Lua
> 脚本语言,由C语言实现,简单小巧同时功能强大。
1. 数据结构,booleans/numbers/strings/tables
2. 函数定义,以function开头,以end结尾
```lua
function funcName()
...
end
```
3. redis 中使用Lua
1) eval 脚本内容 key个数 key列表 参数列表
2) evalsha,首先将脚本上传到服务端,得到SHA1校验和;evalsha命令使用SHA1的值作为参数可直接执行Lua脚本。
4. 使用Lua脚本的好处
1) 原子执行多条命令
2) 定制命令,常驻内存中,实现复用
3) 多条命令一次传输,减少网络开销
5. Redis管理Lua脚本
1) script load
2) script exists sha1 [sha1 ...]
3) script flush,用于清除已加载的所有脚本
4) script kill,杀掉正在执行的脚本
### Bitmaps
> 实现对位的操作,本质为字符串,可理解为以位为单位的数组,每个单元只能存储0或1,数组下标即为偏移量。
1. 常用命令
1) 设置值
setbit key offset value
2) 获取值
getbit key offset
3) 获取指定范围内1的个数
bitcount key [start end]
4) Bitmaps之间的运算
bitop op destkey key [key ...]
5) 计算Bitmaps中第一个值为targetBit的偏移量
bitpos key targetBit [start] [end]
### HyperLogLog
> 不是新的数据结构,本质为字符串类型,是一种基数算法,可利用极小的内存空间完成独立总数的统计。
1. 添加 pfadd key element [element ...]
2. 计算独立用户数 pfcount key [key ...]
3. 合并 pfmerge destkey sourcekey [sourcekey ...]
4. 注意事项:
1. 只为了计算独立总数,不需要获取单个数据
2. 有一定的误差率(官方给出0.81%),极其节省内存空间
### 发布/订阅
> 基于“发布-订阅”模式的消息机制,发布者与订阅者不会直接通信。
>
> 发布者向指定频道(channel)发布消息,订阅者都可以收到消息。
1. 发布消息 publish channel mesage
2. 订阅消息 subscibe channel [channel ...]
1. 执行订阅后进入订阅状态,只能接收 subscibe/psubscribe/unsubscribe/punsubscribe
2. 新开启的订阅客户端无法接收频道之前的消息,因为Redis不会对已发布的消息做持久化
3. 取消订阅 unsubscribe channel [channel ...]
4. 按照模式订阅和取消订阅 psubscribe pattern [pattern ...]、punsubscribe pattern [pattern ...]
5. 查询订阅
1. 查看所有活跃的频道 pubsub channels [pattern]
2. 查看频道订阅数 pubsub numsub [channel ...]
3. 查看模式订阅数 pubsub numpat
### GEO
> Redis 3.2版本后支持,GEO,geographic的缩写,即地理信息。该类型,就是元素的二维坐标,在地图上就是经纬度。redis基于该类型,提供了经纬度设置,查询,范围查询,距离查询,经纬度hash等操作。
>
> 底层实现为set。
>
> 常用于实现诸如附近位置、摇一摇等依赖于地理位置信息的功能。
>
> longitude 经度
>
> latitude 纬度
>
> member 成员
1. 增加地理位置
geoadd key longitude latitude member [longitude latitude member ...]
2. 获取地理位置信息
geopos key member [member ...]
3. 获取两个地理位置间的距离
geodist key member1 member2 [unit]
unit 表示返回结果的单位,m:meters,km:kilometers,mi:miles 英里, ft:feet 尺
4. 获取指定位置范围内的地理信息集合 georadius/georadiusbymember
5. 获取geohash
geohash key member [member ...]
6. 删除地理位置信息
zrem key member
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了