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

posted @ 2022-12-18 22:43  雪梨大佬  阅读(19)  评论(0编辑  收藏  举报