zoukankan      html  css  js  c++  java
  • 4.瑞士军刀Redis

    4

    慢查询 找到系统瓶颈命令

    • 生命周期
      • 发送命令-》 排队 -》 执行命令 -》 返回结果
      • 两点说明
        • 慢查询发生在第三阶段
        • 客户端超时不一定慢查询,但慢查询是客户端超时的一个可能因素
    • 两个配置

      • slowlog-max-len 队列长度
        • 先进先出队列
        • 固定长度
        • 保存在内存
      • slowlog-log-slower-than
        • 慢查询阀值(单位:微秒)
        • 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 set slowlog-log-slower-than 10000
    • 三个命令

      • slowlog get [n] 获取慢查询队列
      • slowlog len 获取慢查询队列长度
      • slowlog reset 清空慢查询队列
    • 运维经验
      • slowlog-log-slower-than 不要设置过大 默认10ms 通常设置1ms
      • slowlog-max-len 不要设置过小 通常设置1000左右
      • 理解命令生命周期
      • 定期持久化慢查询

    pipeline 提高客户端的效率

    • 什么是流水线

      • 1次时间 = 1次网络时间 + 1次命令时间
      • n次时间 = n次网络时间 + n次命令时间 mget mset
      • but not hmset hmset
      • 1次pipline = 1次网络时间 + n次命令时间
      命令N个命令操作1次pipline(n个命令)
      时间 n次网络+n次命令 1次网络 + n次命令
      数据量 1条命令 n条命令
      • Redis的命令时间是微秒级别
      • pipeline每次条数要控制 (网络)

    pipline-jedis实现

    • maven依赖 10000 此命令 通过双层for循环进行拆分发送
    • jedis.pipelined()
    • pipeline.hset("hashkey:"+i,"field"+i,"value"+i);
    • pipeline.syncAndReturnAll()
    • 与原生的M操作相比pipeline非原子操作,m是原子操作

    • 使用建议

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

    发布订阅

    角色

    • 发布者 publisher
    • 订阅者 subcriber
    • 频道 channel

    模型 无法消息堆积

    • 发布者 --发布消息 redis-cli
      • redis server 频道
        • 订阅者 redis-cli
        • 订阅者 redis-cli
        • 订阅者 redis-cli

    API

    • publish
      • publish channel message
        • publish sohu:tv "hello world"
        • 3 # 订阅者数量
    • subscribe 订阅
      • subscribe [channel] #一个或多个
        • subscribe sohu:tv
    • unsubscribe
      • unsubscribe [channel] #一个或多个
        • unsubscribe sohu:tv
    • 其他
      • psubscribe [pattern..] 订阅模式
      • punsubscribe [pattern..] 退订指定模式
      • pubsub channels # 列出至少有一个订阅者的频道
      • pubsub numsub [channel] # 列出给定频道的订阅者数量

    发布订阅和消息队列

    • 发布订阅所有的客户端都能收到
    • 消息订阅对于消息有那个客户端抢到了消息 其他客户端就收不到这个消息了

    总结

    • 发布订阅模式中的角色
    • 重要的API

    Bitmap 提供节省内存的方案 位图

    位图

    • setbit key offset value # 给位图指定索引设置值
    • getbit key offset
    • bitcount key [start end] # 获取位图指定范围位值为1的个数
    • bitop op destkey key [key] 做多个bitmap的and or not xor操作并将结果保存在destkey中
    • bitpos key tagetBit [start] [end]
    • 计算位图指定范围第一个偏移量对应的值等于targetBit位置

    相关命令

    独立用户统计

    • 使用set Bitmap

    1亿用户 5千万独立

    数据类型每个userid占用空间需要存储的用户量全部存储量
    set 32位(建设userid用的是整形,实际很多网站用的是长整形) 50,000,000 32位*50,000,00=200MB
    bitmap 1位 100,000,000 1位*100,000,000=12.5MB

    对比

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

    10万独立用户

    数据类型每个userid占用空间需要存储的用户量全部存储量
    set 32位(建设userid用的是整形,实际很多网站用的是长整形) 1,000,000 32位*1,000,00=4MB
    bitmap 1位 100,000,000 1位*100,000,000=12.5MB

    使用经验

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

    HyperLogLog 使用极小的内存实现独立用户的统计

    • 新型数据结构
      • 本质还是字符串
    • 三个命令
      • pfadd key element [element..] : 向HyperLogLog添加元素
      • pfcount key [key..] 计算HyperLogLog的独立总数
      • pfmerge destkey sourcekey [sourcekey..] 合并多个hyperloglog
      • demo
        • pfadd 2019_03_06:unique:ids "uuid-1" "uuid-2" "uuid-3" "uuid-4"
        • pfcount 019_03_06:unique:ids 4
        • pfadd 2019_03_06:unique:ids "uuid-1" "uuid-2" "uuid-3" "uuid-90"
        • pfcount 019_03_06:unique:ids 5
    • 内存消耗 百万独立用户 | | 内存消耗| |-|-| |1天|15KB| |1个月|450KB| |1年|15KB*365=5MB|
    • 使用经验
      • 是否能容忍错误 错误率:0.81%
      • 是否需要单挑内存

    GEO 地理信息

    GEO是什么

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

    5个城市经纬度

    城市经度纬度简称
    北京 116.28 39.55 beijing
    天津 117.12 39.08 tianjin
    石家庄 114.29 38.01 shijiazhuang
    唐山 118.01 39.38 tangshan
    保定 115.29 38.51 baoding

    相关命令

    • geoadd key longitude latitude member

      • 命令行代码

        geoadd cities:locations 116.28 39.55 beijing
        geoadd cities:locations 117.12 39.08 tianjin
        geoadd cities:locations 114.29 38.01 shijiazhuang
        geoadd cities:locations 118.01 39.38 tangshan
        geoadd cities:locations 115.29 38.51 baoding

    • geodist key member1 member2 [unit]
      • 获取两个地理位置的距离
      • unit m km mi(英里)ft(尺)
    • georadius key logitude latitude radiusm|km|ft|mi [withcoord] [withdist] [withhash] [COUNT count] [asc|desc] [store key] [storedist key]
    • georradiusbymember key member radiusm|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 将返回结果距离中心节点的距离保存到指定key

    georadiusbymember cities:locations beijing 150km 距离北京150km范围内的城市

    相关说明

    • since 3.2+
    • type geoKey = zset
    • 没有删除API: zrem key member
  • 相关阅读:
    tesseract的简单使用
    快速添加请求头
    1010. 一元多项式求导 (25)
    1009. 说反话 (20)
    1008. 数组元素循环右移问题 (20)
    1007. 素数对猜想 (20)
    1006. 换个格式输出整数 (15)
    素数判断
    1002. 写出这个数 (20)
    1005. 继续(3n+1)猜想 (25)
  • 原文地址:https://www.cnblogs.com/richiewlq/p/12183371.html
Copyright © 2011-2022 走看看