Lazy loaded image
学习笔记
📑2、Redis其他功能
字数 1663阅读时长 5 分钟
2022-5-2
2026-1-8
type
status
date
slug
summary
tags
category
icon
password

02 | Redis其他功能

一、慢查询

1. 生命周期

notion image
  • 发送命令
  • 排队
  • 执行命令
  • 返回结果
慢查询发生在第三阶段;客户端超时不一定慢查询,但慢查询时客户端超时的一个可能因素

2. 两个配置

slowlog-max-len
  • 慢查询是一个先进先出的队列,假如一条命令在第三步时被列入慢查询的范围,就会被记录进一个队列
  • 这个记录队列是固定长度的,也就是说这个记录队列满了后,最先被记录的慢查询就会被丢弃
  • 这些记录都保存在内存中,重启Redis后,记录会丢失
slowlog-log-slower-than
  • 慢查询阈值,超过了这个阈值就会被记录到慢查询队列中(单位:微秒, 1毫秒=1000微秒)
  • slowlog-log-slower-than=0, 记录所有命令
  • slowlog-log-slower-than<0, 不记录任何命令
配置方法
默认值:
  • config get slowlog-max-len=128
  • config get slowlog-log-slower-than=10000
修改配置文件重启
动态配置:
  • config set slowlog-max-len 1000
  • config get slowlog-log-slower-than 1000

3. 慢查询命令

  • slowlog get [n]:获取慢查询队列
  • slowlog len: 获取慢查询队列长度
  • slowlog reset: 清空慢查询队列

4. 经验

  • showlog-max-len 不要设置过大,默认10ms,通常设置1ms
  • slowlog-log-slower-than 不要设置过小,通常设置1000左右
  • 定期持久化慢查询(慢查询队列存放在内存中,并且是一个先进先出的队列)

二、pipeline

1. 批量网络命令通信模型

notion image
 
Redis命令时间是非常快的,所以优化网络时间可以优先减少命令延时。我们可以用mgetmset这样的命令一次获取或一次设置多条记录,但是Redis没有提供一次操作多个hset这样的操作,或者我们想同时执行gethget也没办法直接实现。
所以就有了pipeline,它可以将一批命令打包,发送给server,server批量计算,然后按顺序批量发送给client
notion image
 
Tips:
  • Redis的命令时间是微秒级别
  • pipeline每次条数要控制(网络)
举个例子:
北京到上海市1300km,光速是30000km/s,光纤传输速度约等于光速的2/3
一条命令的传输时间:

2. 与m操作对比

  • m操作是一个原子操作
  • pipeline会将命令进行拆分,非原子操作

3. 使用建议

  • 注意每次pipeline携带数据量
  • pipeline每次只能作用在一个Redis节点上
  • 理解M操作与pipeline的区别

三、发布订阅

1. 角色

  • 发布者(publisher)
  • 订阅者(subscriber)
  • 频道(channel)
注意:没有消息堆积的功能,历史消息,后续订阅的订阅者无法获取
publish
subcriber
unsubscribe
其他API:
psubscribe [pattern...] # 订阅模式punsubscribe [pattern...] # 退订指定的模式pubsub channels # 列出至少有一个订阅者的频道pubsub numsub [channel] # 列出给定频道的订阅者数量

2. 消息队列 与 发布订阅

  • 消息队列是消费者去队列中抢消息,只有一个消费者获得消息
  • 发布订阅是所有订阅者都会获得发布的消息

四、Bitmap

notion image
在Redis中,可以直接操作位

1. API

setbit
notion image
所以在做 setbit 操作时,不要在很短的位图上,突然偏移量非常大
 
getbit
bitcount
bitop
bitpos

2. 独立用户统计

  • 使用set和bitmap
  • 假如有1亿用户,5千万独立访问
notion image
  • 如果只有10万独立用户
notion image

3.Tips

  • bitmap其实就是一个string,最大512MB
  • 对于大部分使用场景512MB可以满足,无法满足的情况下,可以将key进行拆分,使用多个key实现这个功能
  • 注意setbit时的偏移量,可能有较大耗时
  • 位图不是绝对的好

五、HyperLogLog

  • 基于HyperLogLog算法:极小空间完成独立数量统计
  • 本质还是字符串

1. API

pfadd
pfcount
pfmerge

2. 百万独立用户

3.Tips

  • 是否能容忍错误?(错误率:0.81%)
  • 是否需要单条数据?(无法取出单条数据)

六、GEO

GEO:地理信息定位,存储经纬度,一般用于计算两地距离、范围计算等

1. 应用场景

  • 微信摇一摇
  • 计算周边酒店、餐馆

2. 五个城市经纬度

notion image
 

3. API

geoadd
geopos
geodist
georadius: 获取指定位置范围内的地理位置信息集合

4. Tips

  • geo在redis 3.2版本提供
  • geo本质是zset类型
  • 没有删除API:zrem key member
上一篇
如何刷LeetCode
下一篇
Git 使用指北