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
  • 相关阅读:
    hdu 4710 Balls Rearrangement()
    hdu 4707 Pet(DFS水过)
    hdu 4706 Children's Day(模拟)
    hdu 4712 Hamming Distance(随机函数暴力)
    csu 1305 Substring (后缀数组)
    csu 1306 Manor(优先队列)
    csu 1312 榜单(模拟题)
    csu 1303 Decimal (数论题)
    网络爬虫
    Python处理微信利器——itchat
  • 原文地址:https://www.cnblogs.com/richiewlq/p/12183371.html
Copyright © 2011-2022 走看看