Redis其他特性和功能
2020-04-16 本文已影响0人
hbhey
慢查询
定义
慢查询日志帮助开发和运维人员定位系统存在的慢操作。慢查询日志就是系统在命令执行前后计算每条命令的执行时间,当超过预设阀值,就将这条命令的相关信息(慢查询ID,发生时间戳,耗时,命令的详细信息)记录下来,可将其持久化到磁盘中供开发人员分析。
客户端请求生命周期
请求生命周期.png慢查询是一个先进先出的队列,该队列固定长度,保存在内存中。若一条命令在第三阶段的执行过程中被判断为慢查询,则会进行该队列。
慢查询配置
慢查询.png- slowlog-log-slower-than: 命令是否是慢查询的界定条件(阈值),单位微秒,例如超过10毫秒就认为该命令是慢查询,= 0 是代表记录所有命令,< 0 不记录任何命令,默认:10000。
- slowlog-max-len: 慢查询列表的固定长度,默认:128
- slowlog list: 指明有哪些慢查询
- 参数配置:
- 修改配置文件
- 动态配置:config set slowlog-max-len 1000
慢查询命令
- slowlog get [n] # 获取慢查询队列, n 指明获取几个慢查询记录
- slowlog len # 获取慢查询队列长度
- slowlog reset # 清空慢查询队列
注意事项
- slowlog-max-len:线上环境建议调大慢查询日志的列表,记录慢查询日志时Redis会对长命令做截断操作,并不会占用大量内存。增大慢查询列表可以减缓慢查询被剔除出列表的可能性。例如线上可以设置为1000以上。
- slowlog-log-lower-than:需要根据redis的并发量调整该值。由于redis采用单线程,对于高流量的场景,如果执行命令的时间在1毫秒以上,那么redis最多可支撑OPS(每秒操作次数)不到1000,因此高OPS场景的redis建议设置为1毫秒。
- 慢查询日志是一个先进先出队列,慢查询较多的情况下,可能会丢失部分慢查询命令,可以定期执行slow get命令将慢查询日志持久化到其他存储中,然后制作可视化界面查询。
pipeline
定义
利用pipeline可以一次从发送多条命令(打包),在服务端执行之后,在把结果一次性返回,节省了命令/结果在网络中的传输时间。若没有使用pipeline,n次命令的操作,要额外花费n-1网络时间,因为redis的命令执行都是微秒级别,所以网络时间通常是瓶颈所在。
pipeline.png pipeline2.png
使用
Pipeline pipeline = jedis.pipelined();
pipeline.set("product","computer");
pipeline.set("producttwo","microwave");
pipeline.syncAndReturnAll();
注意事项
- 注意每次pipeline携带数据量
- pipeline每次只能作用在一个Redis节点上
- M操作(mset)是原子操作,pipeline命令非原子操作。
发布订阅
发布订阅模型
发布订阅.pngAPI
-
publish channel message # 发布者向对应频道发布消息, 返回订阅者数量
e.g., publish sohu:tv "hello!" - subscribe [channel] # 订阅一个或多个频道
- unsubscribe [channel] # 取消订阅一个或多个频道
-
psubscribe [pattern..] # 订阅一个或多个符合给定模式的频道
e.g., psubscribe it* # 将会订阅以it开头的频道 - punsubscribe [pattern..] # 取消订阅一个或多个符合给定模式的频道
- pubsub channels # 列出至少有一个订阅者的频道
- pubsub numsub [channels..] # 列出给定频道的订阅者数量
与消息队列的区别
发布订阅时,所以订阅者都可以收到发布者的信息,而消息队列是消息订阅者从消息队列中取消息,不保证每个消息订阅者都可以得到消息。
位图
定义
位图(也称为位数组,位向量等)是紧凑存储位的数组数据结构。redis提供了对位的操作。
位图.png
特征
位数组是自动扩展的,如果超出现有内容范围,它会自动将位数组进行零扩充。
位图特征.png
API
- setbit key offset value # 给位图指定偏移量设置值
- getbit key offset # 得到指定偏移量的值
- bitcount key [start end] # 获取位图指定范围(start - end, 单位为字节, 不指定则代表获取全部)位值位1的个数
- bitop op destkey key[key…] # 对多个位图进行 and (交集),or(并集),not(非),xor(异或)操作,并把结果保存在 destkey 中
- bitpos key targetBit [start] [end] #计算位图指定范围(start-end, 单位为字节, 不指定则代表获取全部)第一个值等于 targetBit 的偏移量
注意事项
- Type = String, 最大512MB
- 注意setbit时的偏移量,可能损耗大
- 活跃用户统计/用户的签到等等应用都有奇效
HyperLogLog
定义
基于HyperLogLog算法,极小空间完成独立数量(基数)统计。本质还是字符串。
基数统计:一个集合(注意:这里集合的含义是 Object 的聚合,可以包含重复元素)中不重复元素的个数。例如集合 {1,2,3,1,2},它有5个元素,但它的基数/Distinct 数为3。
API
- pfadd key element [element.. # 向hyperloglog添加元素
- pfcount key [key… # 计算hyperloglog的独立总数
- pfmerge destkey sourcekey[sourcekey… # 合并多个hyperloglog
注意事项
- 存在错误率 - 0.81%
- 不能取出单条数据
- 鉴于 HyperLogLog 不保存数据内容的特性,所以,它只适用于一些特定的场景。例如计算日活、月活数据等等
GEO - redis 3.2+支持
定义
GEO: 地理信息定位,存储经纬度,计算两地距离,范围计算等。redis的geo实现采用数据结构为zset
API
- geoadd key longitude latitude member [longitude latitude member.. # 增加地理位置信息
e.g., geoadd city:location 116.28 39.55 bejing - geopos key member [member.. # 获取地理位置信息
- geolist key member1 member2 [unit] # 获取两个地理位置的距离 unit: m, km, mi, ft
-
georadius
GEO.png - zrem key member # edis的geo实现采用数据结构为 zset,遂可以使用zset API进行删除