(四)Redis的其他功能——瑞士军刀

四、瑞士军刀Redis的其他功能

1.慢查询

客户端请求的一个完整生命周期

  • 慢查询发生在第三阶段
  • 客户端超时不一定慢查询(因为有4个阶段),但慢查询是客户端超时的一个可能原因

两个配置:

  1. slowlog-max-len
    1. 先进先出队列
    1. 队列固定长度:通过slowlog-max-len设置长度
    2. 保存在内存内

  1. slowlog-log-slower-than
    1. 慢查询阈值(单位:微秒)
    2. slowlog-log-slower-than=0,记录所有命令
    3. 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 set slowlog-log-slower-than 10000

慢查询命令

  1. slowlog get [n]:获取慢查询队列
  2. slowlog len:获取慢查询队列长度
  3. slowlog reset:清空慢查询队列

运维经验

  • slowlog-max-len:不要设置过小,默认是128,通常设置1000左右。防止历史的慢查询被丢掉,不利于分析历史问题。
  • slowlog-log-slower-than:不要设置过大,默认10ms,通常设置1ms。和Redis的QPS有关,如果设置的太大,可能记录不到已经对性能产生影响的查询
  • 理解命令生命周期
  • 定期持久化慢查询

2.流水线

批量网络通信模型:


什么是流水线:将一批命令进行打包,传输给服务器,然后把结果打包返回给客户端。(减少网络传输的时间消耗)


对比:

命令 N个命令操作 1次pipeling(n个命令)
时间 n次网络+n次命令 1次网络+n次命令
数据量 1条命令 n条命令

注意:

  • Redis的命令是微秒级别的
  • pipeline每次条数要控制(太多的网络传输一样耗时)

Jedis中pipeline的实现



注意:pipeline传输到服务器后,不是原子性的,它的执行会被拆分,但是最终的结果是会打包一起返回。

使用建议

  • 注意每次pipeline携带数据量
  • pipeline每次只能作用在一个Redis节点上

3.发布订阅

  • 角色:
    • 发布者(publisher)
    • 订阅者(subscriber)
    • 频道(channel)
  • 模型:
  • API:
    • publish(发布命令)publish channel message
    • subscribe(订阅)subscribe [channel] #一个或多个频道
    • subscribe(订阅)unsubscribe [channel] #一个或多个频道
  • 其他API:
    • psubscribe [pattern...] 订阅某种模式的频道
    • punsubscribe [pattern...] 退订指定模式的频道
    • pubsub channels #列出至少有一个订阅者的频道
    • pubsub numsub [channel...] 列出给定频道的订阅者数量
    • pubsub numpat 列出被订阅模式的数量(即订阅的频道里有几种模式)

4.消息队列模型


使用list来实现发布消息,使用阻塞的获取来“抢”消息。

5.位图Bitmap

API

  • setbit key offset value 给位图指定索引设置值(offset从0开始)
  • getbit key offset 获取位图指定索引的值
  • bitcount key [start end] 获取位图指定范围(start到end,单位为字节)中位值为1的个数
  • bitop op destKey key [key...] 做多个Bitmap的and、or、not、xor操作,并将结果保存到destKey中
  • bitops key targetBit [start][end] 计算位图指定范围中第一个偏移量对应的值等于targetBit的位置

实战

独立用户统计:


	||一天|一个月|一年|
	|:---:|:----:|:----:|
	|set|200M|6G|72G|
	|Bitmap|12.5M|375M|4.5G|

但是:
如果只有10万个独立用户:

数据类型 每个userId使用空间 需用存储的用户量 全部内存量
set 32位 1,000,000 4MB
Bitmap 1位 100,000,000 12.5MB

使用经验

  • type=string,最大512MB
  • 注意setbit时的偏移量,可能有较大耗时
  • 位图不是绝对好

6.HyperLogLog

做什么:

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

API:

  • pfadd key element [element...] 向hyperloglog添加元素
  • pfcount key [key...] 计算hyperloglog的独立总数
  • pfmerge destKey sourceKey [sourceKey...] 合并多个hyperloglog

使用示例:



使用经验

  • 具有错误率(错误率:0.81%)
  • 是否需要单条数据:没办法取出单条数据
  • 可能只能用在仅统计独立用户数的场景中

7.GEO

GEO:地理信息定位,存储经纬度,计算两地距离,范围计算等。

API:

  • geoadd key longitude latitude member [longitude latitude member...] 增加地理位置信息
  • geopos key member [member...] 获取地理位置信息
  • geodist key member1 member2 [unit] 获取两个地理位置的距离,单位有m、km、mi(英里)、ft(尺)
  • georadius key longitude latitude radius m|km|ft|mi [withcoord][withdist][withhash][COUNT count][asc|desc][store key][storedist key]
  • georadiusbymember key member radius m|km|ft|mi [withcoord][withdist][withhash][COUNT count][asc|desc][store key][storedist key] 获取指定位置范围内的地理位置信息集合
    • withcoord:返回结果中包含经纬度
    • withdist:返回结果中包含距离中心节点的距离
    • withhash:返回结果中包含geohash
    • COUNT count:指定返回结果的数量
    • asc|desc:返回结果按照与中心节点的距离升序或者降序
    • store key:将返回结果的地理位置信息保存到指定键
    • storedist key:将返回结果距离中心节点的距离保存到指定键

相关说明:

  • since 3.2+
  • type geoKey = zset
  • 没有提供删除API,使用zrem key member来删除
posted @ 2020-05-23 22:20  scnb  阅读(122)  评论(0)    收藏  举报