Redis-HyperLogLog&事务&Pipeline


  • HyperLogLog 操作命令
    • pfadd key element [element …]
      • pfadd 用于向HyperLogLog 添加元素,如果添加成功返回1
    • pfcount key [key …]
      • pfcount 用于计算一个或多个 HyperLogLog 的独立总数
      • 统计结果会出现误差(0.81%的失误率)
    • pfmerge destkey sourcekey [sourcekey ... ]
      • pfmerge 可以求出多个HyperLogLog 的并集并赋值给destkey
  • HyperLogLog 数学原理:基于概率论中伯努利试验并结合了极大似然估算方法,并做了分桶优化
  • HyperLogLog 实现
    • HyperLogLog 占据12KB (占用内存为=16834 * 6 / 8 / 1024 = 12K) 的大小
      • 共设有 16384 个桶,每个桶有 6 位,每个桶可以表达的最大数字是:25+24+...+1 = 63 ,二进制为:111 111
    • 对于命令:pfadd key value
      • 在存入时,value 会被 hash 成64 位,即64 bit 的比特字符串,前14 位用来分桶(分了 16384 个桶),剩下50 位用来记录第一个1 出现的位置
      • 分桶:假设一个字符串的前 14 位是:00 0000 0000 0010 ,其十进制值为 2。那么 value 对应转化后的值放到编号为 2 的桶
      • value:剩下的50位找第一个1出现的位置,转成二进制存入找到的桶中
        • 不同的 value,会被设置到不同桶中去
        • 如果出现了在同一个桶的,即前 14 位值是一样的,但是后面出现 1 的位置不一样
          • 那么比较原来的index 是否比新index 大。是,则替换。否,则不变
    • 最终,一个 key 所对应的 16384 个桶都设置了很多的 value ,每个桶有一个 k_max
      • 调用 pfcount 时,按照调和平均数进行估算,同时加以偏差修正,便可以计算出 key 的设置了多少次 value,也就是统计值
      • 同时,在具体的算法实现上,HLL 还有一个分阶段偏差修正算法
  • Redis 只提供了弱事务,不提供回滚(能不用尽量不用)
    • 命令本身有错,会回滚
    • 但是命令没错,执行报错,不会回滚
    • watch 实现乐观锁机制
  • Redis 事务和pipline的区别
    • pipline是客户端行为,非原子,降低网络开销,某条命令失败后不影响后续命令的执行
    • 事务是服务端行为
      • 用户执行MULTI 命令时,服务器会将对应这个用户的客户端对象设置为一个特殊的状态,在这个状态下后续用户执行的查询命令不会被真的执行,而是被服务器缓存起来,直到用户执行EXEC 命令为止,服务器会将这个用户对应的客户端对象中缓存的命令按照提交的顺序依次执行
  • 尽量使用pipline,尽量不用事务,可以用LUA保证事务原子性
    • EVAL script numkeys key [key ...] arg [arg ...]

文章作者: 钱不寒
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 钱不寒 !
  目录