美文网首页
Redis其他特性和功能

Redis其他特性和功能

作者: hbhey | 来源:发表于2020-04-16 16:04 被阅读0次

    慢查询

    定义

    慢查询日志帮助开发和运维人员定位系统存在的慢操作。慢查询日志就是系统在命令执行前后计算每条命令的执行时间,当超过预设阀值,就将这条命令的相关信息(慢查询ID,发生时间戳,耗时,命令的详细信息)记录下来,可将其持久化到磁盘中供开发人员分析。

    客户端请求生命周期

    请求生命周期.png

    慢查询是一个先进先出的队列,该队列固定长度,保存在内存中。若一条命令在第三阶段的执行过程中被判断为慢查询,则会进行该队列。

    慢查询配置

    慢查询.png
    1. slowlog-log-slower-than: 命令是否是慢查询的界定条件(阈值),单位微秒,例如超过10毫秒就认为该命令是慢查询,= 0 是代表记录所有命令,< 0 不记录任何命令,默认:10000。
    2. slowlog-max-len: 慢查询列表的固定长度,默认:128
    3. slowlog list: 指明有哪些慢查询
    4. 参数配置:
      • 修改配置文件
      • 动态配置:config set slowlog-max-len 1000

    慢查询命令

    1. slowlog get [n] # 获取慢查询队列, n 指明获取几个慢查询记录
    2. slowlog len # 获取慢查询队列长度
    3. slowlog reset # 清空慢查询队列

    注意事项

    1. slowlog-max-len:线上环境建议调大慢查询日志的列表,记录慢查询日志时Redis会对长命令做截断操作,并不会占用大量内存。增大慢查询列表可以减缓慢查询被剔除出列表的可能性。例如线上可以设置为1000以上。
    2. slowlog-log-lower-than:需要根据redis的并发量调整该值。由于redis采用单线程,对于高流量的场景,如果执行命令的时间在1毫秒以上,那么redis最多可支撑OPS(每秒操作次数)不到1000,因此高OPS场景的redis建议设置为1毫秒。
    3. 慢查询日志是一个先进先出队列,慢查询较多的情况下,可能会丢失部分慢查询命令,可以定期执行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();
    

    注意事项

    1. 注意每次pipeline携带数据量
    2. pipeline每次只能作用在一个Redis节点上
    3. M操作(mset)是原子操作,pipeline命令非原子操作。

    发布订阅

    发布订阅模型

    发布订阅.png

    API

    1. publish channel message # 发布者向对应频道发布消息, 返回订阅者数量
      e.g., publish sohu:tv "hello!"
    2. subscribe [channel] # 订阅一个或多个频道
    3. unsubscribe [channel] # 取消订阅一个或多个频道
    4. psubscribe [pattern..] # 订阅一个或多个符合给定模式的频道
      e.g., psubscribe it* # 将会订阅以it开头的频道
    5. punsubscribe [pattern..] # 取消订阅一个或多个符合给定模式的频道
    6. pubsub channels # 列出至少有一个订阅者的频道
    7. pubsub numsub [channels..] # 列出给定频道的订阅者数量

    与消息队列的区别

    发布订阅时,所以订阅者都可以收到发布者的信息,而消息队列是消息订阅者从消息队列中取消息,不保证每个消息订阅者都可以得到消息。

    位图

    定义

    位图(也称为位数组,位向量等)是紧凑存储位的数组数据结构。redis提供了对位的操作。


    位图.png

    特征

    位数组是自动扩展的,如果超出现有内容范围,它会自动将位数组进行零扩充。


    位图特征.png

    API

    1. setbit key offset value # 给位图指定偏移量设置值
    2. getbit key offset # 得到指定偏移量的值
    3. bitcount key [start end] # 获取位图指定范围(start - end, 单位为字节, 不指定则代表获取全部)位值位1的个数
    4. bitop op destkey key[key…] # 对多个位图进行 and (交集),or(并集),not(非),xor(异或)操作,并把结果保存在 destkey 中
    5. bitpos key targetBit [start] [end] #计算位图指定范围(start-end, 单位为字节, 不指定则代表获取全部)第一个值等于 targetBit 的偏移量

    注意事项

    1. Type = String, 最大512MB
    2. 注意setbit时的偏移量,可能损耗大
    3. 活跃用户统计/用户的签到等等应用都有奇效

    HyperLogLog

    定义

    基于HyperLogLog算法,极小空间完成独立数量(基数)统计。本质还是字符串。
    基数统计:一个集合(注意:这里集合的含义是 Object 的聚合,可以包含重复元素)中不重复元素的个数。例如集合 {1,2,3,1,2},它有5个元素,但它的基数/Distinct 数为3。

    API

    1. pfadd key element [element.. # 向hyperloglog添加元素
    2. pfcount key [key… # 计算hyperloglog的独立总数
    3. pfmerge destkey sourcekey[sourcekey… # 合并多个hyperloglog

    注意事项

    1. 存在错误率 - 0.81%
    2. 不能取出单条数据
    3. 鉴于 HyperLogLog 不保存数据内容的特性,所以,它只适用于一些特定的场景。例如计算日活、月活数据等等

    GEO - redis 3.2+支持

    定义

    GEO: 地理信息定位,存储经纬度,计算两地距离,范围计算等。redis的geo实现采用数据结构为zset

    API

    1. geoadd key longitude latitude member [longitude latitude member.. # 增加地理位置信息
      e.g., geoadd city:location 116.28 39.55 bejing
    2. geopos key member [member.. # 获取地理位置信息
    3. geolist key member1 member2 [unit] # 获取两个地理位置的距离 unit: m, km, mi, ft
    4. georadius


      GEO.png
    5. zrem key member # edis的geo实现采用数据结构为 zset,遂可以使用zset API进行删除

    参考资料

    [1] https://coding.imooc.com/class/151.html

    相关文章

      网友评论

          本文标题:Redis其他特性和功能

          本文链接:https://www.haomeiwen.com/subject/ztxdvhtx.html