1、慢查询
1、慢查询配置
slowlog-log-slower-than
: 10000 (默认值,单位微秒),超过 10 毫秒的语句就会被记录下来。slowlog-max-len
: 128(默认值),Redis 内部使用列表来保存慢查询日志。
lowlog-log-slower-than
= 0, 会记录所有命令。
lowlog-log-slower-than
< 0, 不会记录任何命令。
配置方式:
- 修改配置文件 redis.conf。
- 动态修改
|
|
- 慢查询命令
|
|
2、最佳实践
参数 slowlog-max-len
,建议调大日志列表,比如 1000以上;参数 slowlog-log-slower-than
,默认超过 10ms 就判断为慢查询,如果每条命令执行时间在 1ms 以上,则 1s 的并发量不足 1000,所以对于高 OPS 场景设置为 1ms。
慢查询只记录命令执行时间,不包括命令排队和网络传输时间。
慢查询日志只是一个先进先出的队列,如果查询较多,可能会丢失日志数据,可以利用 SLOWLOG GET
命令将日志存入 mysql 中,也可以利用开源工具 CacheCloud。
2、Redis shell
1、redis-cli 命令
- -x 参数
|
|
- -c 参数
集群参数,防止 moved 和 asked 异常。
- –rdb 参数
请求 Redis 实例生成 RDB 文件,保存在本地。
- –bigkeys 参数
选出大 key,这些 key 可能是系统瓶颈。
- –eval 参数
运行 lua 脚本。
- latency 参数
- –latency: 客户端与主机延迟 。
- –latency-history: 分时段展示延迟,用
-i
参数来指定,默认为 15s。 - –latency-dist: 统计图表形式展示延迟。
- –stat 参数
实时获取 Redis 重要统计信息,信息比 info
命令少。
2、redis-server 命令
- –test-memory 参数
|
|
3、redis-benchmark 命令
用来做基准性能测试。
|
|
3、Pipeline
1、pipeline 概念
redis 执行一条命令可以分为四个过程:
- 发送命令
- 命令排队
- 执行命令
- 返回结果
其中 1. 和 4. 称为 RTT (往返时间)。
pipeline 可以将一组 redis 命令通过一次 RTT 发给 Redis,再按照执行结果返回给客户端。
redis-cli 脚本的 –pipe 选项就是使用 pipeline 机制。
2、性能测试
pipeline 执行速度一般比逐条执行快,客户端与服务端网路延时越大,效果越明显。
3、原生批量和 pipeline
- 原生批量命令是原子的,pipeline 不是原子的(中间可以执行其他命令)。
- 原生批量命令是一个命令对应多个 key, pipeline 支持多个命令。
- 原生批零命令是 Redis 服务端实现的,pipeline 是客户端和服务端共同实现的。
4、最佳实践
- pipeline 封装的数据不能过多,即大数据可以拆分为批量的小 pipeline 命令。
- pipeline 只能操作一个 Redis 实例。
4、事务与Lua
为了保证多个命令组合的原子性,Redis 提供了简单事务功能和 lua 脚本。
1、事务
|
|
- 命令错误,会导致事务执行失败,比如
set a 1
写成了sett a 1
。 - 运行时错误,redis 不支持回滚,比如
sadd a 1
写成了zadd a 1 b
,假设 a 这个 key 已经存在,就会抛出错误。
事务简单主要原因就是,redis 不支持回滚。
2、Lua
在 Redis 中使用 Lua,有两种方式 eval
和 evalsha
。
- eval
|
|
如果 Lua 脚本较长,可以使用 redis-cli –eval 选项来执行。
- evalsha
使用 eval 命令,每次都需要将脚本发送到服务端,使用 evalsha
命令就避免了开销。
|
|
- lua 中使用 redis API
|
|
也可以使用 redis.pcall
命令,两者差别在于 pcall 命令会忽略错误继续执行,call 遇到错误停止。
lua 脚本执行是原子性的,中间不会插入别的命令。
- 管理 lua 脚本命令
|
|
5、Bitmaps
1、数据结构模型
Bitmaps 不是一种数据结构,实际上它是字符串,但它可以对字符串的位进行操作,你可以想象一个以位为单位的数组,每个单元只能存储 0 和1。
2、命令
- 设置值
|
|
- 获取值
|
|
- Bitmaps 间的运算
|
|
- 获取第一个为 bit 的 offset 值
|
|
3、分析
利用 Bitmaps 来统计网站访问用户:
|
|
set 和 bitmaps 对比:
数据类型 | 每个用户 id 占用空间 | 需要存储用户量 | 全部内存量 |
---|---|---|---|
set | 64 位 | 5 千万 | 64 位 * 5 千万 = 400 MB |
bitmaps | 1 位 | 1 亿 | 1 位 * 1 亿 = 12.5 MB |
从表格可以看出 bitmaps 节省内存。
但如果每天的活跃用户很少,set 可能比 bitmaps 好,因为 set 需要内存 64 位 * 10 万 = 800 KB,而 bitmap 还是需要 12.5 MB 内存。
6、HyperLogLog
HyperLoglog 不是一种新的数据结构,而是一种基数算法,可以利用极小的内存空间完成独立总数统计,数据集可以 ID、Email、IP。
- 命令
|
|
注意:
- 只是计算独立总数,不需要获取单条数据
- HyperLogLog 有误差
7、发布订阅
Redis 提供发布/订阅模式的消息机制。
- 命令
|
|
注意:
- Redis 提供的消息机制,无法实现消息堆积、回溯
- 消息队列的优点:异步、解耦、削峰,缺点:复杂度提高。
8、GEO
Redis 提供了 GEO(地址位置)功能,支持存储地理位置信息。
- 添加位置信息
|
|
- 获取位置信息
|
|
- 获取两个地理位置的距离
|
|
- 获取指定范围内的地理位置集合
|
|
- 获取 geohash
|
|
- 删除地理位置
|
|