一 慢查询
1.1 生命周期
我们配置一个时间,如果查询时间超过了我们设置的时间,我们就认为这是一个慢查询.
慢查询发生在第三阶段
客户端超时不一定慢查询,但慢查询是客户端超时的一个可能因素
1.2 两个配置
1.2.1 slowlog-max-len
慢查询是一个先进先出的队列
固定长度
保存在内存中
1.2.2 slowlog-max-len
慢查询阈值(单位:微秒)
slowlog-log-slower-than=0,记录所有命令
slowlog-log-slower-than <0,不记录任何命令
1.2.3 配置方法
1 默认配置
config get slowlog-max-len=128
Config get slowly-log-slower-than=10000
2 修改配置文件重启
3 动态配置
|
|
1.3 三个命令
|
|
1.4 经验
|
|
二 pipeline与事务
2.1 什么是pipeline(管道)
Redis的pipeline(管道)功能在命令行中没有,但redis是支持pipeline的,而且在各个语言版的client中都有相应的实现
将一批命令,批量打包,在redis服务端批量计算(执行),然后把结果批量返回
1次pipeline(n条命令)=1次网络时间+n次命令时间
|
|
2.2 客户端实现
|
|
2.3 与原生操作对比
|
|
2.4 使用建议
1 注意每次pipeline携带的数据量
2 pipeline每次只能作用在一个Redis的节点上
3 M(mset,mget….)操作和pipeline的区别
2.5 原生事务操作
|
|
三 发布订阅
3.1 角色
发布者/订阅者/频道
发布者发布了消息,所有的订阅者都可以收到,就是生产者消费者模型(后订阅了,无法获取历史消息)
3.2 模型
3.3 API
|
|
3.4 发布订阅和消息队列
发布订阅数全收到,消息队列有个抢的过程,只有一个抢到
四 Bitmap位图
4.1 位图是什么
下面是字符串big对应的二进制(b是98)
4.2 相关命令
|
|
4.3 独立用户统计
1 使用set和Bitmap对比
2 1亿用户,5千万独立(1亿用户量,约5千万人访问,统计活跃用户数量)
数据类型 | 每个userid占用空间 | 需要存储用户量 | 全部内存量 |
---|---|---|---|
set | 32位(假设userid是整形,占32位) | 5千万 | 32位*5千万=200MB |
bitmap | 1位 | 1亿 | 1位*1亿=12.5MB |
假设有10万独立用户,使用位图还是占用12.5mb,使用set需要32位*1万=4MB
4.5 总结
1 位图类型是string类型,最大512M
2 使用setbit时偏移量如果过大,会有较大消耗
3 位图不是绝对好用,需要合理使用
五 HyperLogLog
5.1 介绍
基于HyperLogLog算法:极小的空间完成独立数量统计
本质还是字符串
5.2 三个命令
|
|
5.3 内存消耗&总结
百万级别独立用户统计,百万条数据只占15k
错误率 0.81%
无法取出单条数据,只能统计个数
六 GEO
6.1 介绍
GEO(地理信息定位):存储经纬度,计算两地距离,范围等
北京:116.28,39.55
天津:117.12,39.08
可以计算天津到北京的距离,天津周围50km的城市,外卖等
6.2 5个城市纬度
城市 | 经度 | 纬度 | 简称 |
---|---|---|---|
北京 | 116.28 | 39.55 | beijing |
天津 | 117.12 | 39.08 | tianjin |
石家庄 | 114.29 | 38.02 | shijiazhuang |
唐山 | 118.01 | 39.38 | tangshan |
保定 | 115.29 | 38.51 | baoding |
6.3 相关命令
|
|
6.4 总结
3.2以后版本才有
geo本质时zset类型
可以使用zset的删除,删除指定member:zrem cities:locations beijing
一 持久化的作用
1.1 什么是持久化
redis的所有数据保存在内存中,对数据的更新将异步的保存到硬盘上
1.2 持久化的实现方式
|
|
二 RDB
2.1 什么是RDB
2.2 触发机制-主要三种方式
|
|
2.3 触发机制-不容忽略的方式
|
|
2.4 试验
|
|
三 AOF
3.1 RDB问题
耗时,耗性能:
不可控,可能会丢失数据
3.2 AOF介绍
客户端每写入一条命令,都记录一条日志,放到日志文件中,如果出现宕机,可以将数据完全恢复
3.3 AOF的三种策略
日志不是直接写到硬盘上,而是先放在缓冲区,缓冲区根据一些策略,写到硬盘上
always:redis–》写命令刷新的缓冲区—》每条命令fsync到硬盘—》AOF文件
everysec(默认值):redis——》写命令刷新的缓冲区—》每秒把缓冲区fsync到硬盘–》AOF文件
no:redis——》写命令刷新的缓冲区—》操作系统决定,缓冲区fsync到硬盘–》AOF文件
命令 | always | everysec | no |
---|---|---|---|
优点 | 不丢失数据 | 每秒一次fsync,丢失1秒数据 | 不用管 |
缺点 | IO开销大,一般的sata盘只有几百TPS | 丢1秒数据 | 不可控 |
3.4 AOF 重写
随着命令的逐步写入,并发量的变大, AOF文件会越来越大,通过AOF重写来解决该问题
原生AOF | AOF重写 |
---|---|
set hello world set hello java set hello hehe incr counter incr counter rpush mylist a rpush mylist b rpush mylist c 过期数据 |
set hello hehe set counter 2 rpush mylist a b c |
本质就是把过期的,无用的,重复的,可以优化的命令,来优化
这样可以减少磁盘占用量,加速恢复速度
实现方式
bgrewriteaof:
客户端向服务端发送bgrewriteaof命令,服务端会起一个fork进程,完成AOF重写
AOF重写配置:
配置名 | 含义 |
---|---|
auto-aof-rewrite-min-size | AOF文件重写需要尺寸 |
auto-aof-rewrite-percentage | AOF文件增长率 |
统计名 | 含义 |
---|---|
aof_current_size | AOF当前尺寸(单位:字节) |
aof_base_size | AOF上次启动和重写的尺寸(单位:字节) |
自动触发时机(两个条件同时满足):
aof_current_size>auto-aof-rewrite-min-size:当前尺寸大于重写需要尺寸
(aof_current_size-aof_base_size)/aof_base_size>auto-aof-rewrite-percentage:(增长率)当前尺寸减去上次重写的尺寸,除以上次重写的尺寸如果大于配置中的增长率
重写流程
配置
|
|
3.5 AOF 重写演示
|
|
四 RDB和AOF的选择
4.1 rdb和aof的比较
命令 | rdb | aof |
---|---|---|
启动优先级 | 低 | 高(挂掉重启,会加载aof的数据) |
体积 | 小 | 大 |
恢复速度 | 快 | 慢 |
数据安全性 | 丢数据 | 根据策略决定 |
轻重 | 重 | 轻 |
4.2 rdb最佳策略
rdb关掉,主从操作时
集中管理:按天,按小时备份数据
主从配置,从节点打开
4.3 aof最佳策略
开:缓存和存储,大部分情况都打开,
aof重写集中管理
everysec:通过每秒刷新的策略
4.4 最佳策略
小分片:每个redis的最大内存为4g
缓存或存储:根据特性,使用不通策略
时时监控硬盘,内存,负载网络等
有足够内存
一 子进程开销和优化
1 cpu
开销:rdb和aof文件生成,属于cpu密集型
优化:不做cpu绑定,不和cpu密集型的服务一起部署
2 内存
开销:fork内存开销,copy-on-write,
优化:单机部署尽量少重写
3 硬盘
开销:aof和rdb写入,可以结合分析工具使用
优化:
1 不要和高硬盘负载的服务部署在一起:存储服务,消息队列
2 在aof重写期间,不要对aof进行追加:no-appendfsync-on-rewrite=yes
3 根据写入量决定磁盘类型:例如ssd
4 单机多实例持久化考虑分盘
二 fork操作
1 fork是同步操作
2 与内存量嘻嘻相关:内存越大,耗时越长,跟机型也有关系
3 info:latest_fok_usec:查看持久化执行时间
改善fork
1 有限使用无机或高效支持fork操作的虚拟化技术
2 控制redis实例最大可用内存:maxmemory
3 合理配置linux内存分配策略
4 降低fork频率,例如放宽aof重写自动触发时机,不必要的全量复制
三 aof追加阻塞
aof阻塞:看日志定位
info Persistence:每次阻塞一次就会+1